一、简史
IE5.5最早实现XHR,需要通过ActiveXObject创建xhr实例,直到IE7才定义了XMLHttpRequest对象。IE5.5实现XHR之后,其他浏览器紧随其后实现了XHR,直接命名为XMLHttpRequest。早期的XHR能力有限:只能传输文本,上传能力有限,而且不能跨域。为了解决这些问题,W3C于2008年发布了“XMLHttpRequest Level 2”草案。增强了XHR的能力:
(1)支持请求超时。xhr.timeout = 3000
(2)支持传输二进制和文本数据
(3)支持应用重写媒体类型和编码响应
(4)支持监控每个请求的进度事件
 
 
三、通过XHR下载数据
XHR既可以传输文本数据,也可以传输二进制数据。浏览器可以自动为各种原生数据类型提供编码和解码服务,因此在直接将数据传给XHR时就已经编码/解码好了。XHR自动解码支持的数据类型:
(1)ArrayBuffer
固定长度的二进制数据缓冲区
(2)Blob
二进制大对象或不可变数据
(3)Document
html或xml
(4)JSON
js对象
(5)Text
纯文本
 
浏览器可根据http首部content-type判断适当的数据类型。应用也可在发起XHR请求时显示重写数据类型:
var xhr = new XMLHttpRequest();
xhr.open('GET', '/images/photo.webp');
xhr.responseType = 'blob';// 将返回类型设置为Blob xhr.onload = function(){
if(this.status == 200){
var img = document.createElement('img');
img.src = window.URL.createObjectURL(this.response);//基于响应创建唯一对象URI
img.onload = function(){
window.URL.revokeObjectURL(this.src);// 图片加载完成立即释放对象
};
document.body.appendChild(img);
}
}
 
 
五、XHR流式数据传输
流的应用场景很重要,可惜到现在为止没有API来实现XHR流
(1)上传时,send方法只接受完整的载荷
(2)response、responseText、responseXML属性也不是为流设计的
上传时只能通过将文件切分,然后用多个xhr请求迭代上传。
 
流式下载得到了浏览器有限的支持:
var xhr = new XMLHttpRequest();
xhr.open('GET', '/stream');
xhr.seenBytes = 0;
 
xhr.onreadstatechange = function(){
    if(xhr.readyState > 2){
        var newData = xhr.responseText.substr(xhr.seenBytes);
        // TODO 处理newData        
 
        xhr.seenBytes = xhr.responseText.length;
    }
};
xhr.send();
 
缺陷:
需要手工跟踪偏移量,手工切分数据:responseText缓冲了完整的响应,当前请求完成之前无法释放内存。
只能读取文本数据,无法读取二进制数据。
浏览器兼容性:允许读取的数据类型不一致,有的允许text/html,有的只允许application/x-javascript
 
总之,XHR流实现起来麻烦而效率低,无法在生产环境下使用。
 
六、实时通知与交付
(1)通过XHR实现定时轮询。客户端定时发起XHR请求,如果服务端有新数据,返回新数据,没有返回空响应。难点在于,最佳的轮询间隔很难把握。需要在效率与消息延迟之间做权衡。
(2)通过XHR实现长轮询。定时轮询很可能造成大量没必要的空检查。可以做这样的改进:没有数据的时候不再立即返回空数据,而是把链接保持一段时间。
(3)WebSocket。HTML5新增的特性,可考虑在高版本浏览器下实现。
目前还是长轮询的解决方案使用的较为广泛。
 
七、参考资料
《web性能权威指南》
《JavaScript高级程序设计》

