JavaScript:检测IE的最佳方法

Dan*_*Dan 4 javascript internet-explorer detect

阅读本文后,我发现了以下代码:

if ('v'=='\v') { // Note: IE listens on document
    document.attachEvent('onstorage', onStorage, false);
}
Run Code Online (Sandbox Code Playgroud)

这种方法'v'=='\v'是个好主意吗?这是检测IE的最短路径吗?

lon*_*day 10

如果可以避免,请不要测试浏览器.做特征检测.这意味着您的代码(更有可能)面向未来.在这种情况下,例如,如果您发现浏览器是IE并且因此决定使用attachEvent它,那么您将错过addEventListenerIE9中可用的(高级)这一事实.

在这种情况下,测试是否document.addEventListener存在.如果有,你有答案.

if (document.addEventListener) {
    document.addEventListener(...);
} else {
    document.attachEvent(...);
}
Run Code Online (Sandbox Code Playgroud)

编辑:上面的duri的评论表明,这个测试在IE9中失败了(按照标准),这实际上意味着它是一个完美的测试addEventListener,因为它可以从IE9获得.然而,对特定功能而不是特定浏览器进行编程仍然远远好得多.

  • 在99.999999%的案例中,这是关于该主题的最佳建议.但实际上,您可能需要检测IE本身而不是特定的功能/特性,这种情况非常罕见. (6认同)

Mar*_*all 9

您可以通过以下方式检查Trident,IE的引擎:

var trident = !!window.ActiveXObject;
Run Code Online (Sandbox Code Playgroud)

MSDN所述,它仅在IE中受支持.

编辑:

注意:上面的代码在IE-11中返回false,如果你想检测IE-11也使用这个:

var isIE = "ActiveXObject" in window; //window.ActiveXObject !== undefined;
Run Code Online (Sandbox Code Playgroud)

  • 它在IE11中是"假的" (3认同)
  • 这就是答案。我印象深刻。简明扼要。IE10 的功能检测是有问题的,因为它似乎在所有方面都实现了飞跃。 (2认同)
  • @VitorCanova 说,IE11 是错误的。不要再用这种方式了 (2认同)

Jon*_*llo 6

要检查浏览器是否为Internet Explorer,请使用功能检测来检查documentMode:

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

此代码检查浏览器是否为Internet Explorer 8,9,10或11:

var docMode = document.documentMode,
    hasDocumentMode = (docMode !== undefined), 
    isIE8 = (docMode === 8),
    isIE9 = (docMode === 9),
    isIE10 = (docMode === 10),
    isIE11 = (docMode === 11),
    isMsEdge = window.navigator.userAgent.indexOf("Edge/") > -1;

// browser is IE
if(hasDocumentMode) {
     if(isIE11){
         // browser is IE11
     } else if(isIE10){
         // browser is IE10
     } else if(isIE9){
         // browser is IE9
     } else if(isIE8){
         // browser is IE8
     }
} else {
   // document.documentMode is deprecated in MS Edge
   if(isMsEdge){
         // browser is MS Edge
   }
}
Run Code Online (Sandbox Code Playgroud)

检查document.documentMode只能在IE8到IE11中使用,因为它documentMode是在IE8中添加的,并且已在MS Edge中弃用/删除.

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

我希望这有帮助!

UPDATE

如果您确实需要检测IE7,请检查document.attachEvent:

var isIE7 = (document.attachEvent !== undefined);
if(isIE7) {
      // browser is IE7
}
Run Code Online (Sandbox Code Playgroud)

IE7返回一个对象,但如果浏览器是IE11(例如),那么这将返回undefined,因为IE11没有attachEvent.

更新:

添加了MS Edge检查.在MS Edgedocument.documentMode已弃用.由于MS Edge的性质,您可以Edge/在用户代理中进行检查.微软很难在MS Edge中使用功能检测.