Powiedzmy, że mam aplikację internetową, która ma stronę, która może zawierać 4 bloki skryptów - skrypt, który piszę, może znajdować się w jednym z tych bloków, ale nie wiem, który z nich jest obsługiwany przez kontroler.
Powiązuję niektóre onclick
zdarzenia z przyciskiem, ale okazuje się, że czasami są one wykonywane w kolejności, której się nie spodziewałem.
Czy istnieje sposób na zapewnienie porządku lub jak radziłeś sobie z tym problemem w przeszłości?
javascript
jquery
events
mkoryak
źródło
źródło
Odpowiedzi:
Od dawna próbowałem uogólnić ten rodzaj procesu, ale w moim przypadku interesowała mnie tylko kolejność pierwszego w łańcuchu słuchacza.
Jeśli jest to przydatne, oto moja wtyczka jQuery, która wiąże detektor zdarzeń, który jest zawsze wyzwalany przed innymi:
** ZAKTUALIZOWANY inline ze zmianami jQuery (dzięki Toskan) **
Kwestie, na które należy zwrócić uwagę:
źródło
this.data("events")
, patrz tutaj stackoverflow.com/questions/12214654/ ...Jeśli kolejność jest ważna, możesz tworzyć własne zdarzenia i przypisywać wywołania zwrotne do uruchamiania, gdy te zdarzenia są wyzwalane przez inne wywołania zwrotne.
Przynajmniej coś takiego.
źródło
Metoda Dowskiego jest dobra, jeśli wszystkie twoje callbacki będą zawsze obecne i jesteś zadowolony, że są od siebie zależni.
Jeśli jednak chcesz, aby wywołania zwrotne były od siebie niezależne, możesz skorzystać z propagacji i dołączać kolejne zdarzenia jako delegaty do elementów nadrzędnych. Procedury obsługi elementu nadrzędnego zostaną wyzwolone po funkcjach obsługi elementu, kontynuując aż do dokumentu. Jest to całkiem dobre, ponieważ możesz użyć
event.stopPropagation()
,event.preventDefault()
etc, aby pominąć programy obsługi i anulować lub anulować akcję.Lub, jeśli ci się to nie podoba, możesz użyć wtyczki Nick Leaches bindLast, aby zmusić wydarzenie do ostatniego powiązania: https://github.com/nickyleach/jQuery.bindLast .
Lub, jeśli używasz jQuery 1.5, możesz również potencjalnie zrobić coś sprytnego z nowym obiektem Deferred.
źródło
.delegate
nie jest już używany i powinieneś go teraz używać.on
, ale nie wiem, jak możesz osiągnąć to samo zachowanie zon
Kolejność wywoływania powiązanych wywołań zwrotnych jest zarządzana przez dane zdarzenia każdego obiektu jQuery. Nie ma żadnych funkcji (o których wiem), które pozwalają na bezpośrednie przeglądanie i manipulowanie tymi danymi, możesz używać tylko bind () i unbind () (lub dowolnej z równoważnych funkcji pomocniczych).
Metoda Dowskiego jest najlepsza, powinieneś zmodyfikować różne powiązane wywołania zwrotne, aby powiązać je z uporządkowaną sekwencją niestandardowych zdarzeń, z „pierwszym” wywołaniem zwrotnym powiązanym ze „rzeczywistym” zdarzeniem. W ten sposób, bez względu na to, w jakiej kolejności są one związane, sekwencja zostanie wykonana we właściwy sposób.
Jedyną alternatywą, jaką widzę, jest coś, nad czym naprawdę nie chcesz się zastanawiać: jeśli wiesz, że składnia wiążąca funkcji mogła być wcześniej związana, spróbuj usunąć powiązanie wszystkich tych funkcji, a następnie ponownie je powiązać we właściwej kolejności. To tylko prośba o kłopoty, ponieważ masz teraz zduplikowany kod.
Byłoby fajnie, gdyby jQuery pozwolił ci po prostu zmienić kolejność powiązanych zdarzeń w danych zdarzenia obiektu, ale bez pisania jakiegoś kodu, aby podłączyć się do rdzenia jQuery, co wydaje się niemożliwe. I prawdopodobnie pozwolenie na to ma implikacje, o których nie pomyślałem, więc może jest to celowe pominięcie.
źródło
Należy pamiętać, że w świecie jQuery musi to zostać zaimplementowane inaczej od wersji 1.8. Poniższa informacja o wersji pochodzi z bloga jQuery:
Mamy pełną kontrolę nad kolejnością, w jakiej procedury obsługi będą wykonywane we wszechświecie jQuery . Ricoo zwraca na to uwagę powyżej. Nie wygląda na to, żeby jego odpowiedź przyniosła mu dużo miłości, ale ta technika jest bardzo przydatna. Rozważ na przykład za każdym razem, gdy musisz wykonać własny program obsługi przed jakimś programem obsługi w widgecie biblioteki lub musisz mieć możliwość warunkowego anulowania wywołania funkcji obsługi widgetu:
źródło
po prostu połącz obsługę normalnie, a następnie uruchom:
więc na przykład:
źródło
$._data(element, 'events')[name].reverse()
działaźródło
Możesz spróbować czegoś takiego:
źródło
Mam ten sam problem i znalazłem ten temat. powyższe odpowiedzi mogą rozwiązać ten problem, ale nie sądzę, że są to dobre plany.
pomyślmy o prawdziwym świecie.
jeśli korzystamy z tych odpowiedzi, musimy zmienić nasz kod. musisz zmienić swój styl kodu. coś takiego:
oryginalny:
włamać się:
w miarę upływu czasu pomyśl o swoim projekcie. kod jest brzydki i trudny do odczytania! inny powód jest prosty, jest zawsze lepszy. jeśli masz 10 bindAtTheStart, może to nie zawierać błędów. jeśli masz 100 bindAtTheStart, czy na pewno możesz zachować je we właściwej kolejności?
więc jeśli musisz powiązać te same zdarzenia z wieloma. Myślę, że najlepszym sposobem jest kontrola kolejności ładowania pliku js lub kodu js. jquery może obsługiwać dane zdarzenia jako kolejkę. kolejność jest pierwsza weszła, pierwsza wyszła. nie musisz zmieniać żadnego kodu. po prostu zmień kolejność ładowania.
źródło
Oto moje ujęcie, obejmujące różne wersje jQuery:
źródło
W niektórych specjalnych przypadkach, gdy nie możesz zmienić sposobu powiązania zdarzeń kliknięcia (powiązania zdarzeń są tworzone z kodów innych osób) i możesz zmienić element HTML, oto możliwe rozwiązanie ( ostrzeżenie : nie jest to zalecany sposób łączenia wydarzenia, inni programiści mogą cię za to zamordować):
Dzięki temu sposobowi łączenia, twoja obsługa zdarzeń zostanie dodana jako pierwsza, więc zostanie wykonana jako pierwsza.
źródło
JQuery 1.5 wprowadza obietnice, a oto najprostsza implementacja, jaką widziałem, kontrolująca kolejność wykonywania. Pełna dokumentacja pod adresem http://api.jquery.com/jquery.when/
źródło