2010-04-07 34 views
1

现有.hover方法.delegate相当于我有一个绑定使用.hover方法悬停事件,这是低于事件处理程序:在jQuery的1.4.2

$(".nav li").hover(function() { 
    $(this).addClass("hover"); 
}, function() { 
    $(this).removeClass("hover"); 
}); 

重要的是要注意的,我需要处理程序中的两个函数来确保同步。是否有可能使用.delegate重写函数,因为下列方法不起作用?

$(".nav").delegate("li", "hover", function() { 
    $(this).addClass("hover"); 
}, function() { 
    $(this).removeClass("hover"); 
}); 

丰富

回答

2

试试这个办法:

$(".nav").delegate("li", "hover", function() { 
    $(this).toggleClass("hover"); 
}); 

这取决于.nav没有得到通过AJAX更换或以其他方式,虽然,因为这是事件处理住在哪里。如果正在更换,则必须将代理人附加到更高的祖先,而不是被更换。

另外一个次要校正,$(".nav li").hover(function() {没有使用.live()方法,这将是:$(".nav li").live('hover', function() {.hover()当代码运行时将事件直接绑定到元素......任何未来的元素都不会触发该悬停代码,这就是.live().delegate()不同的地方,它们通过冒泡来处理将来的元素。

+0

非常尴尬。盲目地认为我正在转换一个.live方法而不是.hover方法,眼睛显然没有在今天聚焦。所以+1。 关于附加到可能以编程方式被替换的父代。我没有意识到这种限制,并且一直附属于在没有问题的时候并不一定存在的父母。 – kim3er 2010-04-07 11:47:08

+0

@ kim3er - 使用你当前的方法,它们必须在绑定时存在,否则选择器将会找到/绑定任何东西:)如果你当前的方法有效,我发布的委托方法也应该如此,让它一个镜头,让我知道你是否有其他问题。 – 2010-04-07 11:51:27

+0

对不起,我指的是.delegate方法,而不是最后一句中的.hover。 – kim3er 2010-04-07 12:00:17

1

添加/删除类Nick的解决方案非常完美,因为jQuery提供了合适的toggleClass方法。

如果您需要触发没有提供相应的切换方法更复杂的功能,你可以做到这一点通过测试事件类型:

$(".nav").delegate("li", "hover", function (event) { 
if(event.type == "mouseenter"){ 
    $(this).find(".subDiv").slideDown(); 
}else{ 
    $(this).find(".subDiv").slideUp(); 
} 
}); 

这将jQuery的工作> = 1.4.3 - 对于旧版本,使用mouseover而不是mouseenter