Javascript 如何向IE6中的对象添加属性?
我在使用AJAX时遇到了一个特别棘手的问题,它在IE7和Firefox中运行良好,但在IE6中却不行 我有一个非常简单的自主开发的AJAX框架,它要求我通过添加两个属性来扩展XMLHttpRequest对象(或者在IE中扩展XMLHttpRequest ActiveXObject)。守则的有关章节如下: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
//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设置为该值。