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格式
    * 优点 - 轻量级
    * 缺点 - 可能转换失败

 

posted @ 2015-11-25 13:26  Medeor  阅读(3129)  评论(0编辑  收藏  举报