2013-03-12 136 views
1

說我有一個ID的按鈕:jQuery的 - 爲同一按鈕多個事件偵聽器

<input id='someButton' />

我想在此按鈕上附加一個事件偵聽器:

$('#form').on('click', '#someButton', function() { 
    alert("My listener called"); 

});

然而,瞞着我,有人以前寫過的事件偵聽器這同一個按鈕:

$('#form').on('click', '#someButton', function() { 
    alert("Some other listener called"); 
}); 

我遇到了一些代碼,有效地確實與上述同樣的事情,而且好像註冊的第一個監聽器是使用的那個。我是否正確假設jQuery將始終調用在特定ID上註冊的第一個事件偵聽器(並且只有那個偵聽器)?

+1

nope。在jQuery中,您可以添加多個事件偵聽器.. – honk31 2013-03-12 18:41:34

回答

7

錯誤。 jQuery將按照它們綁定的順序調用綁定到元素的所有事件偵聽器。

要刪除現有的事件處理程序,使用.off()

$('#form').off('click'); // click event handler(s) removed 
$('#form').off(); // all event handler(s) removed 

要知道,從祖先的DOM元素委派事件將不會被這種方式去除,但。

+2

爲了完整起見,如果其中一個處理程序在事件上調用[stopImmediatePropagation()](http://api.jquery.com/event.stopImmediatePropagation/),處理程序進一步向下鏈不會被調用。這可能是提問者觀察到的行爲的原因。 – 2013-03-12 18:43:41

+0

謝謝,事實證明,這兩個處理程序實際上被稱爲。只是我的一個疏忽。沒有調用stopImmediatePropagation(),但這是有用的知識! – 2013-03-12 18:55:30

0

,你可以使用鼠標按下:

$('#form').on('mousedown', '#someButton', function() { 
    alert("My listener called"); 
}); 

希望這有助於。

相關問題