【问题标题】:window.ActiveXObject difference in IE11IE11中window.ActiveXObject的区别
【发布时间】:2013-11-07 11:20:11
【问题描述】:

当我们在 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 的 "object"

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


2013 年 10 月 30 日更新:

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

【问题讨论】:

  • 很确定这是对 IE11 进行的故意更改之一,以避免被旧版 IE 检查捕获。

标签: javascript internet-explorer-11


【解决方案1】:

您不能对 IE11 使用该检查:

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

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

【讨论】:

  • 谢谢乔,这个链接很有帮助。我在link 找到了一个与window.ActiveXObject 相关的jquery 票证,它指向link,它解释了ActiveXOBject 检测将在有条件的情况下失败(我的OP 示例)。使用window.ActiveXObject !== undefined 的jquery 票证建议有效,其他地方的另一个使用"ActiveXObject" in window 的建议也有效。我也看到了 try/catch 方法,但我不想实例化一个 activex,只检查它是否存在,因此是 IE
  • 试图以这种方式检测 IE 是短视的,因为这是 IE 团队明确试图阻止的,并且它们的兼容性问题可能会在未来的版本中得到改进。相反,功能检测您需要的实际功能。
  • @EricLaw,如果您需要的功能是 ActiveX 怎么办?我不想为了检查而实例化一个实际的 ActiveX 对象。
  • @TomWinter:您的问题是:“我的网站需要 ActiveX。但我不想使用 ActiveX。”我想我不明白这个问题。
  • @EricLaw,如果我在 IE 下运行,我需要使用 MSXML,一个 ActiveX 对象,因为 IE 中的原生 XML 内容不支持我需要的东西(document.evaluate - 就我可以说;如果我错了,我很想知道 ;-) 在 IE 之外,我显然需要使用本机。我有一些执行 XML 内容的全局函数,我需要在页面加载时将它们设置为正确的实现(MSXML 与 Native)。我不想仅仅为此而实例化一个 MSXML 文档。我想我可以在第一次调用 XML 函数时进行懒惰检查,但这很痛苦。我想要一个简单的方法。 ;-)
【解决方案2】:

以下工作在 IE11 中:

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

但这更好更可靠:

this.supportActiveX = 
    (Object.getOwnPropertyDescriptor && Object.getOwnPropertyDescriptor(window, "ActiveXObject")) || 
    ("ActiveXObject" in window);

【讨论】:

  • 是的,根据上面的答案,它可以工作。 ActiveXObject 在 IE11 中未定义。所以它可能存在于window 但作为undefined。所以不要那样做。做this.supportActiveX = (window.ActiveXObject !== undefined);
  • 使用 getOwnPropertyDescriptor 找到了更好的检查:groups.google.com/d/msg/comp.lang.javascript/EOziMLM_zEc/…
【解决方案3】:

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

var iedetect = 0;
if(window.ActiveXObject || "ActiveXObject" in window)
{
    iedetect = 1;
}

【讨论】:

    【解决方案4】:

    无法向 this answer 添加评论,抱歉。

    我发现在 IE11 中你 can't use "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
    

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

      • +1:你是对的。在这种情况下不应使用 typeof。更新了我的答案。
      【解决方案6】:

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

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

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

      【讨论】:

      • 你是对的,但是检查不正确,请参阅更新我的答案
      【解决方案7】:

      我们库中的代码示例:

      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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-06
        • 2016-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-12
        相关资源
        最近更新 更多