6

以下代码unsupported pseudo: hover在 jQuery 1.8 上引发了错误,而它在 jQuery 1.7.2 上完美运行:

if(!$(this).parent().find('ul').first().is(':hover')) {
   $(this).parent().parent().removeClass('open');
}

有谁知道发生了什么?

4

3 回答 3

8

不幸的是,虽然我们都希望我们的代码是面向未来的,但您的$('foo').on( 'hover, ... function(){ //do stuff }代码在 jQuery 1.8 中已被弃用。我希望我有更好的消息告诉您,但是由于 jQuery 1.8 的核心更改,您的代码已损坏。您现在必须使用语法

$('.selector').on( 'mouseenter mouseleave', function() {
      $(this).toggleClass('hover');
   }
);

if(!$(this).parent().find('ul').first().hasClass('hover')) {
   $(this).parent().parent().removeClass('open');
}

希望我有更好的消息给你,但弃用发生了:/ ... jQuery 1.8 不喜欢你的快捷方式,他们已经弃用了hover事件处理程序.on()和伪选择器:hover,所以它不能以任何方式使用更多的。

于 2012-09-20T17:26:44.043 回答
4

老问题,但对于任何谷歌搜索的人:

一种解决方法是反过来:

$(":focus, :active").filter($(".your-element"));

…因为.filter()也接受 jQuery 对象,这将匹配任何带有伪元素:focus并且:active也有 class的元素.your-element

换句话说,如果.your-element没有悬停或活动,则此选择不匹配任何元素。

于 2015-09-14T19:30:54.003 回答
2

奇怪 - 对我来说, .is(":hover") 仍在 1.8 中工作,但在 1.9.1 中被破坏。

无论如何,这是一个修复

function mouseIsOverWorkaround(what){
    var temp = $(what).parent().find(":hover");
    return temp.length == 1 && temp[0] == what;
}

然后在“裸”(非 jQuery 包装)元素上调用上述函数。在你的情况下,

if(!mouseIsOverWorkaround($(this).parent().find('ul').first()[0]) {
   $(this).parent().parent().removeClass('open');
}

(不要忘记 [0])

上述(对原始问题的评论)小提琴http://jsfiddle.net/nnnnnn/Tm77a/在 jQuery 1.9.1 中不起作用

摆弄这个http://jsfiddle.net/mathheadinclouds/BxL4w/

于 2013-04-29T19:20:12.690 回答