Saya perlu memperingatkan pengguna tentang perubahan yang belum disimpan sebelum mereka meninggalkan halaman (masalah yang cukup umum).
window.onbeforeunload=handler
Ini berfungsi tetapi ini memunculkan dialog default dengan pesan standar yang menjengkelkan yang membungkus teks saya sendiri. Saya perlu mengganti pesan standar sepenuhnya, jadi teks saya jelas, atau (bahkan lebih baik) mengganti seluruh dialog dengan dialog modal menggunakan jQuery.
Sejauh ini saya telah gagal dan saya belum menemukan orang lain yang tampaknya memiliki jawaban. Apakah itu mungkin?
Javascript di halaman saya:
<script type="text/javascript">
window.onbeforeunload=closeIt;
</script>
Fungsi closeIt ():
function closeIt()
{
if (changes == "true" || files == "true")
{
return "Here you can append a custom message to the default dialog.";
}
}
Menggunakan jQuery dan jqModal Saya telah mencoba hal semacam ini (menggunakan dialog konfirmasi khusus):
$(window).beforeunload(function() {
confirm('new message: ' + this.href + ' !', this.href);
return false;
});
yang juga tidak berfungsi - Sepertinya saya tidak dapat mengikat ke acara beforeunload.
sumber
Jawaban:
Anda tidak dapat mengubah dialog default untuk
onbeforeunload
, jadi taruhan terbaik Anda mungkin bekerja dengannya.Ini referensi untuk ini dari Microsoft:
Masalahnya tampaknya:
onbeforeunload
dipanggil, ia akan mengambil nilai balik dari pawang sebagaiwindow.event.returnValue
.false
diuraikan sebagai string, kotak dialog akan menyala, yang kemudian akan melewatitrue
/false
.Hasilnya, ada tampaknya tidak menjadi cara menugaskan
false
untukonbeforeunload
untuk mencegah dari dialog default.Catatan tambahan pada jQuery:
onbeforeunload
acara lain terjadi juga. Jika Anda hanya ingin acara bongkar terjadi, saya akan tetap berpegang teguh pada JavaScript untuk itu.jQuery tidak memiliki pintasan
onbeforeunload
sehingga Anda harus menggunakanbind
sintaksis generik .Sunting 09/04/2018 : pesan khusus di dialog onbeforeunload sudah tidak digunakan lagi sejak chrome-51 (lih: catatan rilis )
sumber
Apa yang berhasil bagi saya, menggunakan jQuery dan diuji di IE8, Chrome dan Firefox, adalah:
Penting untuk tidak mengembalikan apa pun jika tidak ada prompt yang diperlukan karena ada perbedaan antara IE dan perilaku browser lainnya di sini.
sumber
event.returnValue
adalah satu-satunya metode "yang disetujui" di IE. IE selanjutnya mengatakan "Nilai properti ini lebih diutamakan daripada nilai yang dikembalikan oleh fungsi, seperti melalui pernyataan pengembalian Microsoft JScript." .. akan menyenangkan untuk melihat korelasi yang dijamin antarareturn
(dari acara) danevent.returnValue
..Meskipun tidak ada yang dapat Anda lakukan tentang kotak dalam beberapa keadaan, Anda dapat mencegat seseorang yang mengklik tautan. Bagi saya, ini sepadan dengan usaha untuk sebagian besar skenario dan sebagai mundur, saya telah meninggalkan acara unload.
Saya telah menggunakan Boxy alih-alih Dialog jQuery standar, itu tersedia di sini: http://onehackoranother.com/projects/jquery/boxy/
Anda dapat melampirkan ke acara lain, dan memfilter lebih lanjut tentang jenis jangkar apa yang diklik, tetapi ini berfungsi untuk saya dan apa yang ingin saya lakukan dan berfungsi sebagai contoh bagi orang lain untuk digunakan atau ditingkatkan. Kupikir aku akan membagikan ini untuk mereka yang menginginkan solusi ini.
Saya telah memotong kode, jadi ini mungkin tidak berfungsi sebagaimana mestinya.
sumber
1) Gunakan onbeforeunload, bukan onunload.
2) Yang penting adalah untuk menghindari mengeksekusi pernyataan pengembalian. Maksud saya, dengan ini, untuk menghindari kembali dari pawang Anda. Anda kembali baik-baik saja, tetapi Anda melakukannya dengan memastikan bahwa Anda mencapai akhir fungsi dan JANGAN menjalankan pernyataan kembali. Dalam kondisi ini, dialog standar bawaan tidak terjadi.
3) Anda dapat, jika menggunakan onbeforeunload, menjalankan panggilan ajax di handler unbeforeunload Anda untuk merapikan server, tetapi itu harus yang sinkron, dan Anda harus menunggu dan menangani balasan di handler onbeforeunload Anda (masih menghormati kondisi (2) di atas). Saya melakukan ini dan itu berfungsi dengan baik. Jika Anda melakukan panggilan ajax sinkron, semuanya tertahan hingga respons kembali. Jika Anda melakukan yang tidak sinkron, berpikir bahwa Anda tidak peduli dengan balasan dari server, halaman dibongkar terus dan panggilan ajax Anda dibatalkan oleh proses ini - termasuk skrip jarak jauh jika sedang berjalan.
sumber
Cobalah menempatkan
return;
bukan pesan .. ini berfungsi sebagian besar browser untuk saya. (Ini hanya benar-benar mencegah hadiah dialog)sumber
null
akan membuka dialog dengan teks "null". Namun,return void(0);
tidak akan membuka dialog.Ini tidak dapat dilakukan di chrome sekarang untuk menghindari spam, lihat javascript pada saat sebelum memuat tidak menampilkan pesan khusus untuk detail lebih lanjut.
sumber
Anda dapat mendeteksi tombol mana (ok atau batal) yang ditekan oleh pengguna, karena fungsi onunload dipanggil hanya ketika pengguna memilih meninggalkan halaman. Meskipun dalam fungsi ini kemungkinan terbatas, karena DOM sedang runtuh. Anda dapat menjalankan javascript, tetapi POST ajax tidak melakukan apa-apa karena itu Anda tidak dapat menggunakan metode ini untuk logout otomatis. Tetapi ada solusi untuk itu. Window.open ('logout.php') dijalankan di fungsi onunload, sehingga pengguna akan keluar dengan membuka jendela baru.
Kode ini dipanggil saat pengguna meninggalkan halaman atau menutup jendela aktif dan pengguna keluar dengan 'logout.php'. Jendela baru ditutup segera ketika logout php terdiri dari kode:
sumber
Saya menghadapi masalah yang sama, saya baik-baik saja untuk mendapatkan kotak dialog sendiri dengan pesan saya, tetapi masalah yang saya hadapi adalah: 1) Ia memberi pesan pada semua navigasi yang saya inginkan hanya untuk klik dekat. 2) dengan pesan konfirmasi saya sendiri jika pengguna memilih membatalkannya masih menampilkan kotak dialog default browser.
Berikut ini adalah kode solusi yang saya temukan, yang saya tulis di halaman Master saya.
sumber
lihat dari http://www.codeprojectdownload.com
sumber
Bagaimana dengan menggunakan versi khusus dari perintah "bind" "one". Setelah event handler dieksekusi pertama kali, itu secara otomatis dihapus sebagai event handler.
sumber
.one()
- yang melampirkan pendengar acara untuk mendengarkan acara hanya terjadi sekali: "Lampirkan pawang ke suatu acara untuk elemen. Pawang dijalankan paling banyak sekali per elemen per jenis acara." api.jquery.com/onePendekatan sudut 9:
Dukungan browser dan penghapusan pesan khusus:
sumber