打印

BX9041: 各浏览器创建 XMLHttpRequest 对象的方式不同

作者:陆远

标准参考

XMLHttpRequest 对象可以实现以客户端脚本发送 HTTP 请求。

关于 XMLHttpRequest 的更多信息,请参考 XMLHttpRequest 规范。

问题描述

各浏览器通过 XMLHttpRequest 对象可以实现以客户端脚本发送 HTTP 请求,在 IE6 中这个对象是以 ActiveXObject 创建的(这种方式创建的对象的方法及属性名是大小写不敏感的),在其他浏览器中则可以直接使用 XMLHttpRequest 构造器创建。

造成的影响

若编写 Ajax 应用时没有考虑到在各浏览器中创建 XMLHttpRequest 对象的差异,将造成代码在某些浏览器中不能正常运行。

受影响的浏览器

所有浏览器

问题分析

1. Ajax 简介

Ajax 的全称是 Asynchronous JavaScript and XML 的简称,该技术在 1998 年前后得到了应用。允许客户端脚本发送 HTTP 请求(XMLHTTP)的第一个组件由 Outlook Web Access 小组写成。该组件原属于微软 Exchange Server,并且迅速地成为了 Internet Explorer 4.0 的一部分。

Ajax 这个词由《Ajax: A New Approach to Web Applications》一文所创,该文的迅速流传提高了人们使用该项技术的意识。另外,对Mozilla/Gecko的支持使得该技术走向成熟,变得更为易用。

注:本段文字摘录于维基百科-Ajax

2. 各浏览器中创建 XMLHttpRequest 对象的方法

在 IE7 之前,使用 Ajax 所必须的 XMLHttpRequest 对象是通过如 "new ActiveXObject("Microsoft.XMLHTTP")" 等一系列创建 XMLHttp 自动化对象的方式来完成的。该对象中与 window.XMLHttpRequest 对象内的各属性及方法大体一致。

在 IE7 IE8 中,同时支持着两种创建 XMLHttpRequest 对象的方法,一种为 IE 独有的 ActiveXObject 创建的自动化对象,另一种为更加标准及通用的 window.XMLHttpRequest 对象。

而在其他浏览器中,只支持使用标准的 window.XMLHttpRequest 来创建。

解决方案

判断浏览器版本,使用不同的 XMLHttpRequest 对象创建方式。如:

funciton getXHR(){
  var xhrObj;
  try {
    xhrObj = new XMLHttpRequest();
  } catch (e) {
    var aTypes = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
    var len = aTypes.length;
    for (var i = 0; i < len; i++) {
      try {
        xhrObj = new ActiveXObject(aTypes[i]);
      } catch (e) {
        continue;
      }
      break;
    }
  }
  finally {
    return xhrObj;
  }
}

参见

知识库

相关问题

测试环境

操作系统版本: Windows 7 Ultimate build 7600
浏览器版本: IE6
IE7
IE8
Firefox 3.6.3
Chrome 6.0.422.0 dev
Safari 4.0.5
Opera 10.53
测试页面:  
本文更新时间: 2010-08-06

关键字

Ajax XMLHttpRequest ActiveXObject