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<x.length;i++) { txt=txt + x[i].childNodes[0].nodeValue + "<br />"; } 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

<html>
<ul id="dlist">
 
</ul>
 <script>
	    //*1:页面加载成功   
		//*2:创建ajax
		/*3:绑定事件
		//*3.1:判断 200   4
		//*3.2:接收返回数据  JSON.parse(..);
		//3.3:循环拼接   ???
		//3.4:保存dlist.innerHTML
		//*4:打开连接 type_select.php
		//*5:发送请求
			 window.onload = function(){
			   var xhr = new XMLHttpRequest();
				 xhr.onreadystatechange = function(){
					if(xhr.readyState===4&&xhr.status===200){
						var msg = xhr.responseText;
						var list = JSON.parse(msg);
						var html = "";
						for(var i=0;i<list.length;i++){
							 var obj = list[i];
							 var id = obj.did;
							 var dname  = obj.dname;
							 var p = obj.pic;
							 html += `
							   <li>
								   <img src="img/${p}" class="${id}" />
									 ${dname}
								 </li>
							 `;
						}
            dlist.innerHTML = html;
					}   
				 }
				 xhr.open("GET","select.php",true);
				 xhr.send(null);
			 }
</script>
</html>

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

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值