2009-04-12 9 views
68

Postaram się wyjaśnić problem za pomocą prostego kodu.Jak zastąpić obsługę zdarzeń jquery

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

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

Tak więc teraz będzie to oczywiście ostrzeżenie 2 razy, ale potrzebuję go alert tylko raz. Próbowałem na wiele sposobów, ale bez rezultatu.

Dzięki.

+0

Czy możesz podać kontekst, w jaki sposób połączenie wywołania zdarzenia kończy się dwukrotnie? Być może uniemożliwisz drugiemu wywołaniu zmianę w działaniu twojego kodu. –

+1

Powiązane: http://stackoverflow.com/questions/209029/best-way-to-remove-an-event-handler-in-jquery –

+17

To jest "Voila". :) –

Odpowiedz

121

Od wersji jQuery 1.7 należy użyć off, aby usunąć programy do obsługi zdarzeń i on, aby je dodać, ale nadal można użyć skrótu click.

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

odpowiedź oryginalny:

Jeśli chcesz zastąpić wszystkie procedury obsługi kliknięcia, zadzwoń unbind pierwszy bez argument funkcji. Jeśli chcesz zastąpić wszystkie procedury obsługi zdarzeń, nie określaj typu zdarzenia.

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

Bah! Wygrywasz, aby nawiązać połączenie, ale może poprawisz swoją odpowiedź, aby usunąć tylko ten konkretny handler, który został ponownie dodany? A więc: $ ("# clickme"). Unbind ("kliknij", fireclick) .click (fireclick) –

+4

Pytanie brzmiało "nadpisuj programy obsługi zdarzeń jquery" - Zakładałem, że chciał je wszystkie zastąpić. Aby to zrobić, musi wywołać polecenie odpinania za każdym razem (dlatego powtórzyłem wywołanie po obu) i nie określać argumentu funkcji. – tvanfosson

+3

To był zdecydowanie najlepszy sposób, aby to zrobić, gdy odpowiedziałeś na pytanie, więc przegłosowałem. Powiedział, że wierzę, że "nowy i ulepszony" sposób jest z metody on() i off(). Ponieważ ta odpowiedź jest pierwszym wynikiem Google dla wyszukiwania "jquery replace event handler", pomocne może być dodanie do odpowiedzi. '$ ('# clickme'). off (" kliknij "). on (" kliknij ", fireclick);' lub po prostu '$ ('# clickme'). off (" kliknij ") .Kliknij (fireclick);' . – chucksmash

3

chciałbym spróbować wyeliminować dodatkowe połączenia, ale brakuje tyhat was mógłby upewnij się, aby zadzwonić zarówno z nich za każdym razem:

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

Dzięki, działa teraz :) – taras

18

Można użyć funkcji jQuery unbind usunąć pierwszą zdarzenie:

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

Należy użyć setInterval. Problem polega na tym, że nie można jednocześnie wysyłać dwóch alertów. Pierwszy z nich ma zamknąć pierwszy lub drugi nie może pojawić się na ekranie ...

+5

Czy czytasz pytanie? – kapa

20

Użyj nazw, aby upewnić się, aby nie usuwać żadnych innych słuchaczy:

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

Dopóki nie ma innego kod używa XXX, możesz być pewien, że nie zawiedliście innych zachowań, o których nie wiedzieliście.

Powiązane problemy