如何在IE6中为对象添加属性?

时间:2009-02-27 11:40:46

标签: javascript ajax internet-explorer prototype

我使用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没有(它抱怨“对象不支持此属性或方法”)。我尝试过使用“prototype”属性和各种“真正”继承方法,但我无法理解IE6的内容

2 个答案:

答案 0 :(得分:1)

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

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

通常,您应该拥有自己的包装类,它包含您需要的任何额外数据,并且包含对“真正的”XMLHttpRequest对象的引用。

答案 1 :(得分:1)

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

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

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;
}