【问题标题】:How can I add properties to an object in IE6?如何在 IE6 中为对象添加属性?
【发布时间】:2009-02-27 11:40:46
【问题描述】:

我在使用 AJAX 时遇到了一个特别棘手的问题,它在 IE7 和 Firefox 中运行良好,但在 IE6 中却不行。

我有一个非常简单的本土 AJAX 框架,它要求我通过添加几个属性来扩展 XMLHttpRequest 对象(或者在 IE 的情况下为 XMLHttpRequest ActiveXObject)。相关部分代码如下:

//the following is the constructor for our ajax request object - which extends the standard object. It is used in the method below it   
function FD_XMLHttpRequest() {     
  var xmlHttpReq = false;
  if (window.XMLHttpRequest) { // Mozilla/Safari
    xmlHttpReq = new XMLHttpRequest();
  } else if (window.ActiveXObject) { // IE
    xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
  }
  //we now have the request object - extend it with things we might need to store with it
  xmlHttpReq.onReturnFunc = null; //******ERROR IN IE6******
  xmlHttpReq.targetDivId = null;  //******ERROR IN IE6******
  return xmlHttpReq;  
} 
//To use:
myXHReq = new FD_XMLHttpRequest();
myXHReq.onReturnFunc = someFunction; 
myXHReq.targetDivId = "myDiv";  

问题似乎是 FF 和 IE7 允许以这种方式扩展对象,但 IE6 不允许(它抱怨“对象不支持此属性或方法”)。我尝试过使用“原型”属性和“真实”继承的各种方法,但我无法完全理解 IE6 发生了什么

【问题讨论】:

    标签: javascript ajax internet-explorer prototype


    【解决方案1】:

    在 IE7 上,您将获得一个“本机 JavaScript”XMLHttpRequest 对象。与所有 JavaScript 对象一样,您可以毫无问题地向它们添加任意属性 — 尽管这并不总是一个好主意,因为如果未来的浏览器添加了它自己的真正的“onReturnFunc”成员,那么您就会混淆它。

    在 IE6 或 IE7 上,当禁用“本机 XMLHttpRequest”选项时,您将回退到使用原始 ActiveX XMLHttpRequest。但是,ActiveX 对象的行为与 JavaScript 对象完全不同,其中一个区别是您不能添加任意属性。

    一般来说,您应该有自己的包装类来保存您需要的任何额外数据,并保存对“真实”XMLHttpRequest 对象的引用。

    【讨论】:

    • 好的,但我仍然不完全理解 JS 中的 var/method 范围,尤其是“this”var - 这是一个奇怪的小野兽。假设我有一个包装器对象,并且该对象的一个​​方法创建了请求,我将如何定义 onreadystatechange 函数,以及它如何引用包装器(这个?)
    • 是的,“这个”有点草皮。请参阅stackoverflow.com/questions/585840/x/585918#585918 以了解有关其实际 工作原理的更多信息。您可能希望在包装器的回调上创建一个绑定方法,然后将 onreadystatechange 设置为该方法。
    【解决方案2】:

    问题是它的浏览器提供了支持expandos的XMLHttpRequest。但是 IE6 没有 XMLHttpRequest,因此您的代码会使用 ActiveXObject。 MSXML 提供的对象不支持扩展。

    更好的方法是使用闭包,例如:-

    function getContentForElem(url, elem, completed)
    {
        var xhr = getXhr()
        xhr.open("GET", url, true)
        xhr.onreadystatechange = fnstatechange
        xhr.send()
        return xhr;
    
        function fnstatechange()
        {
           if (xhr.readyState == 4)
           {
               if (xhr.status == 200)
               {
                    elem.innerHTML = xhr.responseText;
               }
               if (completed) completed(xhr)
           }
        }
    }
    
    function getXhr()
    {
        var xhr;
        if (window.XMLHttpRequest)
            xhr = new XMLHttpRequest();
        else
            xhr = new ActiveXObject("MSXML2.XMLHTTP.3.0");
        return xhr;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 2015-11-15
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多