JavaScript:检测IE的最佳方法

6

阅读这篇文章,我发现了如下代码:

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

这个方法'v'=='\v'是一种好的想法吗?这是检测IE最短的方法吗?

据说这是有效的:http://ajaxian.com/archives/ievv - Brad Christie
4
检测浏览器是*不好的做法。请注意,在IE9+中,'v' == '\v'为false - duri
1
你说得对,新版IE支持很多标准兼容功能,这些功能以前只有FF/Gecko/Opera支持,所以你不需要运行回退代码。 - Dan
4个回答

12

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

var trident = !!window.ActiveXObject;

根据MSDN的说明,该代码仅在IE中受支持。

编辑:

注意:上述代码在IE-11中返回false,如果您想检测IE-11,请使用以下代码:

var isIE = "ActiveXObject" in window; //window.ActiveXObject !== undefined;

2
这就是答案。我印象深刻。简短明了。IE10的特性检测很棘手,因为它似乎在所有方面都有了很大的飞跃。 - vsync
3
在IE11中这是“false”。 - Vitor Canova
2
如@VitorCanova所说,这在IE11中是错误的。不再使用这种方法。 - Matt Roberts

10

如果可能的话,不要测试浏览器,而要进行特性检测。这将意味着你的代码更有可能具备未来性。比如,在这种情况下,如果你发现浏览器是IE,并因此决定使用attachEvent,那么你会错过addEventListener(更好)在IE9中可用的事实。

在这种情况下,测试document.addEventListener是否存在。如果存在,你就得到了答案。

if (document.addEventListener) {
    document.addEventListener(...);
} else {
    document.attachEvent(...);
}

编辑:duri在上面的评论中指出,该测试在IE9(符合标准)中失败,这实际上意味着它是addEventListener的完美测试,因为它从IE9开始可用。 然而,编写特定功能而非特定浏览器的程序仍然要好得多。


6
在99.999999%的情况下,这是该主题上最好的建议。但在非常罕见的情况下,您实际上可能需要检测IE本身而不是特定的功能/功能。 - KOGI
这个问题的例子是次要的,不需要进行评论。奇怪的是,ievv是一种功能检测的形式(虽然它并不是一种细粒度的功能检测)。 - dvdrtrgn
1
@dvdrtrgn 我完全不理解那个。 - lonesomeday
Q: 最短的IE检测是什么?A: 确实似乎是...(此外,它还可以“检测”处理垂直制表符) - dvdrtrgn
如果IE 11不撒谎,试图让站点将其视为Firefox或Chrome,而它自身的表现却不足以被视为标准浏览器时,那么这会很棒(因为它现在已经变成了撒谎者)。ActiveXObject是虚假的,用户代理已更改,并且他们删除了条件注释。 - scragar
我需要检测IE浏览器,因为它会错误计算...当左右padding是相对值时,使用window.getComputedStyle(element, null).getPropertyValue('padding-left')。 - user1566694

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

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

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

希望这有所帮助!

更新

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

var isIE7 = (document.attachEvent !== undefined);
if(isIE7) {
      // browser is IE7
}

如果浏览器是IE7,则返回一个对象,但如果浏览器是IE11(例如),则会返回undefined,因为IE11没有attachEvent

更新:

增加对MS Edge的检查。 document.documentMode在MS Edge中已弃用。由于MS Edge的性质,您可以在用户代理中检查Edge/。Microsoft使在MS Edge中使用功能检测变得困难。


非常有用的答案。如果您的项目不支持IE7,则这是检测IE的最清晰方式。希望它在IE12+中也能正常工作,这样您就不必回到代码库并再次修复它 :)。然而,我将“特性检测”留给被选为答案,因为奇怪的其他浏览器引擎(尤其是移动端)仍然存在,并且新的可能随时出现。简而言之,特性检测提供了最好的质量。 - Dan
@Dan 当IE12+发布时,由于documentMode仍然是IE中document对象的属性,因此此答案仍应有效。 - Jonathan Marzullo
@Dan,这也可以检测浏览器是否是IE8,在IE7的文档模式下进行渲染。如果您想检查iE7,那么您可以检查document.attachEvent - Jonathan Marzullo
1
我从不信任IE,他们对兼容性的关注程度不高。 http://www.sitepoint.com/microsoft-drop-ie10-conditional-comments/ http://www.engadget.com/2013/03/25/ie-11-says-it-is-like-firefox/ - Dan

0
JavaScript的includes()方法在IE11及更早版本中不受支持。因此,您可以使用代码来检查includes()方法是否受支持。这适用于所有版本的IE。但是,includes方法不适用于早期版本的Chrome、Firefox、Safari和Opera。这可能不是检测IE最有效的方法。

var aString = "something";
if(!aString.includes){
    alert("You are using IE");
} else {
    alert("You are not using IE");
}


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