一、简史
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. Django 实现网站注册用户邮箱验证功能

    我们在很多网站上都可以看到用户注册使用电子邮件激活或启用的方式.也就是说,用户在注册后填写正确的电子邮件地址,接着网站会发送一封启用电子邮件到用户设置的电子邮件的邮箱中,并在邮件中提供一个激活或启用的 ...

  2. Java面向对象之异常(异常处理方式)

    一.基础概念 (1)异常:Java程序在运行时期发生的不正常情况. Java就按照面向对象的思想对不正常情况进行描述和对象的封装. (2)异常问题分类: (Throwable:定义对于问题共性的功能. ...

  3. 【spring cloud】并发测试问题

    一,问题 并发测试,对外接口测试50个并发的时候开发报错,报错信息类似如下:  {"status":"0500","message":&qu ...

  4. 190225Redis

    一.Redis的简单使用 Redis操作模式 # Author:Li Dongfei import redis r = redis.Redis(host='192.168.56.7', port=63 ...

  5. Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON

    Home / Qt 学习之路 2 / Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON  豆子 ...

  6. php中magic_quotes_gpc的作用 解决日文数据提交后多出来反斜杠的问题

    magic_quotes_gpc发生作用是在传递$_GET,$_POST,$_COOKIE时 1.条件: magic_quotes_gpc=off写入数据库的字符串未经过任何过滤处理.从数据库读出的字 ...

  7. flask-restful基础

    flask-restful基本使用 基本使用 from flask_restful import Api,Resource,reqparse,inputs from flask import Flas ...

  8. C++_标准模板库STL概念介绍5-其他库与总结

    C++还提供了其他一些类库,这些类库更加专用. 例如,头文件complex为复数提供了类模板complex,包含用于float.long和long double的具体化. 这个类提供了标准的复数运算以 ...

  9. abp学习资料

    参考: https://www.jianshu.com/p/a6e9ace79345

  10. ul模拟select,位置,数据,是否可输入及输入提示效果都可作为参数直接传入

    转发请注明出处,虽然转发几率不大... HTML <span class="theContainer"></span> CSS body {padding: ...