zoukankan      html  css  js  c++  java
  • AJAX 异步交互基本总结

    AJAX (Asynchronous JavaScript and Xml)

    直译中文 - javascript和XML的异步

    同步与异步的区别:
      同步交互
        执行速度相对比较慢
        响应的是完整的HTML页面
      异步交互
        执行速度相对比较快
        响应的是部分数据

    Ajax 的核心对象:
      XMLHttpRequest 对象
    创建 XMLHttpReuqest 对象

     1     function getXhr(){
     2         // 声明XMLHttpRequest对象
     3         var xhr = null;
     4         // 根据浏览器的不同情况进行创建
     5         if(window.XMLHttpRequest){
     6             // 表示除IE外的其他浏览器
     7             xhr = new XMLHttpRequest();
     8         }else{
     9             // 表示IE浏览器
    10             xhr = new ActiveXObject('Microsoft.XMLHttp');
    11         }
    12         return xhr;
    13     }
    14     // 创建核心对象
    15     var xhr = getXhr();

    Ajax 核心对象
      属性:    

        * readyState
          * 0 - (服务器端)尚未初始化
          * 1 - (服务器端)正在接收
          * 2 - (服务器端)接收完毕
          * 3 - (服务器端)正在响应
          * 4 - (服务器端)响应完毕
        * status
          * 200 - 请求成功
          * 404 - 网页找不到(请求路径不正确)
          * 500 - 服务器端错误

      方法:
        * open(method,url)方法
          * 作用 - 与服务器端建立连接
          * 参数
            * method - 设置请求类型(GET或POST)
            * url - 设置请求地址
        * send()方法
          * 作用 - 向服务器端发送请求参数

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

    实现Ajax的异步交互步骤
      1. 创建XMLHttpRequest核心对象
        固定写法 - 独立编写
      2. 与服务器端建立连接
        使用XMLHttpRequest对象的open(method,url)方法
          * method - 设置当前请求的类型
          * url - 设置当前请求的地址
      3. 向服务器端发送请求
        使用XMLHttpRequest对象的send(请求参数)方法
          * 请求参数的格式 - key=value
      4. 接收服务器端的响应数据
        * 使用XMLHttpRequest对象的onreadystatechange事件,监听服务器端的通信状态
        * 使用XMLHttpRequest对象的readyState属性,判断服务器端的当前状态(0-4)
        * 使用XMLHttpRequest对象的status属性,判断服务器端的状态码(200)
        * 使用XMLHttpRequest对象的responseText属性,接收服务器端的响应数据

      示例:

     1     // 实现Ajax的异步交互的步骤
     2     
     3     var btn = document.getElementById("btn");
     4     btn.onclick = function(){
     5         /*
     6          * 1. 实现Ajax主要依靠XMLHttpRequest对象
     7          *   * 创建XMLHttpRequest对象
     8          */
     9         var xhr = getXhr();
    10         /*
    11          * 2. 与服务器端建立连接
    12          *   * open(method,url,async)方法
    13          *     * method - 设置当前的请求类型(GET或POST)
    14          *     * url - 设置当前的请求地址
    15          *     * async - 设置是否异步(Boolean类型)
    16          *       * 默认值为true,表示异步
    17          *       * 官方认为使用XMLHttpRequest对象就是为了实现异步交互的
    18          */
    19         xhr.open("get","01.php?user=zhangwuji");
    20         /*
    21          * 3. 客户端向服务器端发送请求
    22          *   * send(请求参数)方法
    23          *     * 请求参数的格式 - key=value
    24          *   * 如果请求类型为GET方式的话
    25          *     * send()方法是不能向服务器端发送请求数据的
    26          *   * 注意
    27          *     * send()方法是不能被省略的
    28          *       * GET请求类型 - send(NULL);
    29          */
    30         xhr.send(null);
    31         /*
    32          * 4. 客户端接收服务器端的响应
    33          *   * 使用onreadystatechange事件
    34          *     * 监听服务器的通信状态
    35          *   * readyState属性
    36          *     * 得到服务器端当前通信状态
    37          *     * 备选项
    38          *       * 0 尚未初始化
    39          *       * 1 正在接收
    40          *       * 2 接收完成
    41          *       * 3 正在响应
    42          *       * 4 响应完成
    43          *   * status - 状态码
    44          *     * 200 OK
    45          *   * responseText属性
    46          *     * 接收服务器端的数据(HTML格式)
    47          */
    48         xhr.onreadystatechange = function(){
    49             // 保证服务器端响应的数据发送完毕
    50             if(xhr.readyState == 4){
    51                 // 保证这次请求必须是成功的
    52                 if(xhr.status == 200){
    53                     // 接收服务器端的数据
    54                     var data = xhr.responseText;
    55                     // 测试
    56                     console.log(data);
    57                 }
    58             }
    59         }
    60     }
    61 
    62     
    63     // 定义创建XMLHttpRequest对象的函数
    64     function getXhr(){
    65         // 声明XMLHttpRequest对象
    66         var xhr = null;
    67         // 根据不同浏览器创建
    68         if(window.XMLHttpRequest){
    69             // 其他浏览器
    70             xhr = new XMLHttpRequest();
    71         }else{
    72             // IE浏览器(8及之前)
    73             xhr = new ActiveXObject("Microsoft.XMLHttp");
    74         }
    75         // 返回XMLHttpRequest对象
    76         return xhr;
    77     }
    View Code
    <?php
        // 用于处理客户端的Ajax异步请求
        // 1. 接收客户端发送的请求数据
        $user = $_GET['user'];
        // 2. 向客户端进行响应
        echo $user.' get request succesful.';
    ?>
    View Code

    GET 与 POST 的区别:
      GET请求类型
        * send()方法不起作用,但是不能被省略
          xhr.send(null);
        * 请求参数 - 添加到URL?key=value
      POST请求类型
        * send()方法起作用
        * 在send()方法被调用前,使用setRequestHeader()方法设置请求头信息
          xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

    实现Ajax的六步是什么?(不标准)
      1. 创建XMLHttpRequest对象
      2. 建立连接
      3. 发送请求
      4. 注册监听 - onreadystatechange事件
      5. 获取服务器端的通信状态 - readyState
      6. 获取服务器端的状态码

    XML 解析

    XML 语法
      声明:
        <?xml version="1.0" encoding="UTF-8" ?>
      定义元素:
        * 根元素
          * 必须是起始标签
          * 只能定义一个
        * 定义元素
          * 元素名可以自定义
          * 分类
            * 起始标签或单标签
      定义属性

    DOM 解析 XML
      创建 XML 解析器:

     1         function parseXML(xml){
     2             // 声明解析XML后的DOM对象
     3             var xmlDoc = null;
     4             // 根据不同的浏览器
     5             if(window.DOMParser){
     6                 // 其他浏览器
     7                 var parser = new DOMParser();
     8                 xmlDoc = parser.parseFromString(xml,"application/xml");
     9             }else{
    10                 // IE浏览器
    11                 xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    12                 xmlDoc.async = false;
    13                 xmlDoc.loadXML(xml);
    14             }
    15             return xmlDoc;
    16         }

        解析 XML 与解析 HTML 一致

          * 很少使用ById和ByName两个方法
        * 注意
          * 浏览器不允许读取外部的XML文件
          * 浏览器解析符合XML格式的字符串

    Ajax中的XML格式
      * 请求的数据格式 - XML
        * 客户端如何构建符合XML格式的数据
          * 构建的数据类型 - 字符串(string)类型
          * 字符串的内容符合XML格式的语法要求
        * 服务器端如何接收符合XML格式的数据
          * 接收客户端的请求数据 - 字符串(string)类型
          * PHP集成了DOM的相关内容
            * DOMDocument类
            * DOMElement类
            * DOMNode类

      * 响应的数据格式 - XML

        * 服务器端如何构建符合XML格式的数据
          * 设置服务器端的响应头"Content-Type"值为"text/xml"
          * 构建符合XML格式数据内容
            * 手动方式构建字符串(string)内容
            * DOMDocument对象的方法
              * loadXML(符合XML格式的字符串);
              * saveXML()方法进行响应

        * 客户端如何接收符合XML格式的数据

          * 使用XMLHttpRequest对象的responseXML属性接收
          * 接收回来的就是XML DOM对象(不需要使用XML解析器进行解析)
          * 直接使用DOM解析XML DOM对象即可

      示例:

     1     /*
     2      * 创建DOM解析XML的解析器 - 目前
     3      * * IE浏览器
     4      *   new ActiveXObject("Microsoft.XMLDOM");
     5      * * 其他浏览器
     6      *   创建一个DOM的解析器
     7      *   var parser = new DOMParser();
     8      *   使用DOM解析器解析XML文件
     9      *   var xmlDoc = parser.parseFromString(xmlFile,"application/xml");
    10      *
    11      * 当前报错:
    12      * * 目前主流浏览器
    13      *   * 不允许读取本地文件
    14      *   * 不允许读取外部文件
    15      */
    16     function parseXML(xmlFile){
    17         // 创建解析XML后的DOM对象
    18         var xmlDoc = null;
    19         // 根据不同浏览器进行解析
    20         if(window.DOMParser){
    21             // 其他浏览器
    22             var parser = new DOMParser();
    23             xmlDoc = parser.parseFromString(xmlFile,"application/xml");
    24         }else{
    25             // IE浏览器
    26             var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    27             xmlDoc.async = false;
    28             xmlDoc.loadXML(xmlFile);
    29         }
    30         return xmlDoc;
    31     }
    32     /*
    33      * 测试
    34      * 使用DOM的XML解析器 - 解析符合XML格式的字符串
    35      * <user>
    36      *   <name>zhangwuji</name>
    37      * </user>
    38      */
    39     var xmlDoc = parseXML("<user id='u' name='u'><name>zhangwuji</name></user>");
    40     //console.log(xmlDoc);
    41     /*
    42      * DOM解析XML与解析HTML没有任何区别
    43      * * 注意
    44      *   * DOM解析XML使用ById或ByName两个方式
    45      *   * 实际开发中只用getElementsByTagName()方法
    46      *   * 原因 - 属性值在XML格式中都是有效数据
    47      */
    48     var userEle = xmlDoc.getElementsByName("u")[0];
    49     console.log(userEle);
    View Code

      示例:

     1     var btn = document.getElementById("btn");
     2     btn.onclick = function(){
     3         // 实现Ajax的异步交互
     4         var xhr = getXhr();
     5         xhr.open("post","07.php");
     6         xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
     7         /*
     8          * 如何构建符合XML格式的请求数据
     9          * * 注意
    10          *   * 请求数据的格式 - key=value 不能改变的
    11          * * 将value值构建成符合XML格式的数据
    12          *   * 数据类型 - 字符串(string)
    13          *   * 格式符合XML的语法要求
    14          * * 编写注意
    15          *   * 定义变量 - 专门构建XML格式的数据
    16          *   * 在send()方法进行拼串
    17          */
    18         var user = "<user><name>zhangwuji</name><pwd>123456</pwd></user>";
    19         xhr.send("user="+user);
    20         xhr.onreadystatechange = function(){
    21             if(xhr.readyState==4&&xhr.status==200){
    22                 // 接收服务器端的响应数据
    23                 var xmlDoc = xhr.responseXML;
    24                 var nameEle = xmlDoc.getElementsByTagName("name")[0];
    25                 var txtEle = nameEle.childNodes[0];
    26                 console.log(txtEle.nodeValue);
    27             }
    28         }
    29     }
    30     function getXhr(){
    31         var xhr = null;
    32         if(window.XMLHttpRequest){
    33             xhr = new XMLHttpRequest();
    34         }else{
    35             xhr = new ActiveXObject("Microsoft.XMLHttp");
    36         }
    37         return xhr;
    38     }
    View Code
     1 <?php
     2     // 接收客户端发送的请求数据
     3     $user = $_POST['user'];//符合XML格式要求的string类型
     4     //var_dump($user);
     5     // 创建DOMDocument对象
     6     $doc = new DOMDocument();
     7     // 调用loadXML()方法
     8     $result = $doc->loadXML($user);
     9     //var_dump($doc);
    10     
    11     // 如何构建符合XML格式的数据
    12     /* 修改响应头的Content-Type值为"text/xml"
    13     header('Content-Type:text/xml');
    14     echo $user;// 符合XML格式的string类型
    15     */
    16     
    17     header('Content-Type:application/xml');
    18     echo $doc->saveXML();
    19 ?>
    View Code

    JSON (JavaScript Object Notation) 格式
      JSON 数据格式源于 Javascript (JS原生支持)
      JSON 的结构

        * Array - 数组
        * Object - 对象
        * 支持的数据类型
          * String字符串
          * Number数值
          * Boolean - true|false
          * Object
          * Array
          * null  

      Ajax中的JSON格式
        * 请求格式为JSON

          * 客户端向服务器端发送请求为JSON格式的数据
            * 构建符合JSON格式的字符串
            * 保证定义字符串时,使用单引号(里面使用双引号)
          * 服务器端接收JSON格式的数据
            * 接收客户端的数据
            * 使用json_decode()函数进行解析
              json_decode($json,true)   

       * 响应格式为JSON
          * 服务器端向客户端发送响应为JSON格式的数据
            * 使用json_encode()函数将PHP变量(array)转换成符合JSON格式的字符串
          * 客户端接收JSON格式的数据
            * 使用XMLHttpRequest对象的responseText属性接收
              * 没有responseJSON属性
              * 使用eval()函数进行转换

      示例:

     1     var btn = document.getElementById("btn");
     2     btn.onclick = function(){
     3         var xhr = getXhr();
     4         xhr.open("post","10.php");
     5         xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
     6         /*
     7          * 在客户端如何构建JSON格式
     8          * * 构建符合JSON格式的字符串
     9          */
    10         var user = '{"name":"zhangwuji","pwd":"123456"}';
    11         xhr.send("user="+user);
    12         xhr.onreadystatechange = function(){
    13             if(xhr.readyState==4&&xhr.status==200){
    14                 var data = xhr.responseText;
    15                 /*
    16                  * 使用eval()函数进行转换
    17                  * * 使用"()"将其包裹,eval()函数强制将其转换为JSON格式(javascript代码)
    18                  * * 不使用"()"将其包裹,eval()函数将其识别为一个空的代码块
    19                  */
    20                 var json = eval("("+data+")");
    21                 console.log(json);
    22             }
    23         }
    24     }
    25     function getXhr(){
    26         var xhr = null;
    27         if(window.XMLHttpRequest){
    28             xhr = new XMLHttpRequest();
    29         }else{
    30             xhr = new ActiveXObject("Microsoft.XMLHttp");
    31         }
    32         return xhr;
    33     }
    View Code
     1 <?php
     2     // 接收客户端发送的请求数据
     3     $user = $_POST['user'];
     4     // 就是一个JSON格式的string字符串
     5     //var_dump($user);
     6     
     7     $json_user = json_decode($user,true);
     8 
     9     //var_dump($json_user['name']);
    10 
    11     $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
    12     //var_dump(json_decode($json));
    13     
    14     // 响应数据符合JSON格式的字符串
    15     // 1. 手工方式构建
    16     //echo '{"name":"zhouzhiruo","pwd":"123456"}';
    17 
    18     // 2. 使用json_encode()函数
    19     echo json_encode($json_user);
    20 ?>
    View Code

    HTML(文本格式)、XML格式及JSON格式的优缺点
      * HTML格式
        * 优点 - 简单
        * 缺点 - 解析复杂
      * XML格式
        * 优点 - 易于构建复杂数据
        * 缺点 - 构建、解析复杂
      * JSON格式
        * 优点 - 轻量级
        * 缺点 - 可能转换失败

  • 相关阅读:
    文本文件关键字替换(Java)
    Java分页需求
    四、MyBatis主配置文件
    三、动态SQL语句
    二、SQL语句映射文件(2)增删改查、参数、缓存
    二、SQL语句映射文件(1)resultMap
    一、MyBatis简介与配置MyBatis+Spring+MySql
    一个SpringMVC简单Demo中出现的错误
    linux系统如何将系统中的文件名改为英文?
    spring测试
  • 原文地址:https://www.cnblogs.com/Medeor/p/4994379.html
Copyright © 2011-2022 走看看