XMLHttpRequest 的标准化


实际上,早期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方法相当于readyStateXMLHttpRequest.DONE,然而,事件处理器的第一个参数会是ProgressEvent,它继承自Event,可以透过lengthComputable获知可否评算响应的长度,total获取响应的长度,loaded获取目前已加载的长度,可搭配onprogress来实现进度显示。

除了onloadonprogress事件处理器之外,还有onloadstartonabortonerrorontimeoutonloadend等处理器,事件发生时,处理器的第一个参数都是ProgressEvent,而XMLHttpRequesttimeout属性也是该规格定义之一。

如果响应是二进制数据,新的XMLHttpRequest可以直接透过responseType直接获取,新的XMLHttpRequest也可以处理文件上传,甚至透过onprogress来了解进度等。

新的XMLHttpRequest也支持 Cross-origin resource sharing(CORS),也就是可实现跨网域请求,只要伺服端支持 CORS 协议,XMLHttpRequest在跨域请求时的方式并不用有特别的改变。

其他新功能还有,定义了FormData支持上传文件,若必须得知上传进度,可以借由XMLHttpRequestupload获取XMLHttpRequestUpload对象,透过注册其onprogress来实现等。

在 2011 年时,新版的XMLHttpRequest草案规范被纳入了原本的XMLHttpRequest规范中,成为了 XMLHttpRequest Level 1 规范的内容,而曾经的 XMLHttpRequest Level 2 就被废弃了。

目前来说,想要获取XMLHttpRequest的规范,可以在〈XMLHttpRequest Level 1〉这个入口页面找到,而现行规格的内容,可以在〈XMLHttpRequest Living Specification〉查看。

有些浏览器中,令XMLHttpRequest对象在事件注册时,可以使用addEventListener之类的方法,不过,那并不在〈XMLHttpRequest Living Specification〉的规范之中。


展开阅读全文