AJAX机制详解以及跨域通信(2)

xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if (xhr.status >= 200 && xhr.status <== 300 || xhr.status == 304) { alert(xhr.responseText); //处理接收的数据 } else { //请求失败,未得到响应数据 } } }; //补充说明:注册事件必须发生在send()以前

XMLHttpRequest对象的事件属性ontimeout -----仅限IE8+,不过最新的主流高版本浏览器也已经实现(不推荐使用)

xhr.timeout=1000;//一秒钟

xhr.ontimeout=functon(){
  //处理代码
  ......
}
  这种使用方式有个问题需要注意,就是在超时之后,在接收到数据后仍然会触发onreadystatechange事件,如果在处理onreadychange事件时访问xhr.status属性,会出错。所以我们在访问该属性时需要做一下try{}catch处理。但是,因为这个属性暂不兼容,所有我们就不重点讲了。

XMLHttpRequest对象的事件属性onload onerror onloadstar onbort onprogress:

-----非IE浏览器和IE 10+已实现

onload在IE8以上可以实现,大部分事件根据readySate变化均可以实现,以上事件只不过是方便使用而已。

onload和onprogress 这两种事件分别对应着readyState=4和readyState=3的情况,使用方式分别如下:

xhr.onload= function (event) { //event只包含一个属性 event.target=xhr;使用方式只是在readyState=4时差不多.. } xhr.onprogress=function(event){ //event除了包含event.target=xhr之外,还包含三种属性 //lengthComputale(进度信息是否可用),position(已接受字节数)和totalSize(总字节数). }


补充:有些事件均可以根据readyState的状态进行模拟。只有有的浏览器进行了方便化处理而已。  

3.单向跨域技术 ---CORS
 今天我们这里讲的是客户端网页向不在同一个域的服务器请求数据..客户端在收到返回的数据时时,用回调函数处理数据。

即:

1. 客户端向域外服务器请求数据

2.服务器得到响应后向客户端发送数据。

3.客户端根据返回的数据执行回调函数.

我知道不同域下的iframe也可以进行通信,而且这也是一种跨域通信技术。但是,这种iframe页面之间的双向通信,我们在下一个专题里面讲解,今天主要讲的是单向通信。

3.1.CORS跨域请求的原理
在用xhr(XMLHttpRequest)对象或者xdr(XDomainRequest)对象,发送域外请求时,大概的实现原理如下图:

 3.2.IE中CORS技术的实现
 IE8引入了一个XDR类型,这个类型与XHR基本类似,但是其能实现安全可靠地跨域通信。

XHD的特点:

1.cookie不会随请求发送,也不会随响应返回。

2.只能设置请求头部中的Content-Type片段。

3.不能访问响应头部信息。

4.只是支持get和post请求。

XDR支持onload和onerror事件属性,且其使用方式和XHR基本一致,不过其open()只接收两个参数,默认是异步的。

var xdr = new XDomainRequest(); xdr.onload = function () { //处理xdr.responseText } xdr.onerror = function () { }; xdr.open('get', '绝对url'); xhr.send(null);

3.3.跨浏览器的CORS技术实现

在标准浏览器中XHR对象就已经可以自动实现跨域请求,但是XHR和XDR的不同之处:

1.XHR可以在设置 withCredentials =true时,浏览器会把cookie发送给服务器,服务器此时通过设置头部Access-Control-Allow-Credentials:true时来响应。如果,服务器不设置这个属性,则浏览器会触发onerror事件。

2.在回调函数中可以访问status和statusText属性,而且支持同步请求。

以下是实现跨域请求的代码:

function createCrosRequest(method, url) { var xhr = new XMLHttpRequest(); //IE7+ if ('withCredentials' in xhr) { //IE8-IE9浏览器没有这个属性 xhr.open(method, url, true); } else if (typeof XDomainRequest != 'undefined') { xhr = new XDomainRequest(); //IE xhr.open(method, url) } return xhr; } var request=CreateCrosRequest("get","url"); if(request){ request.onload=function(){ //处理request.responseText; } request.send(null); }

4.单向跨域技术 ---JSONP技术

JSONP技术比较简单,其主要原理主要是利用script标签的特性。

script标签和image标签一样,它们都具有src属性,而且这个属性是可跨域的。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wfyxzd.html