AJAX的原理-如何做到异步和局部刷新
Overriew: onReadyStateChange被回调函数赋值,则能实现异步调用,回调函数直接操作DOM,则能实现局部刷新。那么XMLHttpRequest的onReadyStateChange如何知道服务ready了呢?状态如何change了呢(观察者模式)?则是通过客户端对服务的状态询问(定期轮询)所实现的。
详解: 1. XMLHttpRequest 负责与服务器端的通讯,其内部有很多重要的属性:readyStatus=4,status=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",true); req.send()(); } } } req.onreadystatechange = callback 第一行定义了JavaScript回调函数,一旦响应就绪它就自动执行,而req.open()方法中所指定的“true”标志说明想要异步执行该请求。
回调函数: function processAjaxResponse() { if (req.readyState == 4) { // only if "OK" if (req.status == 200) { document.getElementById("user1").innerHTML = req.responseText; } else { alert("There was a problem retrieving the XML data: " + req.statusText); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c# – 如何知道MVVM绑定属性的内部属性何时被修改
- C#程序连接数据库及读取数据库中字段的简单方法总
- ruby-on-rails – 为什么Ruby on Rails被称为域专
- leetcode 10 Regular Expression Matching(简单
- flex嵌入html完整页面and嵌入其他项目swf文件
- c# – Process.Kill()访问被拒绝
- objective-c – UIBarButtonItem不继承UIView的原
- ruby-on-rails – 如何实现mongoid多对多关联?
- sqlite3常用命令&语法
- c# – Linq-to-entities,在一个查询中获取结果行