Chcę zorganizować wydarzenie, dopóki nie będę gotowy do jego odpalenia np
$('.button').live('click', function(e){
e.preventDefault();
// do lots of stuff
e.run() //this proceeds with the normal event
}
Czy istnieje odpowiednik run()
funkcji opisanej powyżej?
jquery
jquery-events
Mazatek
źródło
źródło
Odpowiedzi:
Nie. Gdy wydarzenie zostanie odwołane, zostaje odwołane.
Możesz jednak ponownie uruchomić zdarzenie później, używając flagi, aby określić, czy Twój kod niestandardowy już został uruchomiony, czy nie - na przykład (zignoruj rażące zanieczyszczenie przestrzeni nazw):
Bardziej uogólnionym wariantem (z dodatkową korzyścią w postaci uniknięcia zanieczyszczenia globalnej przestrzeni nazw) może być:
Stosowanie:
Dodatkowa super-minimalistyczna wtyczka jQuery z
Promise
obsługą:Stosowanie:
źródło
lots_of_stuff_already_done = true;
flagi - w przeciwnym razie nie ma możliwości, aby funkcja ciągle się powtarzała.Nowsza wersja zaakceptowanej odpowiedzi.
Krótka wersja:
Dobrym przypadkiem użycia czegoś takiego jak to jest sytuacja, w której możesz mieć starszy kod formularza, który działa, ale poproszono Cię o ulepszenie formularza przez dodanie czegoś takiego jak weryfikacja adresu e-mail przed przesłaniem formularza. Zamiast przekopywać się przez kod pocztowy formularza zaplecza, możesz napisać interfejs API, a następnie zaktualizować kod frontonu, aby najpierw trafił do tego interfejsu API, zanim zezwolisz formularzowi na wykonanie tradycyjnego POST.
Aby to zrobić, możesz zaimplementować kod podobny do tego, który napisałem tutaj:
źródło
Możesz zrobić coś takiego
źródło
Zastąp właściwość w
isDefaultPrevented
następujący sposób:IMHO, jest to najbardziej kompletny sposób ponownego wywołania zdarzenia z dokładnie tymi samymi danymi.
źródło
e
jest niezdefiniowana. powinno byćevt.preventDefault()
. Próbowałem edytować, ale moje zmiany muszą mieć więcej niż 6 znaków i właśnie dodałem 2 :(event.isPropagationStopped = function(){ return false; };
. Dodałem również właściwość niestandardową do zdarzenia, aby móc wykryć w module obsługi, czy sprawdzenie, które uniemożliwiło wykonanie, zostało wykonane, więc nie jest wykonywane ponownie. Wspaniały!Jest możliwość korzystania
currentTarget
zevent
. Przykład pokazuje, jak postępować z przesłaniem formularza. Podobnie możesz uzyskać funkcję zonclick
atrybutu itp.źródło
submit()
ten sam element, czy nie wrócisz do swojego kodu `` $ ('form'). on ('submit')) i powtarzasz go w kółko?Po prostu nie wykonuj tego
e.preventDefault();
lub wykonuj to warunkowo.Z pewnością nie możesz zmienić, kiedy zachodzi pierwotna akcja zdarzenia.
Jeśli chcesz "odtworzyć" oryginalne zdarzenie interfejsu użytkownika jakiś czas później (powiedzmy, w wywołaniu zwrotnym dla żądania AJAX), będziesz musiał po prostu sfałszować to w inny sposób (jak w odpowiedzi vzwicka) ... kwestionować użyteczność takiego podejścia.
źródło
Nowsza odpowiedź umiejętnie wykorzystuje
jQuery.one()
https://stackoverflow.com/a/41440902/510905
źródło
tak długo, jak „dużo rzeczy” nie robi czegoś asynchronicznego, jest to absolutnie niepotrzebne - zdarzenie wywoła sekwencję każdego handlera na swojej drodze, więc jeśli istnieje zdarzenie onklick w elemencie nadrzędnym, zostanie uruchomione po onclik- zdarzenie dziecka zostało całkowicie przetworzone. javascript nie wykonuje tutaj pewnego rodzaju „wielowątkowości”, która powoduje konieczność „zatrzymania” przetwarzania zdarzenia. wniosek: „wstrzymywanie” zdarzenia tylko po to, aby je wznowić w tym samym module obsługi, nie ma sensu.
jeśli „dużo rzeczy” jest czymś asynchronicznym, to również nie ma sensu, ponieważ uniemożliwia to asynchronicznym rzeczom zrobienie tego, co powinny (rzeczy asynchroniczne) i sprawia, że zachowują się tak, jakby wszystko było w kolejności (gdzie wracamy do mojego pierwszego akapitu )
źródło
async
-fag: api.jquery.com/jQuery.ajax ) ... ale tworzenie synchronicznego żądania ajax jest złym pomysłem w prawie każdym przypadku, więc lepiej byłoby znaleźć inne rozwiązanie.Podejście, które stosuję, jest następujące:
źródło
Zaakceptowane rozwiązanie nie zadziała, jeśli pracujesz z tagiem kotwicy. W takim przypadku po zadzwonieniu nie będzie można ponownie kliknąć łącza
e.preventDefault()
. Dzieje się tak, ponieważ zdarzenie kliknięcia generowane przez jQuery jest po prostu warstwą nad natywnymi zdarzeniami przeglądarki. Zatem wywołanie zdarzenia „kliknięcia” w tagu kotwicy nie spowoduje podążania za linkiem. Zamiast tego możesz użyć biblioteki, takiej jak jquery-simulate , która pozwoli ci uruchomić natywne zdarzenia przeglądarki.Więcej szczegółów na ten temat można znaleźć w tym linku
źródło
Innym rozwiązaniem jest użycie window.setTimeout w detektorze zdarzeń i wykonanie kodu po zakończeniu procesu zdarzenia. Coś jak...
źródło
Wiem, że ten temat jest stary, ale myślę, że mogę wnieść swój wkład. Możesz wyzwolić domyślne zachowanie zdarzenia dla określonego elementu w dowolnym momencie w swojej funkcji obsługi, jeśli znasz już to zachowanie. Na przykład, gdy wyzwalasz zdarzenie kliknięcia przycisku resetowania, w rzeczywistości wywołujesz funkcję resetowania w najbliższym formularzu jako zachowanie domyślne. W swojej funkcji obsługi, po użyciu funkcji PreventDefault, możesz przywołać domyślne zachowanie, wywołując funkcję resetowania w najbliższej formie w dowolnym miejscu kodu modułu obsługi.
źródło
Jeśli ten przykład może pomóc, dodaje „niestandardowe potwierdzenie popin” do niektórych linków (zachowuję kod „$ .ui.Modal.confirm”, to tylko przykład wywołania zwrotnego, które wykonuje oryginalną akcję):
źródło