jQuery 1.8:不支持的伪:hover
下面的代码在jQuery 1.8上引发了错误unsupported pseudo: hover
,而它在jQuery 1.7.2上工作得很好:
if(!$(this).parent().find('ul').first().is(':hover')) { $(this).parent().parent().removeClass('open'); }
有谁知道发生了什么?
不幸的是,虽然我们都希望我们的代码是未来的certificate,但你的$('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不喜欢你的快捷方式,他们已经弃用了.on()
的hover
事件处理程序以及伪选择器:hover
,所以它可以不再那样用了。
老问题,但任何人用谷歌搜索:
对此的解决方法是反过来:
$(":focus, :active").filter($(".your-element"));
…因为.filter()
也接受jQuery对象,这将匹配任何带有伪的元素:focus
和:active
,它们也有类.your-element
。
换句话说,如果.your-element
未hover或处于活动状态,则此选择不匹配任何元素。
很奇怪 – 对我来说,.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/
也许你可以使用一些代码解决这个问题(但可能很昂贵)
在mouseenter
上添加类hover
,在mouseleave
上删除它然后测试它。
$('.selector').hover( function(){$(this).addClass('hover');}, function(){$(this).removeClass('hover');} ); if(!$(this).parent().find('ul').first().hasClass('hover')) { $(this).parent().parent().removeClass('open'); }