JS XMLHttpRequest原理与使用方法深入详解(3)

代码示例中xhr请求的是一张图片,通过将 response 的 content-type 改为'text/plain; charset=x-user-defined',使得 xhr 以纯文本格式来解析接收到的blob 数据,最终用户通过this.responseText拿到的就是图片文件对应的二进制字符串,最后再将其转换为 blob 数据。

xhr.responseType

responseType是xhr level 2新增的属性,用来指定xhr.response的数据类型,目前还存在些兼容性问题,可以参考本文的【XMLHttpRequest的兼容性】这一小节。那么responseType可以设置为哪些格式呢,我简单做了一个表,如下:

值 xhr.response 数据类型 说明
""   String字符串   默认值(在不设置responseType时)  
"text"   String字符串  
"document"   Document对象   希望返回 XML 格式数据时使用  
"json"   javascript 对象   存在兼容性问题,IE10/IE11不支持  
"blob"   Blob对象  
"arrayBuffer"   ArrayBuffer对象  

下面是同样是获取一张图片的代码示例,相比xhr.overrideMimeType,用xhr.response来实现简单得多。

var xhr = new XMLHttpRequest(); xhr.open('GET', '/path/to/image.png', true); //可以将`xhr.responseType`设置为`"blob"`也可以设置为`" arrayBuffer"` //xhr.responseType = 'arrayBuffer'; xhr.responseType = 'blob'; xhr.onload = function(e) { if (this.status == 200) { var blob = this.response; ... } }; xhr.send();

小结

虽然在xhr level 2中,2者是共同存在的。但其实不难发现,xhr.responseType就是用来取代xhr.overrideMimeType()的,xhr.responseType功能强大的多,xhr.overrideMimeType()能做到的xhr.responseType都能做到。所以我们现在完全可以摒弃使用xhr.overrideMimeType()了。

如何获取response数据

xhr提供了3个属性来获取请求返回的数据,分别是:xhr.response、xhr.responseText、xhr.responseXML

xhr.response

默认值:空字符串""

当请求完成时,此属性才有正确的值

请求未完成时,此属性的值可能是""或者 null,具体与 xhr.responseType有关:当responseType为""或"text"时,值为"";responseType为其他值时,值为 null

xhr.responseText

默认值为空字符串""

只有当 responseType 为"text"、""时,xhr对象上才有此属性,此时才能调用xhr.responseText,否则抛错

只有当请求成功时,才能拿到正确值。以下2种情况下值都为空字符串"":请求未完成、请求失败

xhr.responseXML

默认值为 null

只有当 responseType 为"text"、""、"document"时,xhr对象上才有此属性,此时才能调用xhr.responseXML,否则抛错

只有当请求成功且返回数据被正确解析时,才能拿到正确值。以下3种情况下值都为null:请求未完成、请求失败、请求成功但返回数据无法被正确解析时

如何追踪ajax请求的当前状态

在发一个ajax请求后,如果想追踪请求当前处于哪种状态,该怎么做呢?

用xhr.readyState这个属性即可追踪到。这个属性是只读属性,总共有5种可能值,分别对应xhr不同的不同阶段。每次xhr.readyState的值发生变化时,都会触发xhr.onreadystatechange事件,我们可以在这个事件中进行相关状态判断。

xhr.onreadystatechange = function () { switch(xhr.readyState){ case 1://OPENED //do something break; case 2://HEADERS_RECEIVED //do something break; case 3://LOADING //do something break; case 4://DONE //do something break; }

值 状态 描述
0   UNSENT (初始状态,未打开)   此时xhr对象被成功构造,open()方法还未被调用  
1   OPENED (已打开,未发送)   open()方法已被成功调用,send()方法还未被调用。注意:只有xhr处于OPENED状态,才能调用xhr.setRequestHeader()和xhr.send(),否则会报错  
2   HEADERS_RECEIVED (已获取响应头)   send()方法已经被调用, 响应头和响应状态已经返回  
3   LOADING (正在下载响应体)   响应体(response entity body)正在下载中,此状态下通过xhr.response可能已经有了响应数据  
4   DONE (整个数据传输过程结束)   整个数据传输过程结束,不管本次请求是成功还是失败  
如何设置请求的超时时间

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

转载注明出处:http://www.heiqu.com/b3507e46c0e6a376fc8858bdabceb17a.html