Jak mogę zagwarantować prawidłowe przechwytywanie i ponowne uruchamianie zdarzenia przesyłania formularza?
Prawdopodobnie nie jest to zwykłe „Jak przechwytywać zdarzenia przesyłania formularzy?” pytanie.
próbuję zrozumiećdokładnie w jaki sposób zdarzenia przesyłania formularzy są obsługiwane przez jQuery, waniliowy Javascript i przeglądarkę (IE / FF / Chrome / Safari / Opera) - oraz relacje między nimi. (Zobacz moje inne pytanie.) Po godzinach Googlingu i eksperymentowania nadal nie mogę dojść do konkluzji, ani z powodu niezgody, ani niejasności.
Kończę skrypt, który integruje się z formularzami witryny, aby formularze nie mogły być przesyłane, dopóki nie pojawi się żądanie AJAX.
Idealnie:
Użytkownik wypełnia formularzFormularz jest przesyłany - ale nie są wywoływane żadne wcześniej powiązane funkcje obsługi zdarzeń, z wyjątkiem moichMój program obsługi wysyła żądanie API (oczywiście asynchronicznie)Użytkownik potwierdza wyniki walidacji z odpowiedzi APIPrzesłanie formularza trwa normalnie, automatycznie, przywołując inne programy obsługi, które wcześniej zostały zlikwidowaneMoje obecne zrozumienie jest następujące: (mogą być nieprawidłowe, popraw mnie, jeśli tak)
jQuery wiąże formularz przesyła programy obsługi zdarzeń do przycisku przesyłaniaclick
wydarzeniaProcedury obsługi zdarzeń bezpośrednio na elemencie przesyłaniaclick
wydarzenia (czy w znaczniku jakonclick=""
lub związane za pomocą jQuery) są wykonywane jako pierwszeObsługa zdarzeń w formularzusubmit
wydarzenia (czy w znaczniku jakonsubmit=""
lub związane za pomocą jQuery) są wykonywane dalejPowołanie$('[type=submit]').click()
nie wywołuje formularzasubmit
wydarzenie, więc jego obsługa nie zostanie wywołanaPowołanie$('form').submit()
nie wywołuje przycisku przesyłaniaclick
wydarzenie, więc jego obsługa nie zostanie wywołanaJednak w jakiś sposób użytkownik, który kliknie przycisk Wyślij, kończy wywoływanie programów obsługi powiązanych z formularzemsubmit
wydarzenie ... (ale jak wspomniano powyżej, wywołanie kliknięcia przycisku Wyślij nie robi tego samego)W rzeczywistości,każdy sposób, w jaki użytkownik przesyła formularz (za pomocą przycisku Wyślij lub naciskając Enter), programy obsługi powiązane z jQuery do formularzasubmit
wydarzenie nazywa się ...W tej chwili jestem:
Odłączanie programów obsługi powiązanych z jQuery do przycisku przesyłaniaclick
zdarzenie przy zachowaniu odniesienia do nichPowiązanie mojego własnego programu obsługi z przyciskiem przesyłaniaclick
zdarzenie, więc wykonuje się najpierwZabieranie dowolnych handlarzy związanych przy użyciu znacznikówonclick=""
ionsubmit=""
(na ich odpowiednich elementach) i ponownie wiążąc je za pomocą jQuery (więc wykonują po moim), a następnie ustawiają atrybuty nanull
Ponowne wiązanie ich programów obsługi (od kroku 1), aby wykonali ostatniWłaściwie to było niezwykle skuteczne w moich własnych testach, więc mój program obsługi zdarzeń odpalił pierwszy (niezbędny).
Problem i moje pytania:
Mój przewodnik wystrzeliwuje pierwszy, zgodnie z oczekiwaniami (do tej pory). Problem polega na tym, że mój program obsługi jest asynchroniczny, więc muszę wyłączyć (preventDefault / stopPropagation / etc) formularzsubmit
lub przycisk Wyślijclick
zdarzenie, które go wywołało ... aż do zakończenia żądania API. Następnie, gdy żądanie API wróci i wszystko będzie OK, muszę ponownie wysłać formularz automatycznie. Ale z powodu moich obserwacji powyżej, jak mogę się upewnićwszystko osoby zajmujące się zdarzeniami są wyrzucane tak, jakby to była naturalna forma?
Jaki jest najczystszy sposób na złapanie wszystkich swoich programów obsługi zdarzeń, umieszczenie mojego pierwszego, a następnie ponowne wywołanie formularza?
A jaka jest różnica, jeśli w ogóle, między$('form').submit()
i$('form')[0].submit()
? (I to samo dla$('[type=submit]').click()
i$('[type=submit]')[0].click()
)
tl; dr, Jaka jest kanoniczna, jasna, uniwersalna dokumentacja dotycząca obsługi JavaScript / jQuery / przeglądarki formularza-zgłoszenia-zdarzenia? (Nie szukam rekomendacji książki.)
Kilka wyjaśnień: staram się zrekompensować dużą liczbę skryptów JavaScript w koszykach na zakupy, gdzie czasami formularz jest przesyłany tylko wtedy, gdy użytkownik KLIKUJE PRZYCISKIEM (nie jest to przycisk przesyłania) na dole strony, lub są inne trudne scenariusze. Do tej pory było to dość udane, po prostu ponownie wywołuje się zgłoszenie, które naprawdę stanowi problem.