2013-01-18 70 views
0

我在這裏做錯了什麼?我閱讀了文檔,但我似乎無法弄清楚爲什麼這不能按預期工作。jQuery off()實現不起作用

$(".img-edit-button").on("click", function() { 
     if(self.elementMenuOpen === false){ 
      self.showImageMenu(); 
      self.elementMenuOpen = true; 
     }else{ 
      self.hideImageMenu(); 
      self.elementMenuOpen = false; 
     } 
}); 

後來的後來,我用off()

$(".img-edit-button").off(); 

但事件似乎即使使用.off()後要翻倍是有什麼我失蹤?

+0

對不起,這只是示例中的一個錯字 –

+0

而您關閉了哪些事件? '.off('click')' –

+0

你的'self'變量來自哪裏? –

回答

0

您可以嘗試使用一些「切換」功能來顯示和隱藏菜單。您可以找到的選項here

+0

切換不適用在這種情況下,我試圖刪除事件處理程序「單擊」,以便它再次調用時不會堆疊。 –

6

這是直接從http://api.jquery.com/off/「關閉()方法去除附着用。對事件處理程序()」。所以如果你在關閉之後綁定一個點擊事件,他們將繼續執行。我猜你正在重新綁定多次點擊事件。

一種解決方案是將事件綁定到父母,只有一次,因此,每當有問題的元素被添加/從dom中刪除時,您都不必重新綁定。我知道這可能會帶來一些性能方面的問題,但是儘可能地讓父母的課程儘可能地深入人心將會對此有所幫助。

$(".someparentclass").on('click','.img-edit-button',function(){}); 

或者,如果你想重新綁定,你可以使用以下命令:

$(".img-edit-button").off().on(function(){}); 

http://jsfiddle.net/SEndX/3/

0

老了,但只是想出有人仍然會碰到這個運行。如果你打算關閉它,如果沒有分配任何東西,它將不起作用。它不會總是觸發錯誤,但會阻止代碼正確執行。在頁面加載時請確保在事件上添加空白。 $( '#選擇')上(); 適用於任何方式。 。

0

這種固定對我來說,增加了空$(..)對();關於文件準備好的方法。

0

有些情況下,你不希望將事件直接綁定到一個元素。相反,您想要將其綁定到父元素,例如「body」。如果你試圖在.hover-item它不能正常工作運行.off()

$("body").on("mouseenter", ".hover-item", function() { 
    // do the thing 
} 

這裏的問題是:當你想在全球範圍定義事件監聽器,但該元素尚不存在這是必不可少的。另外,如果你嘗試在body使用.off(),用.children()不會做任何事情無論是。

而不是使用.off()的,我相信這是最好的做法,您的活動綁定到一個特定的類名,當你想關閉這些事件,刪除類名稱:

$(".the-element").removeClass(".hover-item"); 

現在,特定元素贏得沒有事件監聽器了。不過,既然你在技術上定義上body事件偵聽器,如果你需要在一段時間後再次啓用懸停效果,你可以只使用addClass(".hover-item"),一切都將工作得很好。

現在,這隻適用於您有多個項目的一個動畫的情況。懸停事件就是一個很好的例子。例如,您可以將相同的事件應用於所有按鈕,而不是將不同的懸停事件應用於不同的按鈕。但是,如果您只是想禁用某個特定按鈕的懸停事件,那麼這就是要走的路。