2012-09-29 74 views
-1

可能重複:
JQuery Unbind and then bindjQuery的解除綁定並重新綁定懸停功能

我有懸停(的mouseenter,鼠標離開)執行的動畫的功能。我試圖解開功能(因爲我不希望用戶與它交互),我點擊一個按鈕後。這有效,但我遇到的問題是重新綁定懸停功能,以便當用戶再次單擊該按鈕時,動畫和懸停效果將重新使用。

不知道這是否是正確的方式來實現這一點,但希望我可以得到一些關於這個問題的幫助。謝謝。

+0

你想設置一個阻塞變量和det點擊'按鈕'切換'hover'。我會建議'$('#theElement')。data('inHover',true)'。或者,也可以使用類名和'if($('#theElement')。is('。hoverable')){...魔術發生...}'。 –

回答

3

不斷解綁和重新綁定通常不是最好的方法。它需要比需要更多的工作。

一種選擇是在懸停時在元素上設置一個類,並讓其他代碼在調用時檢查該類的存在。

$('.myelem') 
    .on("mouseenter", function() { 
     $(this).addClass("hovering"); 
    }) 
    .on("mouseleave", function() { 
     $(this).removeClass("hovering"); 
    }) 
    .on("click", function() { 
     if ($(this).hasClass("hovering") === false) { 
      // run the code 
     } 
    }); 

類似的方法是添加了類,但使用事件委託的方法來控制行爲,使得選擇被定義爲在不具備"hovering"類元素的工作。

$('.myelem') 
    .on("mouseenter", function() { 
     $(this).addClass("hovering"); 
    }) 
    .on("mouseleave", function() { 
     $(this).removeClass("hovering"); 
    }); 

$("#container").on("click", ".myelem:not(.hovering)", function() { 
    // run the code 
}); 
+0

+1爲良好的編程方法 – StaticVariable

+0

'$ .hasClass()'將始終返回一個布爾型'true'或布爾型'false',所以'=== false'並不是真的需要。另外,您可以將重複的$ .on調用與一個調用並使用'$ .toggleClass'。從性能的角度來看,我對最後一點警惕,我認爲你的意思是['.myelem:not(.hovering)'](http://api.jquery.com/not-selector/),一個':'。 –

+0

@JaredFarrish:是的,我的'.not'應該是':not'。我會更新。謝謝。我做了'=== false'有兩個原因。首先是我用一個「邏輯上沒有」的操作符鍵入它,但我想更加清楚。其次,我幾乎總是使用'===',僅僅是出於習慣。這是一個個人編碼標準。但是你是對的,如果我在這種情況下使用'==',比較算法將是相同的。我做了2個處理程序,因爲我猜測還有更多工作要做。我可以做一個,並測試事件類型,但兩個似乎更清晰。另外'toggleClass'需要第二個參數讓我感覺舒適。 –

1

下面是使用class名稱,以保持該元素的從反應到mouseenter mouseleave多個阻塞上下文的演示:

<div class="highlight"> 
    Hover Me 
    <button type="button">Stop Hoverable</button> 
</div> 
<div class="highlight"> 
    Hover Me 
    <button type="button">Stop Hoverable</button> 
</div> 
<div class="highlight"> 
    Hover Me 
    <button type="button">Stop Hoverable</button> 
</div> 

$('.highlight') 
    .on('mouseenter mouseleave', function(){ 
     if (!$(this).is('canceled')) { 
      $(this).toggleClass('hovered'); 
     } 
    }) 
    .on('click', 'button', function(){ 
     $(this).parent().toggleClass('canceled'); 
    });​ 

http://jsfiddle.net/rRaPB/

這是使得它的工作線:

if (!$(this).is('canceled')) { 
+0

+1我想我誤解了OP想禁用哪些事件。我認爲你的意圖是什麼。 –

+0

哦,對,我甚至沒有注意到它們的區別。 –