3

我需要检测 IE6 才能解决缺少 position:fixed 的问题。我一直在使用一个简单的正则表达式:

var isIE6 = /msie|MSIE 6/.test(navigator.userAgent);

这几乎一直有效,除了浏览器声称是 IE6 和 IE7 的用户:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; .NET CLR 3.0.04506.30)

辉煌。

我很想使用jquery.support,但它看起来不支持查询 position:fixed 是否可用。所以我回到检测IE6。

有各种建议的解决方案,例如寻找 maxHeight 的存在。但是这些似乎相当随机并且让我感到害怕 - 如果上面的正则表达式有例外,我怎么能确定 maxHeight 没有例外?

我正在考虑使用条件注释 - 这样至少它会是 IE 本身声称是 IE6,而不是 hack。就像是:

<!--[if IE 6]>
<SCRIPT> var isIE6 = true; </SCRIPT>
<![endif]-->

或者,有一个函数可以直接测试 position:fixed 是否可用,但这似乎有点重。

有什么理由我的条件评论方法不起作用?有更好的方法吗?

4

6 回答 6

6
<script type="text/javascript">
    if (nothing_works) {
        is_ie6 = true;
    }
</script>

不过说真的,您的条件注释可能是最好和最准确的检测方法。即使浏览器位于其用户代理中,它也可能不会像 IE6 一样解析条件注释。

现在我知道有人还在为 IE6 开发,我得回家哭一会儿。

于 2010-08-05T21:46:53.873 回答
5

Paul Irish专门为检查支持写了一个补充。我建议你走这条路,尽可能使用特征检测而不是浏览器检测。$.supportposition: fixed

您只需要在该添加中包含最后一个函数,这部分:

$.support.positionFixed = (function() { ..... })();

在 jQuery 之后包含它,然后您可以在代码中使用它,如下所示:

if(!$.support.positionFixed) {
  //handle browsers that don't support it
}
于 2010-08-05T21:48:08.793 回答
1

我遇到的克服 IE 问题的最佳方法是使用条件注释:

<!--[if IE 6]>
... link IE 6 specific stylesheet or a script...
<![endif]-->

这种方法还将使您的页面向前兼容,以便未来版本的 IE 可以呈现它,而不需要所有 IE6(和更低)样式。

于 2010-08-05T21:50:17.487 回答
0

http://api.jquery.com/jQuery.browser/

if ($.browser.msie && parseInt($.browser.version) == 6) {
  // do something
}
于 2010-08-05T21:45:51.527 回答
0

IE 博客上有一篇关于特征检测的详细文章:

http://blogs.msdn.com/b/ie/archive/2010/04/14/same-markup-writing-cross-browser-code.aspx

基本上他们(可以理解)反对浏览器版本检测:

“不要:检测特定浏览器”

浏览器对它们的版本撒谎的场景很多(如您的示例),最好使用特征检测。

于 2010-08-05T21:50:30.543 回答
0

我说你也应该使用有条件的评论。它适用于 CSS 和 JavaScript 或任何你想放在那里的东西。在我看来,这是最好的选择。但是我不会像您在示例中那样使用变量。我会选择一个外部 ie6.js 链接,它将覆盖您在原始非 ie6 代码中所做的任何事情。这样,您将不会在干净的代码中获得 ie6 垃圾/变量。

<!--[if IE 6]>
<script type="text/javascript" src="ie6.js"></script>
<![endif]-->
于 2010-08-05T22:24:11.120 回答