Saya memiliki beberapa halaman dengan formulir di aplikasi saya.
Bagaimana saya bisa mengamankan formulir sedemikian rupa sehingga jika seseorang menavigasi atau menutup tab browser, mereka harus diminta untuk mengonfirmasi bahwa mereka benar-benar ingin meninggalkan formulir dengan data yang belum disimpan?
javascript
forms
Khan
sumber
sumber
Jawaban:
Pendek, jawaban yang salah:
Anda dapat melakukan ini dengan menangani
beforeunload
acara dan mengembalikan string yang bukan nol :Masalah dengan pendekatan ini adalah bahwa mengirimkan formulir juga memecat acara bongkar . Ini diperbaiki dengan mudah dengan menambahkan tanda yang Anda kirimi formulir:
Kemudian memanggil setter saat mengirimkan:
Tapi baca terus ...
Panjang, jawaban yang benar:
Anda juga tidak ingin menampilkan pesan ini saat pengguna belum mengubah apa pun di formulir Anda . Salah satu solusinya adalah menggunakan
beforeunload
acara tersebut dalam kombinasi dengan flag "kotor", yang hanya memicu prompt jika itu benar-benar relevan.Sekarang untuk mengimplementasikan
isDirty
metode ini, ada berbagai pendekatan.Anda dapat menggunakan jQuery dan membentuk serialisasi , tetapi pendekatan ini memiliki beberapa kekurangan. Pertama, Anda harus mengubah kode agar berfungsi pada formulir apa pun (
$("form").each()
akan dilakukan), tetapi masalah terbesar adalah bahwa jQueryserialize()
hanya akan bekerja pada elemen yang dinamai dan tidak dinonaktifkan, jadi mengubah elemen yang dinonaktifkan atau tidak dinamai tidak akan memicu bendera kotor. Ada solusi untuk itu , seperti membuat kontrol hanya dibaca alih-alih mengaktifkan, membuat serial dan kemudian menonaktifkan kontrol lagi.Jadi, peristiwa tampaknya merupakan jalan yang harus ditempuh. Anda dapat mencoba mendengarkan penekanan tombol . Acara ini memiliki beberapa masalah:
The
change
event juga tidak memicu pada nilai-nilai yang ditetapkan dari kode JavaScript , sehingga juga tidak akan bekerja untuk input virtual.Mengikat
input
acara untuk semuainput
s (dantextarea
s danselect
s) pada halaman Anda tidak akan bekerja pada browser lama dan, seperti semua penanganan solusi acara tersebut di atas, tidak mendukung undo. Ketika pengguna mengubah kotak teks dan kemudian membatalkan itu, atau memeriksa dan menghapus centang kotak centang, formulir itu masih dianggap kotor.Dan ketika Anda ingin menerapkan lebih banyak perilaku, seperti mengabaikan elemen-elemen tertentu, Anda akan memiliki lebih banyak pekerjaan untuk dilakukan.
Jangan menemukan kembali roda:
Jadi sebelum Anda berpikir untuk mengimplementasikan solusi-solusi tersebut dan semua solusi yang diperlukan, sadarilah bahwa Anda sedang menciptakan kembali roda dan Anda cenderung mengalami masalah yang sudah dipecahkan orang lain untuk Anda.
Jika aplikasi Anda sudah menggunakan jQuery, Anda juga dapat menggunakan kode yang teruji dan dirawat alih-alih menggulirkan kode Anda sendiri, dan menggunakan perpustakaan bagian ketiga untuk semua ini. jQuery's Are You Sure? plugin berfungsi dengan baik, lihat halaman demo mereka . Sesederhana ini:
Pesan khusus tidak didukung di mana-mana
Perhatikan bahwa Firefox 4 tidak mendukung pesan khusus dalam dialog ini. Mulai April 2016, Chrome 51 diluncurkan di mana pesan khusus juga dihapus .
Beberapa alternatif ada di tempat lain di situs ini, tetapi saya pikir dialog seperti ini cukup jelas:
sumber
Lihat JavaScript di acara sebelumnya sebelum memuat . Ini adalah JavaScript non-standar yang diperkenalkan oleh Microsoft, namun ini berfungsi di sebagian besar browser dan dokumentasi mereka yang ada sebelumnya memuat lebih banyak informasi dan contoh.
sumber
via jquery
Anda dapat menjalankan fungsi Google JQuery Form Serialize, ini akan mengumpulkan semua input formulir dan menyimpannya dalam array. Saya kira penjelasan ini sudah cukup :)
sumber
Solusi universal tanpa memerlukan konfigurasi yang secara otomatis mendeteksi semua modifikasi input, termasuk elemen yang dapat diedit:
sumber
Dibangun di atas ide bagus Wasim A. untuk menggunakan serialisasi. Masalahnya adalah bahwa peringatan itu juga ditampilkan ketika formulir sedang dikirim. Ini sudah diperbaiki di sini.
Ini telah diuji di Chrome dan IE 11.
sumber
Berdasarkan jawaban sebelumnya, dan dibuat dari berbagai tempat di stack overflow, berikut ini adalah solusi yang saya temukan yang menangani kasus ketika Anda benar-benar ingin mengirimkan perubahan:
Perlu dicatat bahwa IE11 tampaknya mensyaratkan bahwa
closeEditorWarning
fungsi kembaliundefined
untuk tidak menunjukkan peringatan.sumber
QC.thisPage.isDirty = false;
seharusnyawindow.thisPage.isDirty = false;
? Dengan begitu, itu akan memeriksa apakah Anda mengirimkan formulir dan tidak menunjukkan peringatan. Tampaknya bekerja untuk pengujian saya. Juga, sebagian besar formulir memilikiinput
bukantextarea
. Saya menggunakan yang berikut ini yang bekerja dengan cukup baik:$("form").on('keyup', 'textarea,input,select', function () {
Satu kalimat berikut telah bekerja untuk saya.
Hanya disetel
modified
ke true atau false, tergantung pada kondisi aplikasi Anda.sumber
undefined
daripadanull
karena IE akan mencetak 'nol' jikamodified
salah.Kode berikut berfungsi dengan baik. Anda harus mencapai perubahan input elemen formulir melalui atribut id:
sumber
sumber
Anda dapat menggunakan serialize () untuk membuat string teks yang disandikan URL dengan membuat serialisasi nilai formulir dan memeriksa apakah formulir telah berubah sebelumunload
Lihat tautan ini https://coderwall.com/p/gny70a/alert-when-leaving-page-with-unsaved-form Ditulis oleh Vladimir Sidorenko
sumber
serialize()
, dan memang, ada kekurangannya.Menambahkan ke ide @codecaster Anda dapat menambahkan ini ke setiap halaman dengan formulir (dalam kasus saya, saya menggunakannya secara global sehingga hanya pada formulir yang memiliki peringatan ini) ubah fungsinya menjadi
Juga masukkan formulir kirim termasuk login dan di batal tombol tautan sehingga ketika orang menekan membatalkan atau mengirimkan formulir tidak akan memicu peringatan juga di setiap halaman dengan formulir ...
sumber
Anda dapat memeriksa penjelasan terperinci di sini: http://techinvestigations.redexp.in/comparison-of-form-values-on-load-and-before-close/ perbandingan-of-form-values-on-load-and -sebelum tutup
Kode utama:
sumber
Jawaban singkat:
sumber
Solusi oleh Eerik Sven Puudist ...
... secara spontan melakukan pekerjaan untuk saya dalam lingkungan berorientasi objek yang kompleks tanpa perubahan apa pun yang diperlukan.
Satu-satunya perubahan yang saya terapkan adalah merujuk ke formulir konkret (hanya satu formulir per file) yang disebut "formForm" ('form' -> '#formForm'):
Yang dilakukan dengan sangat baik adalah kenyataan bahwa tombol kirim sedang "dibiarkan sendiri".
Selain itu, ini juga berfungsi untuk saya dengan Firefox versi terbaru (per 7 Februari 2019).
sumber
Diuji solusi universal Eli Grey, hanya bekerja setelah saya menyederhanakan kode
Modifikasi miliknya dihapus penggunaan
target[defaultValue]
dan hanya digunakantarget.dataset[defaultValue]
untuk menyimpan nilai default nyata.Dan saya menambahkan pendengar acara 'tersimpan' di mana acara 'disimpan' akan dipicu oleh Anda sendiri pada tindakan tabungan Anda berhasil.
Tapi solusi 'universal' ini hanya berfungsi di browser, tidak bekerja di tampilan web aplikasi, misalnya, browser wechat.
Untuk membuatnya berfungsi di browser wechat (sebagian) juga, perbaikan lagi:
sumber
Saya melakukannya secara berbeda, berbagi di sini sehingga seseorang dapat memperoleh bantuan, hanya diuji dengan Chrome.
Saya ingin memperingatkan pengguna sebelum menutup tab hanya jika ada beberapa perubahan.
Berfungsi dengan baik, tetapi ada masalah lain, ketika saya mengirimkan formulir saya mendapatkan peringatan yang tidak diinginkan, saya melihat banyak solusi di atasnya, ini karena sebelumnya memuat api sebelum serangan itu sebabnya kami tidak bisa menangani dalam acara pengiriman seperti
onbeforeunload = null
, tapi onclick acara tombol kirim menyala sebelum kedua acara ini, jadi saya memperbarui kodesumber
Pertama-tama, sebagian besar browser memiliki fungsi ini secara default. Dan mengapa Anda membutuhkan ini sama sekali? Mengapa tidak menyinkronkan formulir? Maksud saya, simpan pada perubahan apa pun tanpa menunggu pengiriman dari pengguna. Seperti halnya Google Kontak. Tentu saja jika hanya semua bidang yang wajib diisi. Pengguna tidak suka ketika mereka memaksa untuk mengisi sesuatu tanpa kesempatan untuk berpikir apakah mereka membutuhkannya. :)
sumber
save it on any change without waiting any submitting from user
Anda tidak selalu ingin melakukan ini. Terkadang pengguna ingin membuat banyak perubahan dan kemudian meninjau dan mengonfirmasi bahwa mereka ingin menyimpannya.