Kosongkan semua bidang dalam formulir setelah kembali dengan tombol kembali browser


88

Saya membutuhkan cara untuk menghapus semua bidang dalam formulir saat pengguna menggunakan tombol kembali browser. Saat ini, browser mengingat semua nilai terakhir dan menampilkannya saat Anda kembali.

Klarifikasi lebih lanjut tentang mengapa saya membutuhkan ini, saya memiliki kolom input yang dinonaktifkan yang nilainya dihasilkan secara otomatis menggunakan algoritme untuk membuatnya unik dalam grup data tertentu. Setelah saya mengirimkan formulir dan data dimasukkan ke dalam database, pengguna seharusnya tidak dapat menggunakan nilai yang sama lagi untuk mengirimkan formulir yang sama. Oleh karena itu, saya telah menonaktifkan bidang input di tempat pertama. Tetapi jika pengguna menggunakan tombol kembali browser, browser mengingat nilai terakhir dan nilai yang sama dipertahankan di bidang masukan. Karenanya pengguna dapat mengirimkan kembali formulir dengan nilai yang sama.

Yang tidak saya mengerti adalah apa yang sebenarnya terjadi saat Anda menekan tombol kembali di browser. Sepertinya seluruh halaman diambil dari cache tanpa pernah menghubungi server jika ukuran halaman berada dalam batas cache browser. Bagaimana cara memastikan bahwa halaman dimuat dari server terlepas dari pengaturan browser saat Anda menekan tombol kembali di browser?


Jangan simpan nilai yang dihasilkan dalam bentuk HTML. Hasilkan di server.
DAN

Bagaimana kami melakukan ini di AMP (tanpa JS kustom) tanpa kehilangan kemampuan untuk melengkapi otomatis?
Prathamesh Gharat

Jawaban:


82

Browser modern menerapkan sesuatu yang disebut cache back-forward (BFCache). Ketika Anda menekan tombol kembali / maju, halaman yang sebenarnya tidak dimuat ulang (dan skrip tidak pernah dijalankan ulang).

Jika Anda harus melakukan sesuatu jika pengguna menekan tombol kembali / maju - dengarkan BFCache pageshowdan pagehideacara:

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

Lihat detail selengkapnya untuk implementasi Gecko dan WebKit .


Bekerja sempurna untuk saya. Terima kasih!!
Prabin Pebam

Juga dikonfirmasi bekerja. Atur ulang input saya secara manual dan sepertinya berfungsi. Terima kasih!
Andy

87

Cara lain tanpa JavaScript adalah menggunakan <form autocomplete="off">untuk mencegah browser mengisi ulang formulir dengan nilai terakhir.

Lihat juga pertanyaan ini

Menguji ini hanya dengan satu <input type="text"> di dalam formulir, tetapi berfungsi dengan baik di Chrome dan Firefox saat ini, sayangnya tidak di IE10.


1
Ini berfungsi dengan baik, tetapi bagi saya sangat membingungkan mengapa ini menghilangkan nilai input saat melakukan pukulan maju dan mundur. Bagaimana jika Anda ingin mempertahankan fungsionalitas itu, tetapi Anda ingin mencegah pelengkapan otomatis browser yang sebenarnya? Itu yang saya mau. Artikel w3schools bahkan tidak menyebutkan fungsinya yang dibahas di sini.
mikato

Ini berfungsi baik untuk menyetel ulang formulir kembali ke nilai aslinya saat menavigasi riwayat.
Craig Harshbarger

5
Ini juga berfungsi jika diterapkan pada satu elemen. <input type="text" autocomplete="off">
Jakub Kaleta

1
bekerja dengan baik di input, tetapi tidak berfungsi di textarea
Bassem Shahin

28

Saya menemukan posting ini saat mencari cara untuk menghapus seluruh formulir yang terkait dengan BFCache (cache tombol mundur / maju) di Chrome.

Selain dari apa yang diberikan Sim, kasus penggunaan saya mengharuskan detail yang perlu digabungkan dengan Formulir Jelas di Tombol Kembali? .

Saya menemukan bahwa cara terbaik untuk melakukan ini adalah dengan mengizinkan formulir berperilaku seperti yang diharapkan, dan memicu peristiwa:

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

Jika Anda tidak menangani inputkejadian untuk menghasilkan objek dalam JavaScript, atau hal lain dalam hal ini, maka Anda sudah selesai. Namun, jika Anda mendengarkan acara, setidaknya di Chrome Anda perlu memicu changesendiri acara (atau acara apa pun yang ingin Anda tangani, termasuk acara khusus):

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

Yang harus ditambahkan setelah itu resetuntuk berbuat baik apapun.


2
Perhatikan bahwa reset () tidak bekerja untuk bidang input tersembunyi.
Damien

14

Jika Anda perlu kompatibel dengan browser lama, opsi "pageshow" mungkin tidak berfungsi. Kode berikut berhasil untuk saya.

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

7

Inilah yang berhasil bagi saya.

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

Saya awalnya memiliki ini di $(document).readybagian jquery saya, yang juga berfungsi. Namun, saya mendengar bahwa tidak semua browser $(document).readyaktif saat menekan tombol kembali, jadi saya mengeluarkannya. Saya tidak tahu pro dan kontra dari pendekatan ini, tetapi saya telah menguji di beberapa browser dan di beberapa perangkat, dan tidak ada masalah dengan solusi ini yang ditemukan.


Ini sangat membantu saya :)
acmsohail

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.