Mam kilka stron z formularzami w mojej aplikacji.
Jak mogę zabezpieczyć formularz w taki sposób, że jeśli ktoś opuści lub zamknie kartę przeglądarki, powinien zostać poproszony o potwierdzenie, że naprawdę chce opuścić formularz z niezapisanymi danymi?
javascript
forms
Chan
źródło
źródło
Odpowiedzi:
Krótka, zła odpowiedź:
Możesz to zrobić, obsługując
beforeunload
zdarzenie i zwracając ciąg inny niż zero :Problem z tym podejściem polega na tym, że przesłanie formularza powoduje także zwolnienie zdarzenia . Można to łatwo naprawić, dodając flagę, którą przesyłasz formularz:
Następnie dzwoniąc do setera podczas przesyłania:
Ale czytaj dalej ...
Długa, poprawna odpowiedź:
Nie chcesz również wyświetlać tej wiadomości, gdy użytkownik nic nie zmienił w formularzach . Jednym z rozwiązań jest użycie
beforeunload
zdarzenia w połączeniu z flagą „brudną”, która uruchamia monit tylko wtedy, gdy jest naprawdę istotny.Aby wdrożyć tę
isDirty
metodę, istnieją różne podejścia.Możesz używać jQuery i serializacji formularzy , ale to podejście ma pewne wady. Najpierw musisz zmienić kod, aby działał w dowolnej formie (
$("form").each()
zrobi to), ale największym problemem jest to, że jQueryserialize()
będzie działał tylko na nazwanych, nie wyłączonych elementach, więc zmiana dowolnego wyłączonego lub nienazwanego elementu nie wyzwoli brudnej flagi. Istnieją obejścia tego problemu , takie jak dokonywanie kontroli tylko do odczytu zamiast włączania, serializacji, a następnie ponownego wyłączania kontroli.Wydaje się, że wydarzenia powinny się odbyć. Możesz spróbować odsłuchać naciśnięcia klawiszy . To wydarzenie ma kilka problemów:
change
Wydarzenie również nie wywołuje na wartościach ustalonych z kodu JavaScript , więc również nie będą działać dla wejść wirtualnych.Wiązania
input
zdarzenie do wszystkichinput
s (itextarea
S iselect
S) na swojej stronie nie będzie działać na starszych przeglądarkach i, jak wszystkie rozwiązania obsługi zdarzeń wymienionych powyżej, nie obsługuje cofania. Gdy użytkownik zmieni pole tekstowe, a następnie je cofnie, lub zaznaczy i odznaczy pole wyboru, formularz nadal będzie uważany za brudny.A jeśli chcesz wprowadzić więcej zachowań, takich jak ignorowanie niektórych elementów, będziesz musiał wykonać jeszcze więcej pracy.
Nie wymyślaj koła ponownie:
Zanim więc pomyślisz o wdrożeniu tych rozwiązań i wszystkich wymaganych obejść, zdaj sobie sprawę, że zmieniasz kierownicę i masz skłonność do problemów, które inni już dla ciebie rozwiązali.
Jeśli twoja aplikacja korzysta już z jQuery, możesz równie dobrze użyć sprawdzonego, utrzymywanego kodu zamiast zwijania własnego, i do tego wszystkiego użyj biblioteki trzeciej części. jQuery's Are You Sure? wtyczka działa świetnie, zobacz ich stronę demo . To takie proste:
Niestandardowe wiadomości nie są obsługiwane wszędzie
Pamiętaj, że Firefox 4 nie obsługiwał niestandardowych wiadomości w tym oknie dialogowym. Od kwietnia 2016 r. Wdrażany jest Chrome 51, w którym usuwane są również niestandardowe wiadomości .
Niektóre alternatywy istnieją gdzie indziej na tej stronie, ale myślę, że takie okno dialogowe jest wystarczająco jasne:
źródło
Sprawdź zdarzenie onbeforeunload JavaScript . Jest to niestandardowy JavaScript wprowadzony przez Microsoft, jednak działa w większości przeglądarek, a ich dokumentacja onbeforeunload zawiera więcej informacji i przykładów.
źródło
poprzez jquery
Możesz użyć funkcji Google Serialize formularza JQuery, która zbierze wszystkie dane wejściowe formularza i zapisze je w tablicy. Myślę, że to wyjaśnienie wystarczy :)
źródło
Uniwersalne rozwiązanie niewymagające konfiguracji, która automatycznie wykrywa wszystkie modyfikacje danych wejściowych, w tym elementy możliwe do zadowolenia:
źródło
Zbudowany na podstawie doskonałego pomysłu Wasim A. na zastosowanie serializacji. Problem polegał na tym, że ostrzeżenie wyświetlało się również podczas przesyłania formularza. Zostało to naprawione tutaj.
Został przetestowany w Chrome i IE 11.
źródło
Na podstawie poprzednich odpowiedzi i zebranych razem z różnych miejsc w przepełnieniu stosu, oto rozwiązanie, które wymyśliłem, które obsługuje przypadek, gdy naprawdę chcesz przesłać swoje zmiany:
Warto zauważyć, że IE11 wydaje się wymagać od
closeEditorWarning
funkcji powrotu,undefined
aby nie wyświetlała ostrzeżenia.źródło
QC.thisPage.isDirty = false;
byćwindow.thisPage.isDirty = false;
? W ten sposób sprawdzi, czy przesyłasz formularz, i nie wyświetli ostrzeżenia. Wydawało się, że pracuję dla moich testów. Ponadto większość form mainput
raczej niżtextarea
. Użyłem następujących, które działają raczej dobrze:$("form").on('keyup', 'textarea,input,select', function () {
Poniższy linijka zadziałał dla mnie.
Wystarczy ustawić
modified
aby prawda lub fałsz w zależności od stanu aplikacji.źródło
undefined
zamiast,null
gdy IE wypisze „null”, jeślimodified
jest fałszem.Poniższy kod działa świetnie. Musisz osiągnąć zmiany wejściowe elementów formularza za pomocą atrybutu id:
źródło
źródło
Za pomocą serialize () można utworzyć ciąg tekstowy zakodowany w adresie URL, serializując wartości formularza i sprawdzając, czy formularz zmienił się przed odciążeniem
Zobacz ten link https://coderwall.com/p/gny70a/alert-when-leaving-page-with-unsaved-form Wpisany przez Vladimir Sidorenko
źródło
serialize()
i rzeczywiście ma to swoje wady.Dodając do idei @codecaster, możesz dodać to do każdej strony za pomocą formularza (w moim przypadku używam go w sposób globalny, więc tylko w formularzach będzie to ostrzegać) zmień jego funkcję na
Umieszczaj także formularze wysyłania, w tym linki logowania i przyciski anulowania, więc gdy osoba naciśnie przycisk anuluj lub prześlij formularz, nie spowoduje ostrzeżenia również na każdej stronie bez formularza ...
źródło
Możesz sprawdzić szczegółowe wyjaśnienie tutaj: http://techinvestigations.redexp.in/comparison-of-form-values-on-load-and-before-close/ Porównanie-wartości-form-wartości-na-obciążeniu-i -przed zamknięciem
Główny kod:
źródło
Krótka odpowiedź:
źródło
Rozwiązanie Eerika Svena Puudista ...
... spontanicznie wykonał dla mnie zadanie w złożonym otoczeniu obiektowym bez żadnych zmian.
Jedyną zastosowaną przeze mnie zmianą było odwołanie się do konkretnego formularza (tylko jeden formularz na plik) o nazwie „formForm” („forma” -> „#formForm”):
Szczególnie dobrze zrobiony jest fakt, że przycisk wysyłania jest „pozostawiony sam”.
Dodatkowo działa dla mnie również z najnowszą wersją Firefoksa (z 7 lutego 2019 r.).
źródło
Testowałem uniwersalne rozwiązanie Eli Grey, działało dopiero po uproszczeniu kodu do
Modyfikacje jego są usuwane z użycia
target[defaultValue]
i tylko użytkowaniatarget.dataset[defaultValue]
do przechowywania rzeczywistej wartości domyślnej.I dodałem „zapisany” detektor zdarzeń, w którym „zapisane” zdarzenie zostanie uruchomione przez ciebie po pomyślnym wykonaniu operacji zapisywania.
Ale to „uniwersalne” rozwiązanie działa tylko w przeglądarkach, a nie w widoku aplikacji, na przykład w przeglądarkach WeChat.
Aby działał również w przeglądarkach WeChat (częściowo), jeszcze raz kolejne ulepszenia:
źródło
Zrobiłem to inaczej, udostępniając tutaj, aby ktoś mógł uzyskać pomoc, testowany tylko z Chrome.
Chciałem ostrzec użytkownika przed zamknięciem karty tylko w przypadku pewnych zmian.
Działa dobrze, ale dostałem inny problem, gdy przesyłam formularz, otrzymuję niechciane ostrzeżenie, widziałem wiele obejść tego problemu, to dlatego, że onbeforeunload uruchamia się przed przesłaniem, dlatego nie możemy sobie z tym poradzić w przypadku zdarzenia przesłania
onbeforeunload = null
, ale Zdarzenie onclick przycisku wysyłania odpala przed tymi dwoma zdarzeniami, więc zaktualizowałem kodźródło
Przede wszystkim większość przeglądarek ma domyślnie tę funkcję. I dlaczego w ogóle tego potrzebujesz? Dlaczego nie chcesz zsynchronizować formularza? Mam na myśli, zapisz go przy każdej zmianie bez czekania na przesłanie przez użytkownika. Tak jak Kontakty Google. Oczywiście, jeśli tylko wszystkie pola w formularzu są obowiązkowe. Użytkownicy nie lubią, kiedy zmuszają się do wypełnienia czegoś bez możliwości odejścia i zastanowienia się, czy tego potrzebują. :)
źródło
save it on any change without waiting any submitting from user
Nie zawsze chcesz to robić. Czasami użytkownik chce wprowadzić wiele zmian, a następnie przejrzeć i potwierdzić, że chce je zapisać.