我使用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的内容
答案 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;
}