【问题标题】:How should I detect the IE browser?我应该如何检测 IE 浏览器?
【发布时间】:2012-08-24 13:24:25
【问题描述】:

我已经对特定功能进行了功能检测,以确定是否可以使用它或是否必须使用变通方法。但是,不幸的是,我发现 IE 在该功能中有一些错误,即使它存在,它也对我毫无用处。所以,即使它通过了功能检测,我也需要检测浏览器是 IE,所以如果它是 IE,我不会使用该功能。

我试图看看我是否可以对实际的错误行为进行功能检测(这是最好的,因为如果 IE 将来修复该行为,它会适应),但似乎没有任何方法可以做那个(different question 的主题)。这意味着我只能试图最终确定它是一个 IE 浏览器,这样我就可以避免这个错误的功能。 我不想使用 useragent 字符串,因为我们都知道它很容易被欺骗并且很容易出错。

所以,我想对是否是IE浏览器进行特征检测。

到目前为止我的方法是这样的:

var isIE = (document.body.attachEvent && window.ActiveXObject);

这将查看是否存在 attachEvent() 方法以及是否存在 ActiveXObject 支持。我必须做的不仅仅是检查attachEvent,因为Opera 支持attachEvent

这是检测 IE 的可靠方法吗?有更好的方法吗?

请不要回复我真的不应该做浏览器检测,而是应该使用特征检测。我已经在进行功能检测,但这导致了一个问题,因为“支持”该功能并因此通过功能检测的浏览器结果非常错误,以至于我无法在该浏览器中使用该功能。所以,现在我必须检测有问题的浏览器。

如果你想了解更多关于这个使用的具体情况,在this other question中有描述。

【问题讨论】:

  • 我明白你所说的特征检测不起作用,但实际上你只是检测到错误的特征。从长远来看,测试 IE 破坏该功能的任何方面可能会更具可持续性;换句话说,做这件事,看看它是否像 IE 通常那样把它搞砸了,如果是这样,你的特殊 IE 代码就搞砸了。如果你这样做,那么每当未来版本的 IE 修复错误时,你的代码都会自动做正确的事情;使用浏览器检测,您将来必须再次更新代码。
  • @machineghost - 有时无法衡量行为是否正常执行或是否包含错误。我在这里遇到的具体情况与我的问题中提到的how IE handles certain input events 有关。如果可以设计一个功能测试,我会很乐意使用,但我无法设计一个有效的,我在 SO 上问了一个问题,没有帮助设计一个,因此觉得我别无选择,只能检测有问题的浏览器而是。

标签: javascript cross-browser browser-feature-detection


【解决方案1】:

Conditional cmets条件编译,这里解释一下:

http://www.quirksmode.org/css/condcom.html

或者在这里找到相关的表亲:

http://www.javascriptkit.com/javatutors/conditionalcompile.shtml

两者都是 Internet Explorer 独有的,因此它们可以让您嗅探 IE。

<script type="text/javascript">

/*@cc_on
document.write("JScript version: " + @_jscript_version + ".<br>");
   /*@if (@_jscript_version >= 5)
      document.write("JScript Version 5.0 or better.<br \/>");
      document.write("This text is only seen by Internet Explorer browsers that support JScript 5+<br>");
   @else @*/
      document.write("This text is seen by all other browsers (ie: Firefox, IE 4.x etc)<br>");
   /*@end
@*/

</script>

【讨论】:

  • 似乎它会包括声称支持该版本 JavaScript 的 IE 版本。有没有办法使用条件编译来指定 IE 版本?那么这将是理想的。
  • 这看起来很有希望,因为与&lt;!--[if lt IE 9]&gt; 方案不同,它位于我需要的脚本文件中。我会试试看。
  • 这是这个想法的一个版本:dean.edwards.name/weblog/2007/03/sniff
  • @jfriend00 对单行稍作改进,以绕过 JS 缩小删除评论:var isMSIE = eval("/*@cc_on!@*/false");
【解决方案2】:

在链接的帖子中,给出了条件cmets的建议。这将允许您检测 IE 的版本。

在你的脑海中添加这样的东西:

<!--[if lt IE 9]>
  <script type="text/javascript">
    var lt9=true;
  </script>
<![endif]-->

这是特定于 IE 的,在其他浏览器中将作为注释被忽略。

对于简单的检测,使用这样的东西:

<!--[if gte IE 6]>
  <script type="text/javascript">
    // this is IE greater than or equal to 6
    var isIE=true;
  </script>
<![endif]-->

【讨论】:

  • 虽然它插入了一个全局,但这是最好的答案(至今)
  • 您不必使用全局变量,这只是最简单的情况。最好将它附加到您拥有的对象上。
  • 你可以做一些事情,比如抓住 &lt;body&gt; 元素并向它添加一个类。
  • 我在 .js 文件中找到了一种使用此方法的方法:james.padolsey.com/javascript/…。看起来不像@JeremyJStarcher 的答案中的/*@cc_on 方法那么简单,但我想我会提到它。
  • 更正链接:james.padolsey.com/javascript/… 在 .js 文件中使用此方法。
【解决方案3】:

使用条件 cmets 而不是条件编译具有允许检测 IE 版本的优点(与 JScript 版本相反,JScript 版本是您可以从条件编译中获得的最佳版本)。您可以使用innerHTML 从脚本中执行此操作,如下所示。以下示例显示了如何检测 IE 8 或更低版本:

var div = document.createElement("div");
div.innerHTML = "<!--[if lte IE 8]><i></i><![endif]-->";
var isIe8orLower = (div.getElementsByTagName("i").length == 1);

alert("Is IE 8 or lower: " + isIe8orLower);

请注意IE 10 and later do not support conditional comments at all。但是,conditional compilation 仍然有效,是次佳选择,因此我建议使用它,尽管如上所述,它无法识别 IE 的实际版本。

【讨论】:

    猜你喜欢
    • 2016-01-14
    • 1970-01-01
    • 2017-09-17
    • 2012-04-08
    • 2022-12-24
    • 2010-11-09
    • 2011-10-13
    相关资源
    最近更新 更多