zoukankan      html  css  js  c++  java
  • 原生ajax异步请求基础知识

    一、同步交互与异步交互的概念:

         * 同步交互:客户端向服务器端发送请求,到服务器端进行响应,这个过程中,用户不能做任何其他事情(只能等待响应完才能继续其他请求).

         * 异步交互:客户端向服务器端发送请求,直到服务器端进行响应,这个过程中,用户可以做其他任何事情(不等);

         同步与异步的区别:

         * 同步交互

           1、执行速度相对比较慢

           2、响应的是完整的HTML页面

         * 异步交互

           1、 执行速度相对比较快

           2、 响应的是部分数据

    二、AJAX的概念:(Asynchronous JavaScript and Xml)--直译中文 - javascript和XML的异步

          (简单理解-->就是客户端与服务器端进行交互,而无需刷新当前页面的技术,称之为Ajax)

         * Ajax实现的是B/S架构下的异步交互

         * 实现异步交互的技术-- <iframe src="">元素

         * Ajax具有核心对象-- XMLHttpRequest对象

    三、实现Ajax的步骤

       * 创建XMLHttpRequest对象

       * 注册监听

       * 建立连接

       * 发送请求

       实现Ajax的六步是什么?(不标准)

       * 创建XMLHttpRequest对象

       * 建立连接

       * 发送请求

       * 注册监听 - onreadystatechange事件

       * 获取服务器端的通信状态 - readyState

       * 获取服务器端的状态码

     1、创建XMLHttpRequest对象的语法:

       function getXhr()

    {

          // 声明XMLHttpRequest对象

         var xhr = null;

          // 根据浏览器的不同情况进行创建

          if(window.XMLHttpRequest)

            {// 表示除IE外的其他浏览器

                  xhr = new XMLHttpRequest();

             }else{ // 表示IE浏览器下创建

                 xhr = new ActiveXObject('Microsoft.XMLHttp');

              }

            return xhr;

       }

       // 调用getXhr()

       var xhr = getXhr();

    2、建立连接:

      * 使用XMLHttpRequest对象的open(method,url)方法

           * 作用 - 与服务器端建立连接

           *参数含义:

                * method - 设置当前请求的类型get/post

                * url - 设置当前请求的地址

    3、向服务器端发送请求:

        *使用XMLHttpRequest对象的send(请求参数)方法:

           * 请求参数的格式 - key=value

    注意:* GET与POST的区别

            * GET请求类型

                 * send()方法不起作用,但是不能被省略;语法:xhr.send(null);

                 * 请求参数 -在url后面写?key=value

           * POST请求类型

                * send()方法起作用,在send()方法被调用前,使用setRequestHeader()方法设置请求头信息

                   xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

    4、注册监听:

        * onreadystatechange事件

           * 作用 - 监听服务器端的通信状态改变

          xhr.onreadystatechange=function()

          {

           }

    5、获取服务器端的通信状态:

        *使用核心对象属性readyState、status

         * readyState - 表示当前服务器端的通信状态

            * 0 - (服务器端)尚未初始化

            * 1 - (服务器端)正在接收

            * 2 - (服务器端)接收完毕

            * 3 - (服务器端)正在响应

            * 4 - (服务器端)响应完毕

         * status --表示当前服务器端的状态码

            * 200 - 请求成功

           * 404 - 网页找不到(请求路径不正确)

           * 500 - 服务器端错误

         if(xhr.readyState==4&&xhr.status==200)

         {

          }

    6、获取响应数据:

         使用XMLHttpRequest对象的responseText属性,接收服务器端的响应数据;

         var data=xhr.responseText;

    4~6步就是接收服务器端响应数据的步骤:

         * 使用XMLHttpRequest对象的onreadystatechange事件,监听服务器端的通信状态

         * 使用XMLHttpRequest对象的readyState属性,判断服务器端的当前状态(4--响应完毕)

         * 使用XMLHttpRequest对象的status属性,判断服务器端的状态码(200--表示请求成功)

         * 使用XMLHttpRequest对象的responseText属性,接收服务器端的响应数据

    demo:(这里省份也可以放在服务器端,通过 window.onload=function(){}在页面加载完后请求服务器关于省份的信息,方法步骤按照上面的4大步写就行)

     1 <!doctype html>
     2 <html>
     3 <head>
     4 <meta charset="UTF-8">
     5 <title>ajax02_二级联动</title>
     6 </head>
     7 <body>
     8     <form>
     9         <select id="province">
    10             <option>请选择</option>
    11         </select>
    12         <select  id="city">
    13             <option>请选择</option>
    14         </select>
    15     </form>
    16     <script>
    17          var  se_province=document.getElementById("province");
    18          var  Pro_city=document.getElementById("city");
    19             //加载页面后显示省份列表内容
    20          window.onload=function(){
    21             var option=province.getElementsByTagName("option");
    22             var arrayProvice=["北京市","广东省","四川省","湖南省","云南省"];
    23             for(var i=0 ;i<arrayProvice.length;i++)
    24             {   //新建option标签
    25                 var option=document.createElement("option");
    26                 //把数组内容放入option里面
    27                 var textNode=document.createTextNode(arrayProvice[i]);
    28                 option.appendChild(textNode);
    29                 //给select标签添加option
    30                 se_province.appendChild(option);
    31             }
    32         }
    33     
    34         se_province.onchange=function(){
    35              //先为city元素的option文本内容情况,防止在多次触发onchange事件时出现城市列表重复添加
    36                var opts=Pro_city.getElementsByTagName("option");
    37                //console.log(opts);
    38                for(var j=opts.length-1;j>0;j--)
    39                {
    40                    Pro_city.removeChild(opts[j]);
    41                }
    42             //alert(se_province.value);
    43             
    44             //判断:如果省份value值是请选择就不会向服务器发送请求,避免生成多余的option标签
    45             if(se_province.value !="请选择"){
    46             //执行ajax异步请求
    47             var xhr=getXhr();
    48             xhr.open("post","ajax02.php",true);
    49             xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");
    50             xhr.send("provcince="+se_province.value);
    51             xhr.onreadystatechange=function(){
    52                 if(xhr.readyState==4&&xhr.status==200)
    53                     //接收服务器端的数据内容
    54                    var data=xhr.responseText;//这里data是字符串
    55                    var citydata=data.split(",");//截断字符串变成数组
    56                     //console.log(data);
    57                   
    58                    for(var i=0;i<citydata.length;i++){
    59                    //新建option标签
    60                    var option=document.createElement("option");
    61                    //把数组内容放入option里面
    62                    var textNode=document.createTextNode(citydata[i]);
    63                    option.appendChild(textNode);
    64                   //给select标签添加option
    65                    Pro_city.appendChild(option);
    66                    
    67                    }
    68             }
    69           }
    70             
    71         }
    72          
    73         //创建XMLHTTPRequest对象, XMLHttpRequest 用于在后台与服务器交换数据
    74       function getXhr(){
    75           var xmlhttp;
    76           if(window.XMLHttpRequest){
    77               xmlhttp=new XMLHttpRequest();
    78           }else{
    79               xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    80           }
    81           return xmlhttp;
    82       } 
    83 </script>
    84 </body>
    85 </html>

    ajax02.php文件代码:

    <?php 
      //接收客户端发送的省份信息
      $province=$_POST["provcince"];
         
         switch($province){
            case "北京市":echo "朝阳区,海淀区,通州区,怀柔区";
            break;
            case "广东省":echo "深圳市,东莞市,广州市,佛山市";
            break;
            case "湖南省":echo "长沙市,湘潭市,邵阳市,岳阳市";
            break;
            case "四川省":echo "成都市,南充市,绵阳市,广元市";
            break;
            case "云南省":echo "昆明市,曲靖市,玉溪市,楚雄市";   
            break;
                 }
    ?>

     <PS:转载请注明出处!>

  • 相关阅读:
    兼容各浏览器,背景透明,内容不透明
    101 个 MySQL 的调节和优化的提示
    二手房买卖砍价最新攻略 帮你花少钱买好房
    “中国互联网100强”(2013)发布
    写入文件,创建xunlei批量任务
    武汉选房
    Java并发编程(十一)线程池的使用
    Retrofit 代理模式
    Java并发编程(十)阻塞队列
    不要在Android的Application对象中缓存数据!
  • 原文地址:https://www.cnblogs.com/cristina-guan/p/7016835.html
Copyright © 2011-2022 走看看