Wyczyść wszystkie pola formularza po powrocie za pomocą przycisku Wstecz w przeglądarce


87

Potrzebuję sposobu na wyczyszczenie wszystkich pól w formularzu, gdy użytkownik korzysta z przycisku Wstecz przeglądarki. W tej chwili przeglądarka pamięta wszystkie ostatnie wartości i wyświetla je, kiedy wracasz.

Więcej wyjaśnień na temat tego, dlaczego tego potrzebuję. Mam wyłączone pole wejściowe, którego wartość jest generowana automatycznie przy użyciu algorytmu, aby była unikalna w określonej grupie danych. Po przesłaniu formularza i wprowadzeniu danych do bazy danych użytkownik nie powinien mieć możliwości ponownego użycia tej samej wartości w celu przesłania tego samego formularza. Dlatego w pierwszej kolejności wyłączyłem pole wprowadzania. Ale jeśli użytkownik użyje przycisku wstecz w przeglądarce, przeglądarka zapamięta ostatnią wartość i ta sama wartość zostanie zachowana w polu wejściowym. W związku z tym użytkownik może ponownie przesłać formularz z tą samą wartością.

Nie rozumiem, co dokładnie się dzieje po naciśnięciu przycisku Wstecz w przeglądarce. Wygląda na to, że cała strona jest pobierana z pamięci podręcznej bez kontaktowania się z serwerem, jeśli rozmiar strony mieści się w limicie pamięci podręcznej przeglądarki. Jak mogę się upewnić, że strona jest ładowana z serwera niezależnie od ustawień przeglądarki po naciśnięciu przycisku Wstecz w przeglądarce?


Nie przechowuj wygenerowanej wartości w formularzu HTML. Wygeneruj go na serwerze.
DAN

Jak to zrobić w AMP (bez niestandardowego JS) bez utraty możliwości automatycznego uzupełniania?
Prathamesh Gharat

Odpowiedzi:


81

Nowoczesne przeglądarki implementują coś, co nazywa się pamięcią podręczną wsteczną (BFCache). Po naciśnięciu przycisku Wstecz / Dalej rzeczywista strona nie jest ponownie ładowana (a skrypty nigdy nie są ponownie uruchamiane).

Jeśli musisz coś zrobić w przypadku, gdy użytkownik wciska klawisze wstecz / dalej - nasłuchuj BFCache pageshowi pagehidezdarzeń:

window.addEventListener("pageshow", () => {
  // update hidden input field
});

Zobacz więcej szczegółów na temat implementacji Gecko i WebKit .


U mnie zadziałało idealnie. Dzięki!!
Prabin Pebam

Potwierdzono również działanie. Ręcznie zresetuj moje dane wejściowe i wydaje się, że działa. Dzięki!
Andy

87

Innym sposobem bez JavaScript jest <form autocomplete="off">zapobieganie ponownemu wypełnianiu formularza przez przeglądarkę ostatnimi wartościami.

Zobacz także to pytanie

Testowałem to tylko z pojedynczym znakiem <input type="text"> wewnątrz formularza, ale działa dobrze w obecnych przeglądarkach Chrome i Firefox, niestety nie w IE10.


1
To działa świetnie, ale dla mnie jest naprawdę zastanawiające, dlaczego usuwa wartość wejściową podczas uderzania w tył i do przodu. Co jeśli chcesz zachować tę funkcjonalność, ale chcesz zapobiec faktycznemu autouzupełnianiu przeglądarki? To jest to czego chce. Artykuł w3schools nawet nie mówi, że ma omawianą tutaj funkcjonalność.
mikato

Działa to świetnie przy resetowaniu formularza z powrotem do jego pierwotnej wartości podczas nawigowania po historii.
Craig Harshbarger

5
Działa to również po zastosowaniu na jednym elemencie. <input type="text" autocomplete="off">
Jakub Kaleta,

1
działa poprawnie na wejściach, ale nie działa w obszarze tekstowym
Bassem Shahin

28

Natknąłem się na ten post, szukając sposobu na wyczyszczenie całego formularza związanego z BFCache (pamięć podręczna przycisków wstecz / dalej) w Chrome.

Oprócz tego, który Sim dostarczył, mój przypadek użycia wymagał połączenia szczegółów z przyciskiem Wyczyść formularz na przycisku Wstecz? .

Odkryłem, że najlepszym sposobem na to jest pozwolenie formie zachowywać się zgodnie z oczekiwaniami i wywołanie zdarzenia:

$(window).bind("pageshow", function() {
    var form = $('form'); 
    // let the browser natively reset defaults
    form[0].reset();
});

Jeśli nie obsługujesz inputzdarzeń w celu wygenerowania obiektu w języku JavaScript lub czegoś innego, to koniec. Jeśli jednak słuchasz wydarzeń, to przynajmniej w Chrome musisz sam wywołać changewydarzenie (lub dowolne zdarzenie, które chcesz obsłużyć, w tym niestandardowe):

form.find(':input').not(':button,:submit,:reset,:hidden').trigger('change');

To musi być dodana poreset zrobić dobrego.


2
Zauważ, że reset () nie działa dla ukrytych pól wejściowych.
Damien

13

Jeśli potrzebujesz kompatybilności ze starszymi przeglądarkami, opcja "pokazu stron" może nie działać. Poniższy kod zadziałał dla mnie.

$(window).load(function() {
    $('form').get(0).reset(); //clear form data on page load
});

7

To właśnie zadziałało dla mnie.

$(window).bind("pageshow", function() {
    $("#id").val('');
    $("#another_id").val('');
});

Początkowo miałem to w $(document).readysekcji mojego jquery, która również działała. Słyszałem jednak, że nie wszystkie przeglądarki uruchamiają się $(document).readypo naciśnięciu przycisku Wstecz, więc go wyjąłem. Nie znam zalet i wad tego podejścia, ale testowałem na wielu przeglądarkach i na wielu urządzeniach i nie znaleziono żadnych problemów z tym rozwiązaniem.


Bardzo mi to pomogło :)
acmsohail

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.