XHR的应用场景的更多相关文章

  1. angularJS中XHR与promise

    angularJS应用是完全运行在客户端的应用,我们可以通过angularJS构建一个不需依赖于后端,同时能够实现动态内容和响应的web应用,angularJS提供了将应用与远程服务器的信息集成在一起 ...

  2. Ajax原理、优缺点及应用场景

    前言 Ajax的全称为Asynchronous JavaScript And Xml,是一种web客户端与服务器端异步通信的技术,如今,可以说是web开发人员必须掌握的的一项技能了.本文讲述了Ajax ...

  3. 使用three.js加载3dmax资源,以及实现场景中的阴影效果

    使用three.js可以方便的让我们在网页中做出各种不同的3D效果.如果希望2D绘图内容,建议使用canvas来进行.但很多小伙伴不清楚到底如何为我们绘制和导入的图形添加阴影效果,更是不清楚到底如何导 ...

  4. [转]XHR简介

      在XHR诞生前,网页要获取客户端和服务器的任何状态更新,都需要刷新一次,在XHR诞生后就可以完全通过JS代码异步实现这一过程.XHR的诞生也使最初的网页制作转换为开发交互应用,拉开了WEB2.0的 ...

  5. fetch与XHR的区别与优势

    Fetch API更加现代 XHR 和 Fetch API 最显著的区别就是调用方式不同.这一点大家应该都知道吧. 举个例子,下面两端代码完成的是同一功能: // 用 XHR 发起一个GET请求 va ...

  6. script ajax / XHR / XMLHttpRequest

    s 利用XHR 调试发送form data表单数据,F5键刷新form表单URL ,http请求地址,获取token,提交. 如:http://pcp.cns*****.com/spcp-web/vm ...

  7. XHR简介

    在XHR诞生前,网页要获取客户端和服务器的任何状态更新,都需要刷新一次,在XHR诞生后就可以完全通过JS代码异步实现这一过程.XHR的诞生也使最初的网页制作转换为开发交互应用,拉开了WEB2.0的序幕 ...

  8. 使用着色器在WebGL3D场景中呈现行星表面地形

    实验目的:按照一定规律生成类地行星地表地形区块,并用合理的方式将地形块显示出来 涉及知识:Babylon.js引擎应用.着色器编程.正态分布.数据处理.canvas像素操作 github地址:http ...

  9. js设计模式-工厂模式(XHR工厂)

    场景:如果代码中需要多次执行Ajax请求,那么明智的做法是把创建这种对象的代码提取到一个类中,并创建一个包装器来包装在实际请求时所要经历的一系列步骤.简单工厂非常适合这种场合. /*AjaxHandl ...

随机推荐

  1. request payload

    最近在调试代码时发现有Request Payload的情况,从网上查一些文件,也都有较多的描述.下面我只是说明一下大家没有注意的地方 关于HTTP请求,都是通过URL及参数向后台发送数据.主要方式有G ...

  2. 5. 常见C语言字符串库函数的使用及实现

    1. strncat 函数: [函数原型]#include <string.h> char *strncat( char *str1, const char *str2, size_t c ...

  3. MongDB from execCommand not master

    count failed: not master{ , "errmsg" : "not master" } at src/mongo/shell/query.j ...

  4. 17、OpenCV Python 数字验证码识别

    __author__ = "WSX" import cv2 as cv import numpy as np from PIL import Image import pytess ...

  5. 冒泡排序 思想 JAVA实现

    已知一个数组78.75.91.36.72.94.43.64.93.46,使用冒泡排序将此数组有序. 冒泡排序是一个运行时间为O(N²)的排序算法. 算法思想:(已从小到大为例) 78.75.91.36 ...

  6. win10进入安全模式的方法

    https://jingyan.baidu.com/article/a3aad71ac5919bb1fa009667.html

  7. JUC包下CyclicBarrier学习笔记

    CyclicBarrier,一个同步辅助类,在API中是这么介绍的: 它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这 ...

  8. 安装使用Redis过程中可能出现的错误收集

    1.使用make test测试编译状态报错 cd src && make test make[1]: Entering directory `/usr/local/redis-3.2. ...

  9. PHP 实时生成并下载超大数据量的 Excel 文件

    //另外由于excel数据是从数据库里逐步读出然后写入输出流的所以需要将PHP的执行时间设长一点 //(默认30秒)set_time_limit(0)不对PHP执行时间做限制. set_time_li ...

  10. plot over time

    先选择监测点 最后输出,由于所有数据都被输出,因此需要等待久一点 可以勾选需要的值,记得更换勾选变量后再次点击apply 最后的效果: 最后可以把数据写出来做后处理 输出后的数据: