实际上,早期XMLHttpRequest
并非标准接口,就历史上来说,非同步对象的概念,始于 Microsoft 为了 Exchange Server 创建的 Outlook Web Access 概念,后来被定义为IXMLHTTPRequest
接口,并在 MSXML 程序库的第二版中实现,1999 年的 Internet Explorer 5.0 搭载了该程序库,可透过ActiveX
,使用XMLHTTP
作为包裹器来访问。
Mozilla 后来在它们的 Gecko 模版引擎中仿造了类似的接口nsIXMLHttpRequest
,行为上尽可能类似IXMLHTTPRequest
接口,而后 Mozilla 创建了XMLHttpRequest
对象作为包裹器以使用该接口,在 2002 年 Gecko 1.0 中XMLHttpRequest
获得了完整的实现,而在 Internet Explorer 之外的其他主流浏览器上,XMLHttpRequest
成了产业标准,而 Internet Explorer 要到 2006 年的 7.0 之后才有XMLHttpRequest
。
后来 W3C 在 2006 年开始着手进行XMLHttpRequest
的标准化,目标是在当时的实现中,获取可互通的最小集合,进一步地,在 2008 年发布了曾经被称为 XMLHttpRequest 2 或 XMLHttpRequest Level 2 的草案,其中包含了XMLHttpRequest
的一些扩充功能,例如在事件上,增加了onload
之类的处理器,以上例来说,可以使用onload
改写为:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
</head>
<body>
<button id='req'>获取表格</button>
<div id="table"></div>
<script type="text/javascript">
document.getElementById('req').onclick = function() {
let request = new XMLHttpRequest();
request.onload = function(evt) {
let req = evt.target;
if(req.status === 200) {
document.getElementById('table').innerHTML = req.responseText;
}
};
request.open('GET', 'XMLHttpRequest-1.txt');
request.send(null);
};
</script>
</body>
</html>
按我观看执行结果。
onload
方法相当于readyState
为XMLHttpRequest.DONE
,然而,事件处理器的第一个参数会是ProgressEvent
,它继承自Event
,可以透过lengthComputable
获知可否评算响应的长度,total
获取响应的长度,loaded
获取目前已加载的长度,可搭配onprogress
来实现进度显示。
除了onload
、onprogress
事件处理器之外,还有onloadstart
、onabort
、onerror
、ontimeout
、onloadend
等处理器,事件发生时,处理器的第一个参数都是ProgressEvent
,而XMLHttpRequest
的timeout
属性也是该规格定义之一。
如果响应是二进制数据,新的XMLHttpRequest
可以直接透过responseType
直接获取,新的XMLHttpRequest
也可以处理文件上传,甚至透过onprogress
来了解进度等。
新的XMLHttpRequest
也支持 Cross-origin resource sharing(CORS),也就是可实现跨网域请求,只要伺服端支持 CORS 协议,XMLHttpRequest
在跨域请求时的方式并不用有特别的改变。
其他新功能还有,定义了FormData
支持上传文件,若必须得知上传进度,可以借由XMLHttpRequest
的upload
获取XMLHttpRequestUpload
对象,透过注册其onprogress
来实现等。
在 2011 年时,新版的XMLHttpRequest
草案规范被纳入了原本的XMLHttpRequest
规范中,成为了 XMLHttpRequest Level 1 规范的内容,而曾经的 XMLHttpRequest Level 2 就被废弃了。
目前来说,想要获取XMLHttpRequest
的规范,可以在〈XMLHttpRequest Level 1〉这个入口页面找到,而现行规格的内容,可以在〈XMLHttpRequest Living Specification〉查看。
有些浏览器中,令XMLHttpRequest
对象在事件注册时,可以使用addEventListener
之类的方法,不过,那并不在〈XMLHttpRequest Living Specification〉的规范之中。