Zanim to przeczytasz, wyciągnij listę wydarzeń na inną stronę, sam interfejs API jest niezwykle pomocny, a wszystko, o czym rozmawiam poniżej, jest bezpośrednio połączone z tą stroną .
Po pierwsze, .click(function)jest dosłownie skrótem .bind('click', function), są one równoważne. Użyj ich podczas wiązania procedury obsługi bezpośrednio z elementem , na przykład:
$(document).click(function() {
alert("You clicked somewhere in the page, it bubbled to document");
});
Jeśli ten element zostanie wymieniony lub wyrzucony, tego modułu obsługi już nie będzie. Również elementy, których nie było, gdy ten kod był uruchamiany w celu dołączenia procedury obsługi (np. Selektor znalazł go wtedy), nie otrzymają funkcji obsługi.
.live()i .delegate()są podobnie powiązane, w .delegate()rzeczywistości używają .live()wewnętrznie, oboje nasłuchują wydarzeń, aby bąbelkować. Działa to w przypadku nowych i starych elementów , w ten sam sposób bąbelkują wydarzenia. Używasz ich, gdy elementy mogą się zmienić, np. Dodając nowe wiersze, elementy listy itp. Jeśli nie masz rodzica / wspólnego przodka, który pozostanie na stronie i nie zostanie w żadnym momencie zastąpiony, użyj w .live()ten sposób:
$(".clickAlert").live('click', function() {
alert("A click happened");
});
Jeśli jednak masz gdzieś element nadrzędny, który nie jest zastępowany (więc jego procedury obsługi zdarzeń nie idą do widzenia), powinieneś obsłużyć go w .delegate()następujący sposób:
$("#commonParent").delegate('.clickAlert', 'click', function() {
alert("A click happened, it was captured at #commonParent and this alert ran");
});
Działa to prawie tak samo, jak .live(), ale zdarzenie bąbelkuje mniej razy przed przechwyceniem i wykonaniem programów obsługi. Innym typowym zastosowaniem obu tych sposobów jest powiedz, że twoja klasa zmienia się w elemencie, nie pasując już do selektora, którego pierwotnie użyłeś ... z tymi metodami selektor jest oceniany w czasie zdarzenia , jeśli pasuje, program obsługi działa. . więc element już nie pasujący do selektora ma znaczenie, nie będzie już wykonywany. Dzięki .click()jednak obsługi zdarzeń jest związana bezpośrednio na elemencie DOM, fakt, że nie równą selektor użyto go znaleźć nie ma znaczenia ... zdarzenie jest związany i to pobyt aż element ten nie ma, lub opiekun jest usuwany za pośrednictwem .unbind().
Jeszcze innym powszechnym zastosowaniem .live()i .delegate()jest wydajność . Jeśli masz do czynienia z wieloma elementami, dołączenie modułu obsługi kliknięcia bezpośrednio do każdego elementu jest kosztowne i czasochłonne. W takich przypadkach bardziej ekonomiczne jest skonfigurowanie pojedynczego modułu obsługi i pozwolenie bąbelkowi na wykonanie pracy, spójrz na to pytanie, gdzie spowodowało to ogromną różnicę , jest to dobry przykład aplikacji.
Wyzwalanie - dla zaktualizowanego pytania
Dostępne są 2 główne funkcje wyzwalające obsługę zdarzeń, które należą do tej samej kategorii „Załącznik programu obsługi zdarzeń” w interfejsie API , są to .trigger()i .triggerHandler(). .trigger('eventName')ma wbudowane pewne skróty do typowych zdarzeń, na przykład:
$().click(fn); //binds an event handler to the click event
$().click(); //fires all click event handlers for this element, in order bound
Listę zawierającą te skróty można wyświetlić tutaj .
Jeśli chodzi o różnicę, .trigger()uruchamia procedurę obsługi zdarzenia (ale przez większość czasu nie jest to domyślna akcja, np. Umieszczenie kursora w odpowiednim miejscu w klikniętym miejscu <textarea>). Powoduje, że programy obsługi zdarzeń występują w kolejności, w jakiej zostały powiązane (tak jak zdarzenie natywne), uruchamia natywne akcje zdarzenia i tworzy kopułę DOM.
.triggerHandler()ma zwykle inny cel, tutaj po prostu próbujesz odpalić powiązane procedury obsługi, nie powoduje to uruchomienia zdarzenia natywnego, np. przesłania formularza. Nie tworzy bąbelków w modelu DOM i nie można go łączyć w łańcuchy (zwraca cokolwiek zwraca procedurę obsługi zdarzenia ostatniego powiązania dla tego zdarzenia). Na przykład, jeśli chcesz wyzwolić focuszdarzenie, ale tak naprawdę nie skupiasz się na obiekcie, po prostu chcesz, aby kod, z .focus(fn)którym jesteś powiązany, działał, to zrobiłoby to, ale .trigger()zrobiłby to, a także faktycznie skupiłby element i pojawił się.
Oto przykład z prawdziwego świata:
$("form").submit(); //actually calling `.trigger('submit');`
Spowoduje to uruchomienie wszystkich programów obsługi przesyłania, na przykład wtyczki walidacji jQuery , a następnie spróbuje przesłać plik <form>. Jeśli jednak chcesz tylko sprawdzić poprawność, ponieważ jest ona podłączona przez submitmoduł obsługi zdarzeń, ale nie przesyłaj <form>później, możesz użyć .triggerHandler('submit'), na przykład:
$("form").triggerHandler('submit');
Wtyczka zapobiega przesłaniu formularza przez program obsługi przez zbombardowanie, jeśli sprawdzenie poprawności nie przejdzie, ale w przypadku tej metody nie obchodzi nas, co robi. Niezależnie od tego, czy nastąpiło przerwanie, czy nie, nie próbujemy przesłać formularza, chcieliśmy po prostu uruchomić go, aby ponownie zweryfikował i nie robił nic więcej. ( Zastrzeżenie: jest to zbędny przykład, ponieważ .validate()wtyczka zawiera metodę, ale jest to przyzwoita ilustracja zamiaru)