使用jQuery.support检测IE6

34

有人有任何关于如何使用jquery.support测试IE6特定功能(而不是IE7)的想法吗?

我的问题是,IE6仅支持锚元素的:hover伪类,而IE7支持所有元素的:hover伪类(如FF、Chrome等)。因此,如果浏览器不支持所有元素的:hover,我想要做一些特别处理...因此我需要一种测试此功能的方法。(不想使用jQuery.browser)。有任何想法吗?


以下所有答案都没有回答这个问题!这太荒谬了。 - vsync
8个回答

55

虽然检查功能支持而不是用户代理是一种好的实践,但是使用JavaScript检查诸如支持CSS属性之类的内容并没有简单的方法。我建议您要么按照上述帖子的建议使用条件注释,要么使用jQuery.browser。一个简单的实现(未经过性能或错误验证)可能看起来像这样:

if ($.browser.msie && $.browser.version.substr(0,1)<7) {
  // search for selectors you want to add hover behavior to
  $('.jshover').hover(
    function() {
      $(this).addClass('over');
    },
    function() {
      $(this).removeClass('over');
    }
}

在您的标记中,向您想要悬停CSS效果的任何元素添加.jshover类。 在您的CSS中,添加以下规则:

ul li:hover, ul li.over { rules here }

5
不要使用$ .browser,因为它已被弃用。 - Sampson
4
我得同意@jaimedp的看法;废弃$.browser但不提供足够的替代方案,感觉像是倒退了一步。如果你无法通过特性检测来检测CSS特性或错误,你就必须进行某种形式的浏览器检测。 - Adam Lassek
2
scunliffe的答案更好,因为它适用于所有IE6用户,而不仅仅是启用了Javascript的IE6用户。 - Andrew G. Johnson
8
我不禁想知道:如果使用此代码(我认为这不是一个好的做法),会发生什么事情,当第10个版本推出时?substr将返回1,显然小于7。像Alex建议的那样,你应该使用parseInt。 - Tommy Andersen
7
针对未来用户,jQuery 1.9已经移除了$.browser,因此这个答案在这种情况下将不起作用。 - teynon
显示剩余10条评论

21

您可以使用微软专用的条件注释来将特定代码应用于仅限于IE6。

<!--[if IE 6]>
  Special instructions for IE 6 here... e.g.
  <script>...hook hover event logic here...</script>
<![endif]-->

这可能是最好的选择,只是想知道是否还有其他方法可以做到... 因为 jQuery 文档中说“jQuery 带有许多包含的属性,您可以随意添加自己的属性。”。无论如何感谢。 - Jaime
如果您正在动态加载脚本或在动态创建的元素(例如模态框)上运行代码,则此方法将无法正常工作。 - KyleFarris
@KyleFarris 这要看情况...你可以使用条件注释来检查IE6,如果符合条件,就为所有现有的DOM元素和未来的元素设置所需的jQuery处理程序,使用.live()处理程序(在jQuery v1.8之前)或首选的.on()(从jQuery 1.7+开始)http://api.jquery.com/on/ - scunliffe

20

Thickbox使用

if(typeof document.body.style.maxHeight === "undefined") {
    alert('ie6');
} else {
    alert('other');
}

到目前为止,最好的选择+1。相关链接:http://stackoverflow.com/questions/8931729/some-none-ie-browsers-are-showing-true-for-ie6-browser-detection - Phill Pafford

2
这是一个例子,说明我们应该退后一步,问一下为什么要做那件事。
通常,这是为了创建菜单。如果是这样,我强烈建议您节省些麻烦,使用像superfish或其他许多替代品之类的插件。
如果不是为了创建菜单,我建议您使用jQuery hover()事件监听器。例如:
$("td").hover(function() {
  $(this).addClass("hover");
}, function() {
  $(this).removeClass("hover");
});

会做你想要的事情。

我正在制作一个自定义下拉列表,其中可能有很多项,因此我想在<IE6的情况下使用jquery.hover事件,并为支持它的浏览器使用css:hover(因为它更快)。但你可能是对的,我应该退一步并重新考虑我的做法。 - Jaime
:hover 的速度是个问题吗?换句话说,支持混合解决方案的复杂性成本值得吗? - cletus
好问题,可能不会,只是使用悬停事件感觉有点迟缓。 - Jaime
你的需求可能有所不同,但我对IE6的一般立场是:它只需要是功能性的。它不需要完美无缺,也不应该有任何显著的错误,但它只需要能够正常运行。 - cletus
1
@cletus:我的问题是,90%的用户使用IE6(在墨西哥的SaaS企业应用程序),所以如果我不努力使他们的体验顺畅,那么我就是在自己脚上开枪。 - Jaime

1

仅仅是为了好玩(不使用jQuery.support):

$(document).ready(function(){
    if(/msie|MSIE 6/.test(navigator.userAgent)){
        alert('OMG im using IE6');
    }
});

你也可以通过 PHP 来实现

<?
if(preg_match('/\bmsie 6/i', $ua) && !preg_match('/\bopera/i', $ua)){
    echo 'OMG im using IE6';
}
?>

1

我喜欢这个解决方案,非常简单。 - Dan Doyon

0

是的,那正是我的问题:)我想使用hover()事件,但只有在<IE6时才使用,如果不是,则使用css:hover,因为它更快速和可靠。 - Jaime

-2
if ($.browser.msie && parseInt($.browser.version, 10) == 6) {
  alert("I'm not dead yet!"); 
}

你没有理解问题的要点 - $.browser 在 jQuery 中已经不存在了。 - Synchro

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