2012-03-03 52 views
0

我有一些代碼是使用jquery的委託方法。jquery undelegate不工作

例如爲:

$(document).delegate('.forImg','dblclick',function(event){. 
    . 
    . 
    . 
} 

我有相同的類,但不同的ID(唯一的)多個元素。我的應用程序要求我停止某個元素的事件。如果我使用與undelegate的委託相同的語法,它將刪除該類中所有元素的事件。例如

$(document).undelegate('.forImg','dblclick'); 

但我實際上只想爲特定元素的特定元素刪除事件。我嘗試了很多組合,其中我將選擇器作爲該ID。但這些元素仍然不會對事件做出反應。

我讀過一個處理程序是爲檢查選擇器的文檔創建的。我想這就是爲什麼即使我要求它解除處理程序繼續執行。

我該如何做,而不必爲每個元素提供委託? 這就是給出類的原因。但是我需要控制每個元素事件。

歡迎任何幫助/建議。

感謝

+0

您是否有必要委派?換句話說,你的內容是否動態?如果您的頁面在每個負載中都是靜態的,則不需要委託給要成爲偵聽器的文檔。 – 2012-03-03 07:29:30

回答

3

Alrighty,我想到了什麼畢竟...

所以,你已經把一個監聽器。雙擊任何選定的元素,一個函數將執行,對吧?

但如果你綁定ANOTHER雙擊聽衆在它的頂部,並停止傳播,它將不再冒泡:

$('#SOMEID').bind('dblclick', function(e) { 
    e.preventDefault(); 
    e.stopImmediatePropagation(); 
}); 

小提琴:http://jsfiddle.net/p5e2e/7/

注:我使用'綁定',因爲任何原因(不是每個人都使用jQuery 1.7+),OP似乎使用的是較舊的語法,但如果使用最新的jQuery,請使用on來代替bind

+0

我將如何再次獲得原始行爲? – kavita 2012-03-03 07:54:44

+0

我應該再次委託,當我想要行爲restrored? – kavita 2012-03-03 08:22:58

+0

我已經更新了小提琴解除綁定的情況下另一個按鈕單擊,然後行爲得到恢復。非常感謝! – kavita 2012-03-03 08:41:37

2

當你委託處理在第一時間,你可以使用不()排除了一個ID,並使用單獨的呼叫委託給該ID,這樣你可以刪除獨立的類處理程序的

$(document).delegate('.forImg:not(#SOMEID)','dblclick',function(event)...... 

$(document).delegate('#SOMEID','dblclick',function(event)...... 
+0

爲此我必須事先知道哪一個我會刪除!這是動態的知道所以不能做到這一點... – kavita 2012-03-03 07:38:57

+1

@ kavita但你必須已經知道ID!您的整個前提是您要根據ID選擇排除的元素。動態與否,你必須知道身份證。 – 2012-03-03 07:40:52

+0

還有一個可能性...測試'event.target',但不知何故,一個元素將需要一個單獨的類添加,或一種方式來識別它與某些屬性 – charlietfl 2012-03-03 07:46:37

0

不能只使用.undelegate()中的名稱空間,如.unbind()。所以你應該使用標籤名稱以及類名稱div.forImg

演示:http://jsfiddle.net/p5e2e/

+0

我認爲我們中的一個人誤解了這個問題。考慮到一個特定的課程,kativa並不想將其全部取消,而只是基於ID。下面是一個(非功能性)小提琴作爲示例:http://jsfiddle.net/p5e2e/2/ – 2012-03-03 07:33:28

+0

標記名也是無關緊要的...要取消選擇,選擇器必須與原始的 – charlietfl 2012-03-03 07:36:24

+0

相同。greg是正確的。我將代表一次設置爲全部,但需要一次刪除一個代理。所以我的情況沒有出路! – kavita 2012-03-03 07:40:46

0

您應該使用.on() method。從jQuery 1.7開始,.delegate()已被.on()取代。在一般情況下,這些都是這兩種方法相當於模板:

$(document).delegate('.forImg:not(#SOMEID)','dblclick',function(event)); // jQuery 1.4.3+ 
$(document).on('.forImg:not(#SOMEID)','dblclick',function(event));  // jQuery 1.7+` 

而你需要知道ID。如果你的內容是動態的&你正在使用PHP,那麼你可以使用:

<div class='something' id='<?php echo "dynamic".$i;?>' > 

$ I增加一個循環(MySQL的同時,等...)。

+0

但這並不回答這個問題。 – 2012-03-03 07:45:17

+0

@GregPettit,我編輯了我的問題,爲提問者提出了一個解決方案。最初我只發佈「需要」的信息,因爲我剛開始使用SO,我不知道如何發佈評論中的鏈接:) – 2012-03-03 07:49:15