以下代码在jQuery 1.8上引发错误unsupported pseudo: hover
,而它在jQuery 1.7.2上运行完美:
if(!$(this).parent().find('ul').first().is(':hover')) {
$(this).parent().parent().removeClass('open');
}
有谁知道发生了什么事?
答案 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)
无论如何,这是一个修复
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中不起作用
答案 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');
}