2012-04-03 11 views
6

Załóżmy, że mamy dużo do zrobienia. Używamy $('body').on('click', '.todo', do_stuff) zamiast $('.todo').click(do_stuff), więc dołączymy tylko jeden detektor zdarzeń do DOM.Czy dwa równe zdarzenia jQuery .on są wiązane dwukrotnie?

Jednak używam małego MVC. Każdy widok ma ten kod: $('body').on('click', '.todo', do_stuff). Więc jeśli mamy 20 do zrobienia, czy to oznacza, że ​​ciało ma 20 na załączonych słuchaczach lub tylko jeden? czy wszystkie będą strzelać?

+0

Można powiązać wiele detektorów zdarzeń z tym samym elementem i wszystkie z nich można uruchomić. – webdevbyjoss

+0

@webdevbyjoss jQuery ... –

+0

Z twojego pytania wynika, że ​​próbujesz zrozumieć, jak działa funkcja $ ('ddd'). Do(). Być może warto przeczytać tutaj: http://api.jquery.com/on/ – webdevbyjoss

Odpowiedz

5

Trzeba zabić poprzednią obsługi zdarzenia:

<script> 
    $('body').off('click','.todo', do_stuff); 
    $('body').on('click', '.todo', do_stuff); 
</script> 

w tym rzeczywistej funkcji obsługi zdarzeń w funkcji off() będzie usuwaj tylko ten konkretny moduł obsługi, a nie wszystkie inne wywoływane przez te same elementy/zdarzenia. Ponadto unikaj anonimowych funkcji podczas wykonywania tej czynności.

Proponuje się również, aby porzucić unbind() i kill(). on()/off() powinien odpowiadać wszystkim potrzebom związanym z obsługą zdarzeń, w tym przyszłym powiązaniom na żywo i odroczonym wynikom.

+0

btw używam przestrzeni nazw dla funkcje anon. "click.yepdido" – CamelCamelCamel

+0

To dobrze, że możesz iść! ;) – keystorm

+0

Możesz również być zainteresowany '.one()', który się odrywa od pierwszego zdarzenia. Kilka załączników '.one()' nadal będzie powodować kilka wywołań do obsługi, więc '.off()' jest nadal potrzebne. – keystorm

4

Jeśli wykonasz ten kod dwadzieścia razy, skończysz z dwudziestoma programami obsługi zdarzeń związanymi; i tak, oni wszyscy będą strzelać.

+0

To okropne! – CamelCamelCamel

+0

która jest funkcją! użyj polecenia unbind(), aby usunąć detektory zdarzeń, których już nie potrzebujesz – webdevbyjoss

2

Oznacza to, że body ma 1 słuchacza, który sprawdza wszystkie zdarzenia kliknięcia i sprawdza strukturę DOM celu zdarzenia, aby zobaczyć, czy zawiera element .todo.

Na ciele będzie tylko 1 słuchacz, niezależnie od tego, ile masz .todo elementów.

Przykład (kod szorstki, ignorować gotowy uchwytu itd):

<script> 
    $('body').on('click', '.todo', myFunc); 
    // results in 1 handler on the Body, which will be called when each .todo element is clicked 
</script> 

<body> 
    <div class="todo">Foo</div> 
    <div class="todo">Bar</div> 
    <div class="todo">Baz</div> 
</body> 
+0

um, istnieje sprzeczna odpowiedź, więc skrzypce lub źródło będą dobre – CamelCamelCamel

+0

tak http://jsfiddle.net/kSAqM/ – CamelCamelCamel

Powiązane problemy