2

IE有时很糟糕。直到 IE 10,IE 才提供对 XMLHttpRequest 对象的支持。相反,您必须使用 XActiveXObject 对象来运行 AJAX 调用。默认情况下,JQuery 会启动这个对象,并在它存在的情况下在整个三元函数中维护它(本质上,如果你的浏览器是 IE,那么它一直都是如此)。

但是,您已经可以看到问题所在。为了使用这个 ActiveX 对象,您必须调整 IE 中的安全设置,以允许 scriplet、未签名的 ActiveX schtuff 等。

有没有办法绕过这些安全设置(比如安装 CAB 文件来签署该死的东西),以便最终用户不必摆弄他们的浏览器设置,一切都可以开箱即用?

4

2 回答 2

4

jQuery 不像您建议的那样在 Internet Explorer 中偏爱 ActiveX 而不是 XMLHttpRequest。相反,它检查它的存在,然后继续检查文件 a 是否是本地文件。如果不满足其中任何一个条件,则会发出标准 XHR 请求。

jQuery.ajaxSettings.xhr = window.ActiveXObject 
    // If ActiveXObject exists, and the file is not local, return Standard XHR
    // If ActiveXObject exists, and the file is local, return ActiveXHR
    ? function() {
        return !this.isLocal && createStandardXHR() || createActiveXHR(); } 
    // If ActiveXObject doesn't exist, use StandardXHR
    : createStandardXHR;

同样的事情几乎可以这样写:

jQuery.ajaxSettings.xhr = (window.ActiveXObject && this.isLocal) 
    ? createActiveXHR() 
    : createStandardXHR();

希望这更容易理解。

我应该注意到这在 jQuery 2.0 中发生了巨大的变化:

jQuery.ajaxSettings.xhr = function() {
    try {
        return new XMLHttpRequest();
    } catch( e ) {}
};
于 2013-04-23T16:07:07.190 回答
3

所以,这就是我为纠正这种情况所做的事情。我原来的问题如下:

如何在 IE 中进行 Ajax 调用并强制它绕过 ActiveX 安全设置。

正如我们在上面的评论中所讨论的,在 JQuery 1.8.2 中,ActiveXObject 仅在 ajaxsettings.isLocal 为真时才用于 IE,在本例中是这样。我们不支持 IE8 以下的任何东西,它具有 XMLHttpRequest 的完整实现(当然,它不使用 ActiveX),因此我想确保 Ajax 总是使用 XMLHttpRequest。

因此,我在全局级别进行了以下设置更改:

$ajaxSetup({
    isLocal: false
});

这导致 IE 总是认为 Ajax 调用是跨域的,迫使 JQuery 使用 XMLHttpRequest 对象,完全绕过了识别甚至关心 IE 的 ActiveX 安全设置的需要。

结案。

于 2013-04-23T17:46:05.883 回答