2013-03-12 6 views
8

Mam element strony internetowej, która ma kilka zwrotnych na nimJak usunąć określone wywołanie zwrotne zdarzenia z elementu HTML za pomocą jquery?

// First callback 
$("#element").click(fn1); 

// Second callback 
$("#element").click(fn2); 

// Definitions 
function fn1(){console.log("1");} 
function fn2(){console.log("2");} 

Czy istnieje sposób, aby usunąć tylko FN2 z listy wywołania zwrotne wywołane przez jQuery. Wiem, że mogę dodać "if" wewnątrz funkcji i pewną zmienną globalną, ale tego nie szukam.

Odpowiedz

4

Drugi parametr funkcji unbind określa program obsługi, który ma zostać rozwiązany.

$("#element").unbind("click", fn2); 

przykład praca:http://jsfiddle.net/k73Nx/

+1

zależy od tego wersję. Jeśli jest to coś nowego (1.7+), to ta odpowiedź nie jest dobra. Użyj $ ("# element"). Off ("kliknij"); – Adam

+0

@Adam, 'unbind()' nie jest ani przestarzałe, ani usunięte (jak na przykład 'live()'). Możesz nadal używać go jako odpowiednika 'off()'. –

+0

@ FrédéricHamidi - zgodzili się jednak bezpośrednio z samymi dokumentami jQuery: (Od jQuery 1.7, metody .on() i .off() są preferowane do dołączania i usuwania programów obsługi zdarzeń na elementach.) - sprawia, że ​​brzmi to jak unbind i bind wkrótce będzie przestarzałe. Dlaczego nie posłuchać ostrzeżenia? – Adam

0

zastosowanie .off

$("#element").off("click",fn2); 

working fiddle

+1

Powoduje to usunięcie programu obsługi zdarzenia dołączonego do elementu body, który obsługuje kliknięcia #element - w pytaniu plakat dodał zdarzenie click do samego elementu, więc to nie zadziała. – Adam

+0

tak .. dzięki @Adam ... zaktualizowany .. :) .. – bipen

+0

Czy mógłbyś zapewnić skrzypce? Nie mogłem zabrać się do pracy i zastanawiam się, czy to dlatego, że nie było związane z "na" –

1

Uważaj na składnię, inne odpowiedzi są bardzo luźne.

Jeśli używasz:

$('#element').on('click',function() { 
//callback code 
}); 

Następnie należy użyć:

$('#element').off('click'); 

You nie może użycie

$('body').off('click','#element',function() { }); 

lub

$(document).off('click','#element',function() { }); 

ponieważ pierwotnie ograniczyłeś swoje wydarzenie do #element, a nie do dokumentu lub treści.

3

Ciekawe, że nikt jeszcze nie wspomniał o przestrzeniach nazw. Czy jest powód ku temu?

Podczas dołączania wydarzenia można go nazwać spacją. Zamiast $(elem).on('click', fn) dodaj obszar nazw do zdarzenia kliknięcia. $(elem).on('click.namespaced', fn)

Po zwolnieniu można następnie odwiązać to konkretne zdarzenie, również przy użyciu przestrzeni nazw. $(elem).off('click.namespaced')

Jest to najbardziej praktyczne rozwiązanie podczas definiowania funkcji zdarzeń w linii prostej.

Jeszcze jedno można zrobić z nazw jest rozwiązać wszystkie typy zdarzeń w namespae z tylko jednego połączenia: $(elem).off('.namespaced')

Powiązane problemy