jQuery 1.8:不支持的伪:悬停

时间:2012-08-17 01:01:26

标签: javascript jquery jquery-1.8

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

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

有谁知道发生了什么事?

4 个答案:

答案 0 :(得分:8)

不幸的是,虽然我们都希望我们的代码是未来证明,但您的$('foo').on( 'hover, ... function(){ //do stuff }代码是deprecated in 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()事件处理程序以及伪-selector :hover,因此不能再以这种方式使用了。

答案 1 :(得分:4)

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

对此的解决方法是反过来:

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

...因为.filter()也接受jQuery对象,这将匹配任何具有:focus类的伪:active.your-element的元素。

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

答案 2 :(得分: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])

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

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

答案 3 :(得分:1)

也许你可以使用一些代码解决这个问题(但可能很昂贵) 在hover上添加课程mouseenter,在mouseleave上将其删除,然后对其进行测试。

$('.selector').hover(
    function(){$(this).addClass('hover');},
    function(){$(this).removeClass('hover');}
);

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