摘要:默认参数为空字符串密码,可选参数,用于授权。默认参数为空字符串备注如果不是有效的方法或地址不能被成功解析,将会抛出异常如果请求方法不区分大小写为或将会抛出异常重写由服务器返回的类型。
本文详细介绍了 XMLHttpRequest 相关知识,涉及内容:
AJAX、XMLHTTP、XMLHttpRequest详解、XMLHttpRequest Level 1、Level 2 详解
XHR 上传、下载数据、XHR 流式传输、XHR 定时轮询和长轮询区别与优缺点、XMLHttpRequest 库 (Mock.js、Zone.js、Oboe.js、fetch.js)
XMLHttpRequest 常用代码片段:
ArrayBuffer 对象转字符串
字符串转 ArrayBuffer 对象
创建 XHR 对象
sendAsBinary() polyfill
获取 XMLHttpRequest 响应体
获取 responseURL
验证请求是否成功
解析查询参数为Map对象
XHR 下载图片
XHR 上传图片
XHR 上传进度条
分析 AJAX 请求状态为 0、GET请求方式为什么不能通过send() 方法发送请求体、简单请求和预请求、XMLHttpRequest对象垃圾回收机制、Get与Post请求区别、如何避免重复发送请求、AJAX 站点 SEO 优化等问题。
AJAX AJAX 定义</>复制代码
AJAX即“Asynchronous JavaScript and XML”(异步的JavaScript与XML技术),指的是一套综合了多项技术的浏览器端网页开发技术。Ajax的概念由杰西·詹姆士·贾瑞特所提出。
传统的Web应用允许用户端填写表单(form),当提交表单时就向网页服务器发送一个请求。服务器接收并处理传来的表单,然后送回一个新的网页,但这个做法浪费了许多带宽,因为在前后两个页面中的大部分HTML码往往是相同的。由于每次应用的沟通都需要向服务器发送请求,应用的回应时间依赖于服务器的回应时间。这导致了用户界面的回应比本机应用慢得多。
与此不同,AJAX应用可以仅向服务器发送并取回必须的数据,并在客户端采用JavaScript处理来自服务器的回应。因为在服务器和浏览器之间交换的数据大量减少(大约只有原来的5%)[来源请求],服务器回应更快了。同时,很多的处理工作可以在发出请求的客户端机器上完成,因此Web服务器的负荷也减少了。
类似于DHTML或LAMP,AJAX不是指一种单一的技术,而是有机地利用了一系列相关的技术。虽然其名称包含XML,但实际上数据格式可以由JSON代替,进一步减少数据量,形成所谓的AJAJ。而客户端与服务器也并不需要异步。一些基于AJAX的“派生/合成”式(derivative/composite)的技术也正在出现,如AFLAX。 —— 维基百科
AJAX 应用
运用XHTML+CSS来表达信息;
运用JavaScript操作DOM(Document Object Model)来运行动态效果;
运用XML和XSLT操作数据
运用XMLHttpRequest或新的Fetch API与网页服务器进行异步数据交换;
注意:AJAX与Flash、Silverlight和Java Applet等RIA技术是有区分的。
AJAX 兼容性JavaScript 编程的最大问题来自不同的浏览器对各种技术和标准的支持。
XmlHttpRequest 对象在不同浏览器中不同的创建方法,以下是跨浏览器的通用方法:
</>复制代码
// Provide the XMLHttpRequest class for IE 5.x-6.x:
// Other browsers (including IE 7.x-8.x) ignore this
// when XMLHttpRequest is predefined
var xmlHttp;
if (typeof XMLHttpRequest != "undefined") {
xmlHttp = new XMLHttpRequest();
} else if (window.ActiveXObject) {
var aVersions = ["Msxml2.XMLHttp.5.0", "Msxml2.XMLHttp.4.0",
"Msxml2.XMLHttp.3.0", "Msxml2.XMLHttp", "Microsoft.XMLHttp"];
for (var i = 0; i < aVersions.length; i++) {
try {
xmlHttp = new ActiveXObject(aVersions[i]);
break;
} catch (e) {}
}
}
详细信息请参考 - Can I use XMLHttpRequest
AJAX/HTTP 库对比Support | Features | |||||||
---|---|---|---|---|---|---|---|---|
All Browsers | Chrome & Firefox1 | Node | Concise Syntax | Promises | Native2 | Single Purpose3 | Formal Specification | |
XMLHttpRequest | ✓ | ✓ | ✓ | ✓ | ✓ | |||
Node HTTP | ✓ | ✓ | ✓ | ✓ | ||||
fetch() | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
Fetch polyfill | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
node-fetch | ✓ | ✓ | ✓ | ✓ | ✓ | |||
isomorphic-fetch | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
superagent | ✓ | ✓ | ✓ | ✓ | ✓ | |||
axios | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
request | ✓ | ✓ | ✓ | |||||
jQuery | ✓ | ✓ | ✓ | |||||
reqwest | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
1 Chrome & Firefox are listed separately because they support fetch(): caniuse.com/fetch
2 Native: Meaning you can just use it - no need to include a library.
3 Single Purpose: Meaning this library or technology is ONLY used for AJAX / HTTP communication, nothing else.
详细信息请参考 - AJAX/HTTP Library Comparison
XMLHTTP XMLHTTP 定义</>复制代码
XMLHTTP 是一组API函数集,可被JavaScript、JScript、VBScript以及其它web浏览器内嵌的脚本语言调用,通过HTTP在浏览器和web服务器之间收发XML或其它数据。XMLHTTP最大的好处在于可以动态地更新网页,它无需重新从服务器读取整个网页,也不需要安装额外的插件。该技术被许多网站使用,以实现快速响应的动态网页应用。例如:Google的Gmail服务、Google Suggest动态查找界面以及Google Map地理信息服务。
XMLHTTP是AJAX网页开发技术的重要组成部分。除XML之外,XMLHTTP还能用于获取其它格式的数据,如JSON或者甚至纯文本。—— 维基百科
XMLHTTP 背景知识
</>复制代码
XMLHTTP最初是由微软公司发明的,在Internet Explorer 5.0中用作ActiveX对象,可通过JavaScript、VBScript或其它浏览器支持的脚本语言访问。Mozilla的开发人员后来在Mozilla 1.0中实现了一个兼容的版本。之后苹果电脑公司在Safari 1.2中开始支持XMLHTTP,而Opera从8.0版开始也宣布支持XMLHTTP。
大多数使用了XMLHTTP的设计良好的网页,会使用简单的JavaScript函数,将不同浏览器之间调用XMLHTTP的差异性屏蔽,该函数会自动检测浏览器版本并隐藏不同环境的差异。
在DOM 3(文档对象模型 Level 3)的读取和保存规范(Load and Save Specification)中也有类似的功能,它已经成为W3C推荐的方法。截止2011年,大多数浏览器已经支持。—— 维基百科
XMLHTTP 实现
ActiveXObject
XMLHttpRequest
什么是 ActiveX 控件Microsoft ActiveX 控件是由软件提供商开发的可重用的软件组件。使用 ActiveX 控件,可以很快地在网址、台式应用程序、以及开发工具中加入特殊的功能。例如,StockTicker 控件可以用来在网页上即时地加入活动信息,动画控件可用来向网页中加入动画特性。
ActiveXObject 对象JavaScript 中 ActiveXObject 对象是启用并返回 Automation 对象的引用。
ActiveXObject 语法
</>复制代码
newObj = new ActiveXObject(servername.typename[, location])
参数:
newObj
必选 - ActiveXObject 分配到的变量名称
servername
必选 - 提供对象的应用程序名称
typename
必选 - 要创建的对象的类型或类
location
可选 - 要再其中创建对象的网络服务器的名称
ActiveXObject 使用
</>复制代码
// 在IE5.x和IE6下创建xmlHttp对象
// servername - MSXML2
// typename - XMLHTTP.3.0
var xmlHttp = new ActiveXObject("MSXML2.XMLHTTP.3.0");
xmlHttp.open("GET", "http://localhost/books.xml", false);
xmlHttp.send();
详细信息可以参考 - msdn - JavaScript 对象 - ActiveXObject 对象.aspx)
XMLHttpRequestXMLHttpRequest 是一个API, 它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。
XMLHttpRequest 是一个 JavaScript 对象,它最初由微软设计,随后被 Mozilla、Apple 和 Google采纳. 如今,该对象已经被 W3C组织标准化. 通过它,你可以很容易的取回一个URL上的资源数据. 尽管名字里有XML, 但 XMLHttpRequest 可以取回所有类型的数据资源,并不局限于XML。 而且除了HTTP ,它还支持file 和 ftp 协议。
XMLHttpRequest 语法
</>复制代码
var req = new XMLHttpRequest();
XMLHttpRequest 使用
</>复制代码
var xhr = new XMLHttpRequest(); // 创建xhr对象
xhr.open( method, url );
xhr.onreadystatechange = function () { ... };
xhr.setRequestHeader( ..., ... );
xhr.send( optionalEncodedData );
XMLHttpRequest 详解
构造函数
用于初始化一个 XMLHttpRequest 对象,必须在所有其它方法被调用前调用构造函数。使用示例如下:
</>复制代码
var req = new XMLHttpRequest();
属性
onreadystatechange: Function - 当 readyState 属性改变时会调用它。
readyState: unsigned short - 用于表示请求的五种状态:
值 | 状态 | 描述 |
---|---|---|
0 | UNSENT (未打开) | 表示已创建 XHR 对象,open() 方法还未被调用 |
1 | OPENED (未发送) | open() 方法已被成功调用,send() 方法还未被调用 |
2 | HEADERS_RECEIVED (已获取响应头) | send() 方法已经被调用,响应头和响应状态已经返回 |
3 | LOADING (正在下载响应体) | 响应体下载中,responseText中已经获取了部分数据 |
4 | DONE (请求完成) | 整个请求过程已经完毕 |
response: varies - 响应体的类型由 responseType 来指定,可以是 ArrayBuffer、Blob、Document、JSON,或者是字符串。如果请求未完成或失败,则该值为 null。
response: varies - 响应体的类型由 responseType 来指定,可以是 ArrayBuffer、Blob、Document、JSON,或者是字符串。如果请求未完成或失败,则该值为 null。
responseText: DOMString - 此请求的响应为文本,或者当请求未成功或还是未发送时未 null (只读)
responseType: XMLHttpRequestResponseType - 设置该值能够改变响应类型,就是告诉服务器你期望的响应格式:
值 | 响应数据类型 |
---|---|
"" (空字符串) | 字符串(默认值) |
"arraybuffer" | ArrayBuffer |
"blob" | Blob |
"document" | Document |
"json" | JSON |
"text" | 字符串 |
xhr.spec 规范中定义的 XMLHttpRequestResponseType 类型如下:
</>复制代码
enum XMLHttpRequestResponseType {
"",
"arraybuffer",
"blob",
"document",
"json",
"text"
};
responseXML: Document - 本次请求响应式一个 Document 对象,如果是以下情况则值为 null:
请求未成功
请求未发送
响应无法被解析成 XML 或 HTML
status: unsigned short - 请求的响应状态码,如 200 (表示一个成功的请求)。 (只读)
statusText: DOMString - 请求的响应状态信息,包含一个状态码和消息文本,如 "200 OK"。 (只读)
timeout: unsigned long - 表示一个请求在被自动终止前所消耗的毫秒数。默认值为 0,意味着没有超时时间。超时并不能应用在同步请求中,否则会抛出一个 InvalidAccessError 异常。当发生超时时,timeout 事件将会被触发。
upload: XMLHttpRequestUpload - 可以在 upload 上添加一个事件监听来跟踪上传过程
withCredentials: boolean - 表明在进行跨站 (cross-site) 的访问控制 (Access-Control) 请求时,是否使用认证信息 (例如cookie或授权的header)。默认为 false。注意:这不会影响同站 same-site 请求
方法abort() - 如果请求已经被发送,则立刻中止请求。
getAllResponseHeaders() - 返回所有响应头信息(响应头名和值),如果响应头还没有接收,则返回 null。注意:使用该方法获取的 response headers 与在开发者工具 Network 面板中看到的响应头不一致
getResponseHeader() - 返回指定响应头的值,如果响应头还没有被接收,或该响应头不存在,则返回 null。注意:使用该方法获取某些响应头时,浏览器会抛出异常,具体原因如下:
W3C的 xhr 标准中做了限制,规定客户端无法获取 response 中的 Set-Cookie、Set-Cookie2 这2个字段,无论是同域还是跨域请求。
W3C 的 cors 标准对于跨域请求也做了限制,规定对于跨域请求,客户端允许获取的response header字段只限于 simple response header (常见的 simple response header 如下)
Cache-Control
Content-Language
Content-Type
Expires
Last-Modified
Pragma
和 Access-Control-Expose-Headers。
open() - 初始化一个请求:
方法签名:
</>复制代码
void open(
DOMString method,
DOMString url,
optional boolean async,
optional DOMString user,
optional DOMString password
);
参数:
method - 请求所使用的 HTTP 方法,如 GET、POST、PUT、DELETE
url - 请求的 URL 地址
async - 一个可选的布尔值参数,默认值为 true,表示执行异步操作。如果值为 false,则 send() 方法不会返回任何东西,直到接收到了服务器的返回数据
user - 用户名,可选参数,用于授权。默认参数为空字符串
password - 密码,可选参数,用于授权。默认参数为空字符串
备注:
如果 method 不是有效的 HTTP 方法或 url 地址不能被成功解析,将会抛出 SyntaxError 异常
如果请求方法(不区分大小写)为 CONNECT、TRACE 或 TRACK 将会抛出 SecurityError 异常
overrideMimeType() - 重写由服务器返回的 MIME 类型。例如,可以用于强制把响应流当做 text/xml 来解析,即使服务器没有指明数据是这个类型。注意:这个方法必须在 send() 之前被调用。
send() - 发送请求。如果该请求是异步模式(默认),该方法会立刻返回。相反,如果请求是同步模式,则直到请求的响应完全接受以后,该方法才会返回。注意:所有相关的事件绑定必须在调用 send() 方法之前进行。
方法签名:
</>复制代码
void send();
void send(ArrayBuffer data);
void send(Blob data);
void send(Document data);
void send(DOMString? data);
void send(FormData data);
setRequestHeader() - 设置 HTTP 请求头信息。注意:在这之前,你必须确认已经调用了 open() 方法打开了一个 url
方法签名:
</>复制代码
void setRequestHeader(
DOMString header,
DOMString value
);
参数:
header - 请求头名称
value - 请求头的值
sendAsBinary() - 发送二进制的 send() 方法的变种。
方法签名:
</>复制代码
void sendAsBinary(
in DOMString body
);
参数:
body - 消息体
浏览器兼容性Desktop
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
Basic support (XHR1) | 1 | 1.0 | 5 (via ActiveXObject)7 (XMLHttpRequest) | (Yes) | 1.2 |
send(ArrayBuffer) | 9 | 9 | ? | 11.60 | ? |
send(Blob) | 7 | 3.6 | ? | 12 | ? |
send(FormData) | 6 | 4 | ? | 12 | ? |
response | 10 | 6 | 10 | 11.60 | ? |
responseType = "arraybuffer" | 10 | 6 | 10 | 11.60 | ? |
responseType = "blob" | 19 | 6 | 10 | 12 | ? |
responseType = "document" | 18 | 11 | 未实现 | 未实现 | 未实现 |
responseType = "json" | 未实现 | 10 | 未实现 | 12 | 未实现 |
Progress Events | 7 | 3.5 | 10 | 12 | ? |
withCredentials | 3 | 3.5 | 10 | 12 | 4 |
loadstart - 当程序开始加载时,loadstart 事件将被触发。
progress - 进度事件会被触发用来指示一个操作正在进行中。
abort - 当一个资源的加载已中止时,将触发 abort 事件。
error - 当一个资源加载失败时会触发error事件。
load - 当一个资源及其依赖资源已完成加载时,将触发load事件。
timeout - 当进度由于预定时间到期而终止时,会触发timeout 事件。
loadend - 当一个资源加载进度停止时 (例如,在已经分派“错误”,“中止”或“加载”之后),触发loadend事件。
readystatechange - readystatechange 事件会在 document.readyState属性发生变化时触发。
XMLHttpRequest Level 1 XMLHttpRequest Level 1 使用首先,创建一个 XMLHttpRequest 对象:
</>复制代码
var xhr = new XMLHttpRequest();
然后,向服务器发出一个 HTTP 请求:
</>复制代码
xhr.open("GET", "example.php");
xhr.send();
接着,就等待远程主机做出回应。这时需要监控XMLHttpRequest对象的状态变化,指定回调函数。
</>复制代码
xhr.onreadystatechange = function(){
if ( xhr.readyState == 4 && xhr.status == 200 ) {
alert( xhr.responseText );
} else {
alert( xhr.statusText );
}
};
上面的代码包含了老版本 XMLHttpRequest 对象的主要属性:
xhr.readyState: XMLHttpRequest对象的状态,等于4表示数据已经接收完毕。
xhr.status:服务器返回的状态码,等于200表示一切正常。
xhr.responseText:服务器返回的文本数据。
xhr.statusText:服务器返回的状态文本。
XMLHttpRequest Level 1 缺点只支持文本数据的传送,无法用来读取和上传二进制文件。
传送和接收数据时,没有进度信息,只能提示有没有完成。
受到"同域限制"(Same Origin Policy),只能向同一域名的服务器请求数据。
XMLHttpRequest Level 2XMLHttpRequest Level 2 针对 XMLHttpRequest Level 1 的缺点,做了大幅改进。具体如下:
可以设置HTTP请求的超时时间。
可以使用FormData对象管理表单数据。
可以上传文件。
可以请求不同域名下的数据(跨域请求)。
可以获取服务器端的二进制数据。
可以获得数据传输的进度信息。
设置超时时间新版本 XMLHttpRequest 对象,增加了 timeout 属性,可以设置HTTP请求的时限。
</>复制代码
xhr.timeout = 3000;
上面的语句,将最长等待时间设为3000毫秒。过了这个时限,就自动停止HTTP请求。与之配套的还有一个timeout事件,用来指定回调函数。
</>复制代码
xhr.ontimeout = function(event){
console.log("请求超时");
}
FormData 对象
AJAX 操作往往用来传递表单数据。为了方便表单处理,HTML 5新增了一个 FormData 对象,可以用于模拟表单。
FormData 简介构造函数 FormData()
用于创建一个新的 FormData 对象。
语法
</>复制代码
var formData = new FormData(form)
参数
form 可选 - 一个 HTML 上的
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/82364.html
摘要:同源策略禁止使用对象向不同源的服务器地址发起请求。借助于决解同源策略决解同源策略,新方案跨域资源共享这里讲的重点跨域资源共享提供的标准跨域解决方案,是一个由浏览器共同遵循的一套控制策略,通过的来进行交互主要通过后端来设置配置项。 了解下同源策略 源(origin)*:就是协议、域名和端口号; 同源: 就是源相同,即协议、域名和端口完全相同; 同源策略:同源策略是浏览器的一个安全...
摘要:异步请求线程在在连接后是通过浏览器新开一个线程请求将检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件,将这个回调再放入事件循环队列中。 基础:浏览器 -- 多进程,每个tab页独立一个浏览器渲染进程(浏览器内核) 每个浏览器渲染进程是多线程的,主要包括:GUI渲染线程 JS引擎线程 也称为JS内核,负责处理Javascript脚本程序。(例如V8引擎) JS引擎线程负...
摘要:在本文中,我们将介绍一些在中发出请求的流行方法。是发出异步请求的传统方式。如果等于,则表示请求已完成。是进行调用的最简单方法之一。它需要三个参数请求的地址您要发送的数据和回调函数。事实上,这是制作请求的最佳和最喜欢的方式之一。 showImg(https://segmentfault.com/img/bVbdEhE?w=749&h=450);JavaScript具有很好的模块和方法来发...
阅读 2415·2021-11-23 09:51
阅读 1264·2021-11-22 13:52
阅读 3684·2021-11-10 11:35
阅读 1318·2021-10-25 09:47
阅读 3088·2021-09-07 09:58
阅读 1134·2019-08-30 15:54
阅读 2901·2019-08-29 14:21
阅读 3107·2019-08-29 12:20