黑马程序员技术交流社区

标题: AJAX的原理-如何做到异步和局部刷新 [打印本页]

作者: 曹老师    时间: 2017-11-7 13:32
标题: AJAX的原理-如何做到异步和局部刷新
AJAX的原理-如何做到异步和局部刷新
Overriew: onReadyStateChange被回调函数赋值,则能实现异步调用,回调函数直接操作DOM,则能实现局部刷新。那么XMLHttpRequestonReadyStateChange如何知道服务ready了呢?状态如何change了呢(观察者模式)?则是通过客户端对服务的状态询问(定期轮询)所实现的。

详解:
1. XMLHttpRequest 负责与服务器端的通讯,其内部有很多重要的属性:readyStatus=4status=200等等。当XMLHttpRequest的整体状态并且保证它已经完成(readyStatus=4),即数据已经发送完毕。然后根据服务器的设定询问(类似于客户端会轮询服务器的返回状态,仍然是http短连接,并非长连接的服务器端push)请求状态,如果一切已经就绪(status=200),那么就执行需要的操作。
操作一般就是直接操作DOM,所以AJAX能做到所谓的无刷新用户体验。
document.getElementById("user1").innerHTML = "数据正在加载...";  
            if (xmlhttp.status == 200) {  
                document.write(xmlhttp.responseText);  
            }  
2. 那么在AJAX客户端如何做到的异步呢?实际上就是Javascript的回调函数起的作用
提供一个回调JavaScript函数,一旦服务器响应可用,该函数就被执行
业务函数:
function castVote(rank) {  
  var url = "/ajax-demo/static-article-ranking.html";  
  var callback = processAjaxResponse;  
  executeXhr(callback, url);  
}  

需要异步通讯的函数:
function executeXhr(callback, url) {  
  // branch for native XMLHttpRequest object  
  if (window.XMLHttpRequest) {  
    req = new XMLHttpRequest();  
    req.onreadystatechange = callback;  
    req.open("GET", url, true);  
    req.send()(null);  
  } // branch for IE/Windows ActiveX version  
  else if (window.ActiveXObject) {  
    req = new ActiveXObject("Microsoft.XMLHTTP");  
    if (req) {  
      req.onreadystatechange = callback;  
      req.open("GET", url, true);  
      req.send()();  
    }  
  }  
}  
req.onreadystatechange = callback
req.open("GET", url, true)
第一行定义了JavaScript回调函数,一旦响应就绪它就自动执行,而req.open()方法中所指定的“true”标志说明想要异步执行该请求。
        一旦服务器处理完XmlHttpRequest并返回给浏览器,使用req.onreadystatechange指派所设置的回调方法将被自动调用。
回调函数:
1. function processAjaxResponse() {  
2.   if (req.readyState == 4) {  
3.     // only if "OK"  
4.     if (req.status == 200) {  
5.       document.getElementById("user1").innerHTML = req.responseText;  
6.     } else {  
7.       alert("There was a problem retrieving the XML data:  
8. " + req.statusText);  
9.     }  
10.   }  
11. }  






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2