Saya memiliki persyaratan untuk mengimplementasikan prompt "Perubahan yang Tidak Tersimpan" dalam aplikasi ASP .Net. Jika pengguna mengubah kontrol di formulir web, dan mencoba keluar sebelum menyimpan, perintah akan muncul untuk memperingatkan mereka bahwa mereka memiliki perubahan yang belum disimpan, dan memberi mereka opsi untuk membatalkan dan tetap di halaman saat ini. Perintah seharusnya tidak ditampilkan jika pengguna belum menyentuh kontrol apa pun.
Idealnya saya ingin menerapkan ini dalam JavaScript, tetapi sebelum saya mulai menjalankan kode saya sendiri, apakah ada kerangka kerja yang ada atau pola desain yang disarankan untuk mencapai ini? Idealnya, saya menginginkan sesuatu yang dapat dengan mudah digunakan kembali di beberapa halaman dengan sedikit perubahan.
sumber
Jawaban:
Menggunakan jQuery:
Gabungkan dengan
onunload
/onbeforeunload
metode sesuai kebutuhan.Dari komentar, berikut ini referensi semua bidang masukan, tanpa kode duplikat:
Menggunakan
$(":input")
mengacu pada semua elemen input, textarea, pilih, dan tombol.sumber
change
untuk input teks memicu saat meninggalkan / kehilangan fokus, sedangkaninput
memicu untuk setiap penekanan tombol. (Saya biasanya menggunakannya bersamachange
dengan JQueryone()
, untuk mencegah banyak peristiwa.)Salah satu bagian dari teka-teki:
Dan lainnya :
Selesaikan semuanya, dan apa yang Anda dapatkan?
Anda mungkin juga ingin mengubah registrasi
beforeunload
event handler untuk menggunakanLIBRARY_OF_CHOICE
registrasi event.sumber
onclick="window.onbeforeunload=null"
)Di halaman .aspx, Anda memerlukan fungsi Javascript untuk mengetahui apakah info formulir "kotor" atau tidak
dan di codebehind, tambahkan pemicu ke kolom input serta setel ulang pada tombol pengiriman / batal ....
sumber
Yang berikut ini menggunakan fungsi onbeforeunload browser dan jquery untuk merekam kejadian onchange. TI juga mencari tombol kirim atau setel ulang untuk menyetel ulang bendera yang menunjukkan perubahan telah terjadi.
sumber
Terima kasih atas balasannya semuanya. Saya akhirnya menerapkan solusi menggunakan JQuery dan plug-in Protect-Data . Ini memungkinkan saya untuk secara otomatis menerapkan pemantauan ke semua kontrol di halaman.
Namun ada beberapa peringatan, terutama saat berurusan dengan aplikasi ASP .Net:
Saat pengguna memilih opsi batal, fungsi doPostBack akan memunculkan kesalahan JavaScript. Saya harus secara manual melakukan coba-tangkap di sekitar panggilan .submit dalam doPostBack untuk menekannya.
Di beberapa halaman, pengguna dapat melakukan tindakan yang melakukan postback ke halaman yang sama, tetapi bukan penyimpanan. Hal ini menyebabkan logika JavaScript disetel ulang, jadi menurutnya tidak ada yang berubah setelah postback ketika ada sesuatu yang berubah. Saya harus menerapkan kotak teks tersembunyi yang diposting kembali dengan halaman, dan digunakan untuk menyimpan nilai boolean sederhana yang menunjukkan apakah datanya kotor. Ini akan tetap ada di seluruh pos balik.
Anda mungkin ingin beberapa postback pada halaman tidak memicu dialog, seperti tombol Simpan. Dalam kasus ini, Anda dapat menggunakan JQuery untuk menambahkan fungsi OnClick yang menyetel window.onbeforeunload ke null.
Semoga ini bermanfaat bagi siapa saja yang harus menerapkan sesuatu yang serupa.
sumber
Solusi Umum Mendukung berbagai bentuk di halaman tertentu ( Cukup salin dan tempel di proyek Anda )
Catatan: Solusi ini digabungkan dari solusi lain untuk membuat solusi terintegrasi umum.
Fitur:
sumber
_isDirty
variabel seperti yang dijelaskan oleh Aaron Powell. Saya tidak melihat kebutuhan untuk menambahkan dan menghapus kelas dari HTML daripada variabel di javascript.Solusi berikut berfungsi untuk prototipe (diuji di FF, IE 6 dan Safari). Ini menggunakan pengamat bentuk umum (yang mengaktifkan formulir: diubah ketika ada bidang formulir telah dimodifikasi), yang dapat Anda gunakan untuk hal lain juga.
sumber
Berikut solusi javascript / jquery yang sederhana. Ini menyumbang "undos" oleh pengguna, itu dikemas dalam fungsi untuk kemudahan aplikasi, dan tidak salah kirim saat dikirim. Panggil saja fungsinya dan berikan ID formulir Anda.
Fungsi ini membuat serial formulir sekali saat halaman dimuat, dan sekali lagi sebelum pengguna meninggalkan halaman. Jika dua status formulir berbeda, prompt ditampilkan.
Cobalah: http://jsfiddle.net/skibulk/Ydt7Y/
sumber
Saya baru-baru ini berkontribusi pada plugin jQuery open source yang disebut dirtyForms .
Plugin ini dirancang untuk bekerja dengan HTML yang ditambahkan secara dinamis, mendukung berbagai bentuk, dapat mendukung hampir semua kerangka dialog, kembali ke browser sebelum membuka dialog, memiliki kerangka kerja pembantu yang dapat dicolok untuk mendukung mendapatkan status kotor dari editor khusus (termasuk plugin tinyMCE) , berfungsi dalam iFrames, dan status kotor dapat disetel atau disetel ulang sesuka hati.
https://github.com/snikch/jquery.dirtyforms
sumber
Mendeteksi perubahan bentuk dengan menggunakan jQuery sangat sederhana:
sumber
Saya memperluas saran Slace di atas, untuk menyertakan sebagian besar elemen yang dapat diedit dan juga mengecualikan elemen tertentu (dengan gaya CSS yang disebut "srSearch" di sini) dari penyetelan tanda kotor.
sumber
window.onbeforeunload = unloadPage;
sumber
Inilah tepatnya plugin Fleegix.js
fleegix.form.diff
(http://js.fleegix.org/plugins/form/diff ) dibuat untuk. Serialisasi keadaan awal formulir saat dimuat menggunakanfleegix.form.toObject
(http://js.fleegix.org/ref#fleegix.form.toObject ) dan simpan dalam variabel, lalu bandingkan dengan status saat ini menggunakanfleegix.form.diff
saat membongkar. Semudah pie.sumber
Salah satu metode , menggunakan array untuk menampung variabel sehingga perubahan dapat dilacak.
Berikut adalah metode yang sangat sederhana untuk mendeteksi perubahan , tetapi yang lainnya tidak begitu elegan.
Metode lain yang cukup sederhana dan kecil, dari Farfetched Blog :
sumber
Dalam dokumen IE. Sudah tidak akan berfungsi dengan baik itu akan memperbarui nilai input.
jadi kita perlu mengikat event load di dalam fungsi document.ready yang akan menangani browser IE juga.
di bawah ini adalah kode yang harus Anda masukkan ke dalam fungsi document.ready.
sumber