2009-04-12 72 views
68

我會嘗試用簡單的代碼來解釋問題。如何覆蓋jQuery的事件處理程序

var fireClick = function() { alert('Wuala!!!') }; 

$('#clickme').click(fireclick); 
$('#clickme').click(fireclick); 

所以現在它會明顯提醒2次,但我只需要警報一次。嘗試了很多方法,但沒有結果。

謝謝。

+0

你能給出一些關於如何綁定事件的調用最終發生兩次的上下文嗎?也許你可以防止第二次調用改變代碼的功能。 – 2009-04-12 11:28:37

+1

相關:http://stackoverflow.com/questions/209029/best-way-to-remove-an-event-handler-in-jquery – 2009-04-12 11:29:29

+17

這就是「瞧瞧」。 :) – 2009-04-12 12:12:49

回答

121

從jQuery 1.7開始,您應該使用off刪除事件處理程序,並使用on添加它們,儘管您仍然可以使用click速記。

$('#clickme').off('click').on('click', fireclick); 
$('#clickme').off().on('click', fireclick); 

原來的答覆:

如果要更換所有點擊處理程序,調用unbind第一沒有一個函數參數。如果您想要替換所有事件處理程序,請不要指定事件類型。

$('#clickme').unbind('click').click(fireclick); 
$('#clickme').unbind().click(fireclick); 
3

我會嘗試消除額外的電話,但短期的tyhat你能確保每次調用這兩個:

$('#clickme').unbind('click', fireclick); 
$('#clickme').click(fireclick); 
18

您可以使用jQuery的功能unbind除去第一事件:

var fireClick = function() { alert('Wuala!!!') }; 

$('#clickme').click(fireclick); 
$('#clickme').unbind('click', fireClick); // fireClick won't fire anymore... 
$('#clickme').click(fireclick); // ...but now it will 
-8

您應該使用的setInterval。問題是你不能同時彈出兩個警報。首先人們必須關閉第一或第二個不能出現在屏幕上......

20

使用一個命名空間,以確保你不刪除任何其他聽衆:

$('#clickme').off('click.XXX').on('click.XXX', fireclick); 

只要沒有其他代碼使用XXX,你可以肯定你還沒有搞亂一些你不知道的其他行爲。