XMLHttpRequest 增强功能

Internet Explorer 10 和使用 JavaScript 的 Windows 应用商店应用引入了对于 XMLHttpRequest 对象的若干增强功能,能够为不断出现的标准提供更好的支持并且更容易支持常见的开发者方案。 这些方案包括:

  • 下载和上载图像、视频和音频等二进制文件(无需使用插件)。
  • 下载多媒体内容流(无需使用插件)。
  • 改进了对 XMLHttpRequest 操作状态的解读。
  • 改进了与其他浏览器的互操作性。

这些更改将在以下各节中详细介绍:

二进制对象的上载和下载

Internet Explorer 10 使 XMLHttpRequest 扩展为可支持二进制数据。 通过增加对文件 API 规范Blob 接口的支持,此功能已部分完成。

当一个 XMLHttpRequest 对象的 responseType 属性被设置为“blob”时,与该请求关联的数据将作为二进制数据进行处理。 这会影响下载请求的响应属性的值(例如,GET)。

下面的示例演示如何使用 XMLHttpRequest 将图像下载到 Blob 对象,然后将结果分配到网页上的图像元素。


var req = new XMLHttpReqest();
xhr.open("GET", "download?name=" + name, true);
xhr.responseType = "blob";
xhr.onreadystatechange = function () {
  if (xhr.readyState == xhr.DONE) {
    var blob = xhr.reponse;
    var image = document.getElementById("my-image");
    image.addEventListener("load", function (evt) {
      URL.revokeObjectURL(evt.target.src);
    }
    image.src = URL.createObjectURL(blob);
  }
}
xhr.send();

当下载请求的 responseType 属性被设置为 "ms-stream" 时,内容能够被即时处理。如以下示例所示。


var xhr = new XMLHttpReqest();
xhr.open("GET", "download?name=" + name, true);
xhr.responseType = "ms-stream";
xhr.onreadystatechange = function () {
  if (xhr.readyState == xhr.LOADING) {
    var stream = xhr.reponse;
    var video = document.getElementById("my-video");
    video.addEventListener("loadeddata", function (evt) {
      URL.revokeObjectURL(evt.target.src);
    }
    video.src = URL.createObjectURL(stream);
  }
}
xhr.send();

彗星流支持

通过允许在上载对 XMLHttpRequest 请求的响应的同时读取 responseText 属性,Internet Explorer 10 可支持多段 HTTP 流(又称彗星流),如以下示例所示:


xhr.open("GET", url);
xhr.timeout = timeout;
xhr.onreadystatechange = function() {
  if (this.readyState >= 3 && this.status == 200) {
    var content = this.responseText;
    handleContent(content);
  }
}
xhr.send();

在较早版本的 Windows Internet Explorer 中,只有在 readyState 属性被设置为“done”时,才能读取 responseText 属性。

请注意,responseText 属性将返回到目前为止响应读取的完整值。 如果你希望处理单个数据包(与接收到它们时一样),则可以使用 progress 事件(详见下一节)或跟踪在 readyStateChange 事件的每个迭代中的 responseText 的长度,如以下示例所示。


xhr.open("GET", url);
xhr.timeout = timeout;
xhr.onreadystatechange = function() {
  if (typeof this.index == "undefined")
    this.index = 0;
    
  if (this.readyState >= 3 && this.status == 200) {
    var content = this.responseText;
    handleContent( content.substring(this.index) )
    this.index = content.length;
  }
}
xhr.send();

增强的事件支持

Internet Explorer 10 将 XMLHttpRequest 对象扩展为可支持下列在 XMLHttpRequest 级别 2 规范中定义的事件:

事件说明

loadstart

在请求开始时触发。

progress

在请求发送或接收数据期间,在服务器指定的时间间隔触发。

abort

在请求被取消时触发,例如,在调用 abort() 方法时。

error

在请求失败时触发。

load

在请求成功完成时触发。

timeout

在作者指定的时间段已经结束时触发。

loadend

在请求完成时触发,无论请求是成功还是失败。

 

XMLHttpRequest 对象的事件处理遵循在 DOM 事件级别 3 规范和进度事件规范中指定的模型,如以下示例所示。


var xhr = new XMLHttpRequest();
var url = "some-url";

xhr.timeout = 5000;
xhr.addEventListener("timeout", handleTimeout(evt), false);

xhr.onprogress = function(evt) {
  handleEvent("data: " + this.responseText);
  // Calculate progress 
  var str = "";
  if (evt.lengthComputable) {
    var percent = 100 * evt.loaded / evt.total;
    str = percent + "%. Current total size: " + this.responseText.length);
  } else {
    str = "Progress unknown. Current total size: " + this.responseText.length;
  }
  updateProgress(str);
}
xhr.open("GET", url);
xhr.send();

XMLHttpRequest 的跨源资源共享 (CORS)

Internet Explorer 10 添加了与 XMLHttpRequest (XHR)对象相关的跨源资源共享 (CORS) 的支持。 根据跨源资源共享规范中的定义,CORS 使用 HTTP 头启用跨域 Web 请求,这通常受到同一站点源策略的限制。

默认情况下,同一站点源策略会阻止网站从其他域的服务器中请求资源。但是,如果相应的管理员选择允许此类请求,则支持 XMLHttpRequest (XHR) 请求的 CORS 的浏览器就可以访问其他域的资源。

当一个网页发出 XHR 请求时,Internet Explorer 发送一个源头数据到目标服务器;该头数据包含请求的协议方案(http:// 或 https://)和发出请求的网页的主机名。 如果目标服务器批准了请求,它将返回一个 Access-Control-Allow-Origin 头数据,并允许请求被处理。

XMLHttpRequest 对象现在支持 withCredentials 属性,它允许 XHR 请求以包含授权机制。右关更多信息,请参阅 XMLHttpRequest 级别 2 规范。

withCredentials 属性可用于检测 CORS 支持,如以下示例所示。


var url = "http://contoso.com/services/"
if( window.XMLHttpRequest ) {
  var oReq = new XMLHttpRequest();
  if( oReq.withCredentials == true ) {
    oReq.open("GET", url, true);
    oReq.onload = handleResponse();
    oReq.send( null );
  } else {
  // CORS not support.  Handle fallback
  }
} else { 
  // XMLHttpRequest not supported; handle fallback
}

API 参考

XMLHTTPRequest (XHR) and AJAX Support

示例和教程

关于原生 XMLHTTP
AJAX - Windows Internet Explorer 8 中的连接增强
AJAX 导航简介
跨域请求 (XDR) 简介
Windows Internet Explorer 8 中的 XMLHttpRequest 增强

有关 Internet Explorer 的 Test Drive 演示

跨站点上载

IEBlog 文章

IE10 Release Preview 中的 XMLHttpRequest responseXML
IE10 中适用于 XHR 的 CORS
使用 JavaScript 中的“Promises”进行异步编程
适用于开发人员的 ActiveX 筛选

规范

XMLHttpRequest 级别 2

 

 

显示:
© 2015 Microsoft