2010-04-07 67 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