25

在 IE11 中查看我们的网站以找出问题所在时,我们注意到以下代码未正确评估为“true”:

this.isIEBrowser = false;
if (window.ActiveXObject){
    this.isIEBrowser = true;
}

经过进一步调查,似乎typeof(window.ActiveXObject)导致"undefined",而在 IE10 模式下,它导致"function"。当我将window.ActiveXObject添加到监视列表时,它显示为函数类型。同样,如果我执行typeof(window.ActiveXObject.prototype),我会得到IE11 和 IE10 的“对象”

有谁知道为什么会发生这种变化,或者我在哪里可以找到 IE10 和 IE11 之间这些类型差异的列表,以便我可以弄清楚还有哪些其他重大变化?


2013 年 10 月 30 日更新:

当我把它放进去的时候,我原本以为这与 IE11 javascript 引擎中的类型评估不同。我已经意识到这个问题是特定于 window.ActiveXObject 对象的。所以我把这个问题的名字从“IE11中的Typeof差异”改为“IE11中的window.ActiveXObject差异”

4

7 回答 7

20

以下适用于 IE11:

this.supportActiveX = ("ActiveXObject" in window);

但这更好,更可靠:

this.supportActiveX = 
    (Object.getOwnPropertyDescriptor && Object.getOwnPropertyDescriptor(window, "ActiveXObject")) || 
    ("ActiveXObject" in window);
于 2013-11-27T13:53:11.250 回答
20

您不能对 IE11 使用该检查:

http://msdn.microsoft.com/en-us/library/ie/dn423948%28v=vs.85%29.aspx

从 IE11 开始,导航器对象支持插件和 mimeTypes 属性。此外,window.ActiveXObject 属性对 DOM 是隐藏的。(这意味着您不能再使用该属性来检测 IE11。)

于 2013-10-28T15:38:39.057 回答
6

您可以使用以下代码来检测 IE

var iedetect = 0;
if(window.ActiveXObject || "ActiveXObject" in window)
{
    iedetect = 1;
}
于 2015-01-07T11:59:11.337 回答
4

无法对此答案添加评论,抱歉。

我发现在 IE11 中你不能使用 "ActiveXObject" in window它来检查实际的 ActiveX 支持。

在条件语句中执行 ActiveXObject 检测将失败

在 IE11 中

"ActiveXObject" in window
> true

typeof window.ActiveXObject
> "undefined"

但是(这是 IE 所在的地方)

window.ActiveXObject !== undefined
> true

所以显然只有这个检查是可靠的

typeof window.ActiveXObject !== "undefined"
> false

IE10

typeof window.ActiveXObject !== "undefined"
> true
于 2015-04-08T06:41:19.087 回答
3

实际上,我观察到的是,在 IE9 中,这两个都评估为 true:

this.supportActiveX = (typeof window.ActiveXObject !== 'undefined');

this.supportActiveX = ("ActiveXObject" in window);

但在 IE11 中,第一个语句的计算结果为 false,而第二个语句为 true。我对这种行为没有解释,但它表明(窗口中的“ActiveXObject”)选项更可靠。

于 2014-04-17T12:17:47.167 回答
2

我讨厌成为“那个人”,但是

 this.supportActiveX = (typeof window.ActiveXObject !== 'undefined')

比 mhu 的答案稍微安全一些,因为 undefined 是可分配的。

于 2014-02-24T17:45:00.130 回答
1

我们库中的代码示例:

if (document.implementation && document.implementation.createDocument && typeof XSLTProcessor != 'undefined') { 
    // chrome, firefox etc
}
else try {
    // IE
    var xml = new ActiveXObject("MSXML2.DOMDocument");
    var xsl = new ActiveXObject("Microsoft.XMLDOM");
}
catch (e) {
    // no support
    console.log('transformxml: no browser support');
    return null;
}
于 2013-11-18T15:09:39.493 回答