The beforeunload
event kebakaran setiap kali pengguna meninggalkan halaman Anda untuk alasan apapun.
Misalnya, itu akan dipecat jika pengguna mengirimkan formulir, mengklik tautan, menutup jendela (atau tab), atau pergi ke halaman baru menggunakan bilah alamat, kotak pencarian, atau bookmark.
Anda bisa mengecualikan pengiriman formulir dan hyperlink (kecuali dari frame lain) dengan kode berikut:
var inFormOrLink;
$('a').on('click', function() { inFormOrLink = true; });
$('form').on('submit', function() { inFormOrLink = true; });
$(window).on("beforeunload", function() {
return inFormOrLink ? "Do you really want to close?" : null;
})
Untuk versi jQuery yang lebih tua dari 1,7, coba ini:
var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });
$(window).bind("beforeunload", function() {
return inFormOrLink ? "Do you really want to close?" : null;
})
The live
Metode tidak bekerja dengan submit
acara, jadi jika Anda menambahkan bentuk baru, Anda akan perlu untuk mengikat pawang untuk itu juga.
Perhatikan bahwa jika pengendali acara yang berbeda membatalkan pengiriman atau navigasi, Anda akan kehilangan konfirmasi jika jendela benar-benar ditutup nanti. Anda dapat memperbaikinya dengan merekam waktu di submit
dan click
acara, dan memeriksa jika itu beforeunload
terjadi lebih dari beberapa detik kemudian.
Ctrl + r
,F5
,Ctrl + Shift + r
dan mengubah URL peramban?.on()
.Mungkin cukup lepaskan ikatan
beforeunload
penangan acara di dalam penangan acara formulirsubmit
:sumber
onsubmit=...
di setiap formulir. (Saya punya banyak formulir per halaman, di webapp tertentu)Untuk solusi lintas-browser (diuji di Chrome 21, IE9, FF15), pertimbangkan untuk menggunakan kode berikut, yang merupakan versi kode Slaks yang sedikit dimodifikasi:
Perhatikan bahwa sejak Firefox 4, pesan "Apakah Anda benar-benar ingin menutup?" tidak ditampilkan. FF hanya menampilkan pesan umum. Lihat catatan di https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload
sumber
live
danbind
pernyataan untukon
, yang bekerja besar dengan tingkat terbaru dari jQuery. Terima kasih!sumber
Untuk solusi yang bekerja dengan baik dengan kontrol pihak ketiga seperti Telerik (mis .: RadComboBox) dan DevExpress yang menggunakan tag Anchor karena berbagai alasan, pertimbangkan untuk menggunakan kode berikut, yang merupakan versi sedikit dimodifikasi dari kode desm dengan pemilih yang lebih baik untuk diri sendiri menargetkan tag jangkar:
sumber
Jawaban saya ditujukan untuk memberikan tolok ukur sederhana.
BAGAIMANA CARA
Lihat jawaban @SLaks .
Berapa lama browser akhirnya menutup halaman Anda?
Setiap kali pengguna menutup halaman ( xtombol atau CTRL+ W), browser mengeksekusi
beforeunload
kode yang diberikan , tetapi tidak tanpa batas waktu. Satu-satunya pengecualian adalah kotak konfirmasi (return 'Do you really want to close?
) yang akan menunggu hingga respons pengguna.Chrome : 2 detik.
Firefox : ∞ (atau klik dua kali, atau paksa tutup)
Tepi : ∞ (atau klik dua kali)
Explorer 11 : 0 detik.
Safari : TODO
Apa yang kami gunakan untuk menguji ini:
Apa yang dilakukannya adalah mengirim sebanyak mungkin permintaan sebelum browser mematikan halamannya (secara serempak).
Output Chrome:
sumber
Saya menggunakan jawaban Slaks tetapi itu tidak berfungsi sebagaimana mestinya, karena returnValue onbeforeunload diuraikan sebagai string dan kemudian ditampilkan di kotak konfirmasi browser. Jadi nilai true ditampilkan, seperti "true".
Hanya menggunakan pengembalian bekerja. Ini kode saya
sumber
Mungkin Anda bisa menangani OnSubmit dan menetapkan bendera yang nanti Anda periksa di handler OnBeforeUnload Anda.
sumber
sumber
Sayangnya, apakah itu memuat ulang, pengalihan halaman baru, atau browser menutup acara akan dipicu. Alternatifnya adalah menangkap id yang memicu acara dan jika itu bentuk, jangan memicu fungsi apa pun dan jika itu bukan id dari formulir tersebut, lakukan apa yang ingin Anda lakukan ketika halaman ditutup. Saya tidak yakin apakah itu juga mungkin secara langsung dan membosankan.
Anda dapat melakukan beberapa hal kecil sebelum pelanggan menutup tab. javascript mendeteksi peramban tutup tab / peramban tutup tetapi jika daftar tindakan Anda besar dan tab ditutup sebelum selesai, Anda tidak berdaya. Anda dapat mencobanya tetapi dengan pengalaman saya, jangan bergantung padanya.
https://developer.mozilla.org/en-US/docs/Web/Reference/Events/beforeunload?redirectlocale=en-US&redirectslug=DOM/Mozilla_event_reference/beforeunload
sumber
Jika pengiriman formulir Anda membawa mereka ke halaman lain (seperti yang saya asumsikan demikian, maka memicu
beforeunload
), Anda bisa mencoba mengubah pengiriman formulir Anda ke panggilan ajax. Dengan cara ini, mereka tidak akan meninggalkan halaman Anda ketika mereka mengirimkan formulir dan Anda dapat menggunakanbeforeunload
kode mengikat Anda seperti yang Anda inginkan.sumber
Masalah Saya: Acara 'onbeforeunload' hanya akan dipicu jika ada jumlah ganjil pengiriman (klik). Saya memiliki kombinasi solusi dari utas serupa di SO agar solusi saya berfungsi. baik kode saya akan berbicara.
sumber
Pada jQuery 1.7, metode .live () sudah tidak digunakan lagi. Gunakan .on () untuk melampirkan penangan acara. Pengguna versi jQuery yang lebih lama harus menggunakan .delegate () untuk preferensi .live ()
pada lengkap atau tautan
sumber
Coba ini juga
sumber
Cukup verifikasi ...
sumber
sumber
Mengikuti bekerja untuk saya;
sumber
event.clientY
negatif jika Anda mengklik tombol tutup browser atau tombol tutup tab. Namun, nilai ini positif ketika Anda memuat ulang halaman menggunakan pintasan keyboard (F5, Ctrl-R) atau menutup browser menggunakan pintasan keyboard (mis. Alt-F4). Dengan demikian, Anda tidak dapat mengandalkan posisi acara untuk membedakan acara tutup browser dari acara memuat ulang halaman.