2012-06-11 36 views
19

我知道我們可以使用jQuery on()函數附加事件,並使用off()再次刪除它們。使用jquery off()。on()或只是()

在現有的項目中,我有時也會遇到類似的代碼如下:

$("#SomeId").off("click").on("click"); 

或有時使用命名空間類似於這樣的時候:

$("#SomeId").off("click.namespace").on("click.namespace"); 

據我所知,你只能將單個事件附加到事件的特定命名空間。

例如,如果我只是做on("click")會附上我指定的功能, 覆蓋分配 目前的功能,增加了「點擊」事件。

如果我做on("click.namespace")它會附加我指定的功能 覆蓋當前分配的功能 ,加入到click.namespace

什麼是鏈接一個off("click")on("click)如果on()已經取代了分配給指定的事件/ event.namespace任何功能刪除任何事件的意義呢?

它是我們的代碼中的冗餘語法,還是我錯過了它的原因?

編輯 - 謝謝你kapa
我現在覺得有點傻,我糾正上述錯誤我的知識。幾次執行on("click.namespace1")我現在觀察到data("events")對象不斷添加到click事件數組中。

我認爲這回答我自己的問題。這就是爲什麼人們會使用off("event.namespace")來確保沒有其他東西附加到該確切的event/event.namespace。

回答

29

實際上,您可以將多個事件處理程序附加到相同的事件,而不僅僅是一個。即使使用名稱空間。檢查出this quick demo

實際上,命名空間的一個優點是可以標記一組事件處理程序,並且稍後可以輕鬆刪除它們以避免多次附加它們。這是這一行的作用:

$("#SomeId").off("click.namespace").on("click.namespace"); 
+0

我根據您的反饋,根據新發現編輯了我的問題。我覺得有點傻,在觀察數據(「事件」)對象之前,我從未注意過。謝謝您的回答。 – Jason

0

如果有一個現有的投手(因爲你可能有一個以上的,在這種情況下,他們將鏈),並呼籲.stopPropagation(),那麼你的投手就不會被調用。如上所述編寫代碼將避免此問題。