Pendek, jawaban yang salah:
Anda dapat melakukan ini dengan menangani beforeunload
acara dan mengembalikan string yang bukan nol :
window.addEventListener("beforeunload", function (e) {
var confirmationMessage = 'It looks like you have been editing something. '
+ 'If you leave before saving, your changes will be lost.';
(e || window.event).returnValue = confirmationMessage; //Gecko + IE
return confirmationMessage; //Gecko + Webkit, Safari, Chrome etc.
});
Masalah dengan pendekatan ini adalah bahwa mengirimkan formulir juga memecat acara bongkar . Ini diperbaiki dengan mudah dengan menambahkan tanda yang Anda kirimi formulir:
var formSubmitting = false;
var setFormSubmitting = function() { formSubmitting = true; };
window.onload = function() {
window.addEventListener("beforeunload", function (e) {
if (formSubmitting) {
return undefined;
}
var confirmationMessage = 'It looks like you have been editing something. '
+ 'If you leave before saving, your changes will be lost.';
(e || window.event).returnValue = confirmationMessage; //Gecko + IE
return confirmationMessage; //Gecko + Webkit, Safari, Chrome etc.
});
};
Kemudian memanggil setter saat mengirimkan:
<form method="post" onsubmit="setFormSubmitting()">
<input type="submit" />
</form>
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.
var isDirty = function() { return false; }
window.onload = function() {
window.addEventListener("beforeunload", function (e) {
if (formSubmitting || !isDirty()) {
return undefined;
}
var confirmationMessage = 'It looks like you have been editing something. '
+ 'If you leave before saving, your changes will be lost.';
(e || window.event).returnValue = confirmationMessage; //Gecko + IE
return confirmationMessage; //Gecko + Webkit, Safari, Chrome etc.
});
};
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 jQuery serialize()
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:
- Tidak akan memicu pada kotak centang, tombol radio, atau elemen lain yang sedang diubah melalui input mouse.
- Akan memicu penekanan tombol yang tidak relevan seperti Ctrlkuncinya.
- Tidak akan memicu nilai yang ditetapkan melalui kode JavaScript.
- Tidak akan memicu memotong atau menempelkan teks melalui menu konteks.
- Tidak akan bekerja untuk input virtual seperti datepickers atau kotak centang / pemancar radiobutton yang menyimpan nilai mereka dalam input tersembunyi melalui JavaScript.
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 semua input
s (dan textarea
s dan select
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:
<script src="jquery.are-you-sure.js"></script>
<script>
$(function() {
$('#myForm').areYouSure(
{
message: 'It looks like you have been editing something. '
+ 'If you leave before saving, your changes will be lost.'
}
);
});
</script>
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:
Apakah Anda ingin meninggalkan situs ini?
Perubahan yang Anda buat mungkin tidak disimpan.
Leave Stay