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.