换一种思路:解决Ajax程序与IE7不兼容的问题

导读:

  http://www.netpu.net
  网普科技版权所有,转载请注明作者和出处并保持文章原貌
  (网普科技优质廉价美国主机、美国LINUX虚拟主机服务)
   原文地址
  http://bbs.netpu.net/viewthread.php?tid=3138
   问题提出
  最近计划重构网普科技的网站,小试牛刀一下,用PHP+XAjax实现了一个功能简单的小页面(http://www.netpu.net/test/test.php)。不曾想这个页面在Firfox中测试一直很正常,到IE7下测试则时而正常,时而出错。打开XAjax的Debug功能,也没能获取有价值的信息,非常郁闷。
  于是使用Ajax+IE7作为关键字,到搜索引擎中去搜索,找到很多关于Ajax代码在IE7下运行出错的帖子,但都是有人发问无人回答,看来只好自己去解决啦。
   解决思路
  既然这个页面在Firefox和IE6上都运行正常,那么我们来看看Firefox与IE6、IE7在处理Ajax代码时都有哪些区别吧?
  我们知道,Ajax 应用程序的核心是XMLHttpRequest,但是由于不同浏览器的兼容问题,创建这个对象的方法是有很大的区别的。
  在Mozilla、Firefox、Safari、Opera等浏览器上,使用下边的语句创建XMLHttpRequest: CODE: [Copy to clipboard]
  var xmlHttp = new XMLHttpRequest();
  
  而在IE6及以下版本,则使用以下语句创建XMLHttpRequest: CODE: [Copy to clipboard]
  xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); 或
  xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  
  那IE7又与IE6有些什么区别呢?
  在MSDN上:About Native XMLHTTP一文中里边有这样的说明:
  http://msdn2.microsoft.com/en-us/library/ms537505.aspx
  In Internet Explorer 6 and earlier, XMLHTTP was implemented as an ActiveX object provided by Microsoft XML (MSXML). Beginning with Internet Explorer 7, XMLHTTP is also exposed as a native scripting object.
  也就是说IE7增加了Native XMLHTTP支持。
  同时里边给了一段示例代码: CODE: [Copy to clipboard]
  var xmlHttp = null;
  if (window.XMLHttpRequest) {
  // If IE7, Mozilla, Safari, and so on: Use native object.
  xmlHttp = new XMLHttpRequest();
  }
  else
  {
  if (window.ActiveXObject) {
  // ...otherwise, use the ActiveX control for IE5.x and IE6.
  xmlHttp = new ActiveXObject('MSXML2.XMLHTTP.3.0');
  }
  }
  
  由此可以看出,IE7比IE6多了Native XMLHTTP支持。那么会不会是这个Native XMLHTTP导致的问题呢?不用这个Native XMLHTTP会怎么样?还好IE7的设计者也考虑了这一点,IE7提供了两个功能:
  一个是通过设置来禁用“Native XMLHTTP支持”(默认是打开)。
  
   换一种思路:解决Ajax程序与IE7不兼容的问题_第1张图片
  
  挑掉Enable Native XMLHTTP support上的勾就可以禁用它了。
  另外一个功能就是兼容IE6创建XMLHttpRequest的方法。
   解决方法
  OK,既然这样,我们禁用“Native XMLHTTP支持”,看看我们的程序是否正常了?
  测试结果,我们的程序一切正常。
  但是等等,我们总不能要求用户访问我们的页面之前禁用“Native XMLHTTP支持”吧?汗一下!
  于是我们只能在Ajax的XMLHttpRequest创建代码上想办法了。
  想什么办法呢?说实话,对Ajax我是超级外行,没办法,硬着头皮来吧。既然问题出在创建XMLHttpRequest对象上,那么我们就从这里下手吧。
  网上很多文章都强调,为了跨浏览器兼容,首先检查是否支持Native XMLHTTP。
  比如这篇文章:Ajax on IE 7: Check native first
  http://ajaxian.com/archives/ajax-on-ie-7-check-native-first
  还有前文提到的IE7创建XMLHttpRequest的示例代码,也是先检查是否支持Native XMLHTTP的。看看我们用的XAjax是咋创建对象的吧。 CODE: [Copy to clipboard]
  /*
  Function: getRequestObject
  
  Construct an XMLHttpRequest object dependent on the capabilities
  of the browser.
  
  Returns:
  
  object - Javascript XHR object.
  */
  if ("undefined" != typeof XMLHttpRequest) {
  xajax.tools.getRequestObject = function() {
  return new XMLHttpRequest();
  }
  } else if ("undefined" != typeof ActiveXObject) {
  xajax.tools.getRequestObject = function() {
  try {
  return new ActiveXObject("Msxml2.XMLHTTP.4.0");
  } catch (e) {
  xajax.tools.getRequestObject = function() {
  try {
  return new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e2) {
  xajax.tools.getRequestObject = function() {
  return new ActiveXObject("Microsoft.XMLHTTP");
  }
  return xajax.tools.getRequestObject();
  }
  }
  return xajax.tools.getRequestObject();
  }
  }
  } else if (window.createRequest) {
  xajax.tools.getRequestObject = function() {
  return window.createRequest();
  }
  } else {
  xajax.tools.getRequestObject = function() {
  throw { name: 'GetRequestObject', message: 'XMLHttpRequest is not available, xajax is disabled' }
  }
  }
  
  果然不出我们预料,也是先检查是否支持Native XMLHTTP的。这样一来一旦使用的是IE7,那么IE7的Native XMLHTTP会被启用,我们的程序就会出错啦。
  换个策略,我们如果先检查ActiveX object对象呢?说做就做,我们修改了这部分代码(简单地说就是调换了一下顺序),测试,一切正常,Firefox、IE6、IE7都正常(抱歉我手头只有这几个浏览器。
  至此大功告成!您问我修改后的代码呢?这个留给大家做个小练习吧,超级简单哦。或者您可以到网普技术论坛(http://bbs.netpu.net)来寻求帮助。
  本文地址为:http://bbs.netpu.net/viewthread.php?tid=3138
   总结一下
  也许是XAjax对IE7的Native XMLHTTP支持不好,也许是我们对XAjax的使用有问题,也许真的是IE7的Native XMLHTTP有BUG,不管怎么说,我们换一个角度换一个方法解决了这个问题,也加深了我们对Ajax技术的理解。至于XAjax或者IE7何时解决这 个问题,我们拭目以待!
  另外本人初学Ajax,错漏之处在所难免,希望大家不吝赐教。
  http://www.netpu.net
  网普科技版权所有,转载请注明作者和出处并保持文章原貌
  (网普科技优质廉价美国主机、美国LINUX虚拟主机服务)

本文转自
http://blog.csdn.net/Netpu/archive/2007/08/14/1742180.aspx

你可能感兴趣的:(Ajax,function,IE,XMLhttpREquest,firefox,mozilla)