2009-04-12 3 views
68

Я попытаюсь объяснить проблему простым кодом.Как перезаписать обработчики событий jquery

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

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

Так что теперь он будет предупреждать 2 раза, но мне нужно его оповещение только один раз. Пробовал так много способов, но никакого результата.

Спасибо.

+0

Можете ли вы привести какой-то контекст, как вызов, связанный с событием, происходит дважды? Может быть, вы можете предотвратить изменение второго вызова, как ваш код функционирует немного. –

+1

Связанный: http://stackoverflow.com/questions/209029/best-way-to-remove-an-event-handler-in-jquery –

+17

Это, «Voila». :) –

ответ

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); 
+1

Bah! Вы выигрываете для соединения вызова, но, возможно, уточните свой ответ, чтобы он удалял только дополнительный обработчик. Итак: $ ('# clickme'). Unbind ('click', fireclick) .click (fireclick) –

+4

Вопрос заключался в «перезаписывании обработчиков событий jquery» - я предполагал, что он хотел их заменить. Для этого ему нужно каждый раз вызывать развязывание (поэтому я повторил вызов для обоих) и не указывал аргумент функции. – tvanfosson

+3

Это был определенно правильный способ сделать это, когда вы ответили на вопрос, поэтому я поддержал его. Тем не менее, я считаю, что «новый и улучшенный» способ связан с методами on() и off(). Поскольку этот ответ является первым результатом Google для поиска «jquery replace event handler», может быть полезно добавить к вашему ответу. '$ ('# clickme'). off ('click'). on ('click', fireclick);' или просто '$ ('# clickme'). off ('click'). click (fireclick);' , – chucksmash

3

Я бы попытаться устранить лишние звонки, но не хватает tyhat вы могли убедиться, что называть обе эти каждый раз:

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

Спасибо, сейчас он работает :) – taras

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. Проблема в том, что вы не можете одновременно получать два предупреждения. Сначала надо закрыть первый или второй не может появиться на экране ...

+5

У вас есть вопрос? – kapa

20

Используйте пространство имен, чтобы убедиться, что вы не удалите других слушателей:

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

Пока никто другой код использует XXX, вы можете быть уверены, что вы не испортили другое поведение, о котором вы не знали.

Смежные вопросы