检测所有版本的Internet Explorer

3

以前有一种通过 HTML 技巧来判断浏览器是否为 IE 的方法:

<!--[if IE]>
Non-IE browsers ignore this
<![endif]-->

或者

<!--[if !IE]-->
IE ignores this
<!--[endif]-->

但是在IE 10中,这个方法已经不再适用

有什么其他的方法可以使用HTML或JavaScript来区分IE和其他的网页浏览器吗?

附注:我需要能够区分任何版本的IE和非IE网页浏览器。


12
不需要这样做。IE10在很大程度上符合标准。不要尝试为特定的浏览器编写代码,而是尽量遵循标准,IE10应该能够很好地支持。 - James Allardice
3
你在IE中具体遇到了什么问题? - Guffa
3
你链接的文章是关于IE9的。可以查看http://caniuse.com,IE10对现代技术提供了更好的支持。你的条件注释在IE9中仍然有效。 - James Allardice
2
说真的,IE10浏览器并不是那么糟糕(事实上,我了解到jQuery为Chrome提供的修复比为IE10提供的要多)。而且很多其他人也在使用它来制作动画GIF而没有遇到问题。请提出一个单独的问题,解释您遇到的具体问题;几乎可以肯定的是,SO社区将能够帮助您修复它,使其在所有浏览器中都能正常工作,而无需任何浏览器检测技巧。 - Spudley
2
正如其他人所述,与其应用一种通用的IE修复方案,更明智的做法是使用Modernizr查找您要使用的特定功能。 - jcreamer898
显示剩余9条评论
5个回答

9

感谢您的所有见解,但它们都没有回答我的实际问题。再次说明,我不是在询问特性检测。我只需要知道当前使用的浏览器是否为IE。以下代码使用JavaScript编写,并且似乎适用于所有当前版本的IE(包括IE10):

<![if IE]>
<script type='text/javascript'>
if(/*@cc_on!@*/false)
var bIsIE = 1;
</script>
<![endif]>

然后通过JavaScript来检查是否为IE:

if (typeof (bIsIE) != 'undefined')
{
    //The web browser is IE
}
else
{
    //The web browser is not IE
}

很明显,上面的代码假设网页浏览器已启用JavaScript。但是在我的情况下,仅当脚本可用时,浏览器检测才相关。


+1,因为有时你只是不想在不足的浏览器中搞弄能力检测。但是,在if(/*@cc_on!@*/false)块中,你是否遗漏了一些花括号和运算符?此外,该块应该检查什么? - Ryne Everett
1
有些功能无法检测到。我正在尝试检测IE,因为它不支持hrefdata:text/csv...的情况。 - Snekse
1
这里有一个关于特性检测的问题可能没有人提到:在所有版本的IE中,您无法使用CORS与canvas toDataURL(),因为它会将画布标记为脏,即使启用了CORS。然而,在IE9+上进行CORS特性检测会显示“是”,这只是IE处理toDataUrl()的怪癖。您可以尝试{} catch {}错误,但不要费心,因为IE不会“捕获”toDataUrl()调用,它会作为安全错误退出try{}。最好在尝试toDataUrl之前检测“这是IE吗?”并为IE使用本地代理,而不是禁用CORS以适应正常的浏览器。 - Shawn Grigson

5
每个版本的Internet Explorer都与其他版本不同,就像Chrome、Firefox和Opera的每个版本都与其前身不同。您在开发网站时不会针对“Microsoft”、“Google”或“Mozilla”等供应商,而是针对功能。
与其问“我想使用::after,这个浏览器是微软浏览器吗?”您应该问“这个浏览器是否支持以::前缀为伪元素?”这是特征检测,几乎总是非常准确的。与其根据供应商猜测浏览器的能力,您可以通过它实际能够做什么来确定它的能力。
这可能不是您要寻找的答案,但它仍然是正确的答案。如果您想知道如何识别所有微软浏览器,那么您正在错误地解决问题(或者您认为的问题)。

为了得到正确的解决方案,我建议您使用 jQueryModernizr 等工具。它们可以处理 API 标准化、在旧浏览器中模拟新元素以及特性检测。这是正确的做法,如果开发者一开始就采用这种方法,您今天可能不会那么讨厌 Internet Explorer 了。


3
您在问题中提供的链接 - 已经失效,该链接指向Windows Internet Explorer工程团队博客,显示如下声明。

Conditional Comments

<!--[if IE]>

This content is ignored in IE10 and other browsers.

In older versions of IE it renders as part of the page.

<![endif]-->

This means conditional comments can still be used, but will only target older versions of IE. If you need to distinguish between more recent browsers, use feature detection instead.

我觉得IE团队正在强烈推动使用特性检测而不是浏览器检测,正如上面的特性检测链接中引用的那样。

Same Markup: Core Guidelines

**DO**
    Feature Detection
    Test whether a browser supports a feature before using it.
    Behavior Detection
    Test for known issues before applying a workaround. 
**DON'T**
    Detect Specific Browsers
    Also known as browser detection. Don't use the identity of a browser (e.g. navigator.userAgent) to alter page behavior.
    Assume Unrelated Features
    Don't perform feature detection for one feature, and then proceed to use a different feature.

看起来Windows Internet Explorer工程团队正在设置IE10及以上版本,以使您无法使用浏览器检测。

编辑 我不使用IE10,但是

navigator.appName=='Microsoft Internet Explorer';

在IE10中工作?


0

仅仅说IE10足够好并忽略问题是不够的。这实际上取决于你想做什么。对于大多数目的,特性检测可能会处理你所需的内容。更加复杂的方法是通过从HTTP请求头中提取用户代理字符串来开始用户代理检测。如果你在使用时不小心,很容易出错。

要在浏览器JS控制台中查看当前的用户代理字符串:

console.log(navigator.userAgent);

这里是各种浏览器报告的用户代理字符串列表:

http://www.zytrax.com/tech/web/browser_ids.htm

请注意,所有的MS Explorer代理字符串都将包含“MSIE”,但首先您必须筛选出像Opera这样的浏览器,在某些情况下也会包含“MSIE”字符串。

-1

如果客户端浏览器是Internet Explorer,并且版本为9-10-11,则此函数将返回true

function isIE(v) {
    var ie;
    ie = RegExp('msie' + (!isNaN(v)?('\\s'+v):''), 'i').test(navigator.userAgent);
    if (!ie) { ie = !!navigator.userAgent.match(/Trident.*rv[ :]*11\./) }
    return ie;
}

// Example
var ie = isIE();
var ie9 = isIE(9);
var ie10 = isIE(10);

注意:该函数不完整,无法允许isIE(11)


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