在IE9中使用新的XMLHttpRequest会导致JScript运行时错误:对象不支持此属性或方法。

4
只在IE9中出现问题(在Firefox中运行良好)已尝试将安全设置降至最低。我不确定其他版本的IE是否存在该问题,因为我只安装了IE9。
环境:asp.net 3.5 webforms 脚本框架:Anthem.NET、jquery
Anthem脚本试图创建XMLHttpRequest实例并失败了。我尝试在页面上自己创建它,但是出现了同样的错误。在同一个项目中,我创建了一个新的HTML页面,它可以正常运行。因此可能是一些脚本冲突引起的...
有人知道原因吗?
以下是在系统上运行的Anthem.NET框架中导致错误的原始代码(第3行)。
function Anthem_GetXMLHttpRequest() {
if (window.XMLHttpRequest) {  // <-- This passes as True! window.XMLHttpRequest is {...}
    return new XMLHttpRequest(); // <---- Fails here
} else {
    if (window.Anthem_XMLHttpRequestProgID) {
        return new ActiveXObject(window.Anthem_XMLHttpRequestProgID);
    } else {
        var progIDs = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
        for (var i = 0; i < progIDs.length; ++i) {
            var progID = progIDs[i];
            try {
                var x = new ActiveXObject(progID);
                window.Anthem_XMLHttpRequestProgID = progID;
                return x;
            } catch (e) {
            }
        }
    }
}
return null;

以下是 Window.XMLHttpRequest 的值:

enter image description here

这里是我自己制造的失败图片:

enter image description here

更新: 刚刚发现在兼容模式下可以正常工作!而且当我回到普通模式时,它又能正常工作了! 顺便说一下:文档模式处于 Quirks 模式(这是默认设置)。


我无法开始,但它永远不会结束...这个页面有很多脚本...我的问题是,你如何陷入这种情况,使得你的浏览器无法创建一个XMLHttpRequest对象? - danfromisrael
如果您检查或将其打印到控制台中,window.XmlHttpRequest的值是多少? - hugomg
这里是控制台: window.XMLHttpRequest 值为 {...} - danfromisrael
3个回答

4

最近我遇到了一个问题,我发现如果将创建XMLHttpRequest的代码放在一个函数内,在窗口加载完成后执行这个函数,那么就可以每次都正常工作。尝试将你的代码放在这里:

window.onload = function() {
    var lala = new XMLHttpRequest();
}

如果您使用jQuery:

$(function() {
    var lala = new XMLHttpRequest();
});

嗨,Ryan。好久不见了,我没有那个代码来测试你的解决方案是否有效。尽管如此,我仍想标记一个正确答案来回答这个问题。你能否确认这段代码解决了问题? - danfromisrael

1
在IE(< v.9)中,window#XMLHttpRequestundefined,因为这是一个特定于浏览器的全局Object(即适用于符合W3C标准的浏览器,如Mozilla或基于Webkit的浏览器以及Opera)。
我自己也不太理解。
if(window.XMLHttpRequest)

并不会返回 false,但是你也无能为力。

然而,你可以在那之前添加一个代码分支来检查 window#ActiveXObject(即 Internet Explorer)。

if(!! window.ActiveXObject) { // same as typeof window.ActiveXObject !== "undefined"
    /* use MSXML */
}
else if(!! window.XMLHttpRequest) {
    /* use XMLHttpRequest */
}
else throw Error("Browser does not support XHR.") ;

如果您此时无法修改源代码并且问题仍然存在,您可能想要更改框架。


编辑:我刚刚注意到您说的问题出现在IE 9中。实际上,这不应该是问题,因为IE 9支持XMLHttpRequest Object


我不想触碰国歌的源代码,因为它应该工作正常,但如果有必要,我会这样做... 我已经编辑了问题,并添加了关于window.XMLHttpRequest状态和更多调试信息的详细信息... - danfromisrael
@danfromisrael:所以它是一个空的Object?太奇怪了。你是在Visual Studio的预览中运行这个吗?也许这就是真正的问题所在(VS可能在这里使用的是IE < 9)。无论如何,明显的解决方法是使用其他框架的XHR(XMLHttpRequest)封装器。 - FK82
vs2008 预览版?但我在 IE9 和 Firefox 上运行它...当我点击运行和调试(绿色播放按钮)时,它会启动一个本地服务器,我可以通过复制和粘贴 locahost 地址从任何浏览器加载网站... VS2008 是否会以某种方式影响 ie9?我认为 IE9 的定义可能会阻止 JavaScript 能力,但所有安全定义都设置为最低... - danfromisrael
我猜这一定是某种预览功能,因为警告框的标题是“Microsoft Visual Studio”(而不是“Microsoft Internet Explorer”)。至于VS内部的工作原理,我不清楚。 - FK82
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/6033/discussion-between-fk82-and-danfromisrael - FK82
显示剩余2条评论

1

信不信由你,ie9实际上不支持XMLHttpRequest(你可以在Internet选项中更改一些设置作为最终用户,但我相信这不会是对你的老板的可接受答案)。

对于ie9,你需要这样做:

var xmlhttp;
if (ie9)
{
    xmlhttp=new XDomainRequest();
}
else
{
    xmlhttp=new XMLHttpRequest();
}

然后,您通常会申请以下位置(适用于常规浏览器):

xmlhttp.onreadystatechange=function()
{
     if (xmlhttp.readyState==4 && xmlhttp.status==200)
     {
          // do your thing
     }
};

您需要这样做(适用于IE9):

You'll have to do this instead (for ie9):

if (this.ie9)
{
     xmlhttp.onload = function()
     {
         // do your ie9 thing
     };
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接