Ajax工作原理以及同步与异步的区别

其实ajax可以笼统的分为三步

  • 创建 XMLHttpRequest 对象
  • 在onreadystatechange 事件中,获取异步调用返回的数据,使用JavaScript和DOM实现局部刷新
  • 调用对象的方法规定请求的类型、URL 以及是否异步处理请求,并向服务器发送请求

XMLHttpRequest 是 AJAX 的基础。

所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)。
XMLHttpRequest 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
考虑到浏览器版本兼容性,创建对象时建议这么写

var xhr; if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari xhr=new XMLHttpRequest(); } else{// code for IE6, IE5 xhr=new ActiveXObject("Microsoft.XMLHTTP"); }

onreadystatechange 事件

当请求被发送到服务器时,我们需要执行一些基于响应的任务。
每当 readyState 改变时,就会触发 onreadystatechange 事件。
readyState 属性存有 XMLHttpRequest 的状态信息。

注意点:readyState对应xhr对象当前状态。不能手工赋值,可以取值,其值会随着(请求-响应)过程进行自动改变

readyState 的5种状态分别为:
| 状态/英译| 解释 | 对应操作 |
| ------------- |:-------------? -----?
|0 UNSENT | 请求消息沿未发送 | xhr.open();
|1 OPENED |XHR己经打开web服务器连接 |xhr.send();
|2 HEADERS_RECEVIED |xhr己经接收服务器响应消息头部| 自然(不能控制)
|3 LOADING| XHR正在加载响应消息主体 |自然(不能控制)
|4 DONE | XHR接收完成响应消息主体

上面有讲过我们会在onreadystatechange事件中进行页面刷新,这些都是基于 readyState 等于 4 且状态为 200 时,表示响应已就绪而进行的JS或DOM操作(PS更多情况下是DOM操作)。

注意点:不论你是同步还是异步,程序都执行onreadystatechange,只不过在写同步时你可以省略不写,直接发送请求,执行相应的函数

以下仅仅是JS操作
这时获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。

属性 描述
responseText 获得字符串形式的响应数据。
responseXML 获得 XML 形式的响应数据。

如果来自服务器的响应并非 XML,使用 responseText 属性。responseText 属性返回字符串形式的响应

document.getElementById(“myDiv”).innerHTML=xmlhttp.responseText;

如果来自服务器的响应是 XML,而且需要作为 XML 对象进行解析,使用 responseXML 属性:

xmlDoc=xmlhttp.responseXML; txt=""; x=xmlDoc.getElementsByTagName("ARTIST"); for (i=0;i"; } document.getElementById("myDiv").innerHTML=txt;

向服务器发送请求

如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法:
open(method,url,async )

表示:打开到服务器连接
method:请求方式 GET POST
url: 请求url地址(程序地址)
async:请求方式是异步(true)
同步(false)
默认异步

send(data)
表示:把请求消息发送web服务器
data:请求消息主体内容
GET–>内容为null
send(null);
POST–>请求数据放在里面

下面是关键,面试要考

同步与进步

JS 异步

xhr.open(“GET”,url,true);//异步方式
xhr.onreadystatechange = show; //show是回调函数名
xhr.send(null);
function show(){ //fn1()
if(xhr.readyState === 4){
if(xhr.status === 200){

}
}
};
fn2();//fn1()不影响fn2()的执行

JS 同步

xhr.open(“GET”,url,false);//同步方式
xhr.send(null);
show();
function show(){
//if(xhr.readyState == 4){ 这里就省略了,直接操作
//if(xhr.status == 200){
…//JS DOM操作
//}
//}
};
fn2();//等待前面show()执行完在执行。

同步:当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,等待服务器返回数据,页面出现假死状态,当接收到sever端数据完毕后才会继续运行其他代码页面假死状态解除。
异步:当ajax发送请求后,在等待server端返回的这个过程中,前台会继续 执行ajax块后面的脚本,直到server端返回正确的结果才会去执行相应操作

贴一段完整的demo


网络资料/知识延伸
ajax中的async属性值之同步和异步及同步和异步区别
同步和异步消息之间的区别?
同步异步 阻塞非阻塞
XMLHttpRequest

你可能感兴趣的:(JavaScript)