2012-07-01 74 views
2

我想有一個事件處理程序只執行一次,然後從綁定到的所有元素解除綁定。jquery事件處理程序只執行一次綁定到多個元素

我知道.one(),但是在使用它時「處理程序每​​個元素最多執行一次」。

是否有一種「內置」方式將事件處理程序綁定到多個元素,並在它們中的任何一個上執行後自動從所有元素中移除它?

回答

1

簡單。只需在回調函數內解除綁定事件處理程序。就像這樣:

$('p').on('click', function(){ 
    alert('I appear only one time'); 
    $('p').off('click'); // Removes the event. So, it will never be executed again. 
}) 

該腳本將刪除類型點擊的所有事件,這是一個有點aggresive。有關更多信息,請參閱offunbind的文檔。

+0

工作這樣勢必導致在某些時候有些麻煩。 如果我將不得不手動執行此操作,我會編寫一個.once(處理程序),它將同時保留指向「this」和處理程序的指針,並綁定另一個處理程序,該處理程序將僅刪除它添加的處理程序。這只是我希望JQuery已經有這樣的東西... – epeleg

+0

在這種情況下,我不知道任何現有的jquery函數,就像那樣。 這種方法對我來說似乎不是很容易出錯,但實現一個附加第二個事件的jquery _fn.once()_函數可能會很複雜。您必須關注事件優先級,使用_stopPropagation_的事件可能不會被解除綁定....似乎更復雜的是隻需在您的回調函數中添加一行。 –

+0

接受爲「我不知道任何現有的jquery函數,就像那樣工作」... – epeleg

0

miguel camba已經告訴你檢查維基解除綁定。正確的解決方案如下:

var handler = function() { 
     alert('I appear only one time'); 
     $('p').unbind('click', handler); 
    } 
    $('p').bind('click', handler); 

這將只從click事件中解除綁定此處理程序。

//編輯:

另一種解決辦法是命名空間點擊事件:

$('p').bind('click.myClickEvent', function() { 
    alert('I appear only one time'); 
    $('p').unbind('click.myClickEvent'); 
}); 
+0

我喜歡使用閉包的第一種方法。至於第二種解決方案,對於我的口味而言,它仍然不覺得「可重入」,因爲如果我將它放在一個函數中,該函數將警報作爲參數進行調用,那麼多次調用該函數將僅使單個警報開始觸發而不是每次調用該函數的一次警報。 – epeleg

+0

可以使用.on()和.off()來實現第一個解決方案嗎? – epeleg

+0

我想這幾乎是一樣的 –

相關問題