Javascript 如何向IE6中的对象添加属性?

Javascript 如何向IE6中的对象添加属性?,javascript,ajax,internet-explorer,prototype,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 objec

我在使用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”属性和各种“real”继承方法,但我不能完全理解IE6在IE7上的情况,因为您得到的是一个“原生JavaScript”XMLHttpRequest对象。与所有JavaScript对象一样,您可以毫无问题地向它们添加任意属性 — 虽然这并不总是一个好主意,因为如果未来的浏览器添加了一个真正的“onReturnFunc”成员,那么你就会把它弄糊涂

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


通常,您应该拥有自己的包装器类,该类保存所需的任何额外数据,并保存对“真实”XMLHttpRequest对象的引用。

问题在于浏览器提供的XMLHttpRequest支持expandos。但是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;
}

好的,但我仍然不完全理解JS中的var/方法范围,特别是“this”var-这是一个奇怪的小野兽。假设我有一个包装器对象,该对象的一个方法创建了请求,我将如何定义onreadystatechange函数,它将如何引用包装器(这个?)是的,“这个”有点夸张。有关其实际工作方式的更多信息,请参阅。您可能希望在包装器的回调上创建绑定方法,然后将onreadystatechange设置为该值。