Apakah ada kode JavaScript / jQuery lintas browser untuk mendeteksi jika browser atau tab browser sedang ditutup, tetapi bukan karena tautan diklik?
javascript
jquery
kawan
sumber
sumber
sessionStorage
Properti, itu akan kedaluwarsa begitu browser ditutup. w3schools.com/jsref/prop_win_sessionstorage.aspJawaban:
Jika saya mendapatkan Anda dengan benar, Anda ingin tahu kapan tab / jendela ditutup secara efektif. Nah, AFAIK satu-satunya cara
Javascript
untuk mendeteksi barang semacam itu adalahonunload
&onbeforeunload
acara .Sayangnya (atau untungnya?), Peristiwa-peristiwa itu juga dipecat ketika Anda meninggalkan situs di atas
link
atau tombol kembali browser Anda. Jadi ini adalah jawaban terbaik yang bisa saya berikan, saya pikir Anda tidak bisa mendeteksi asliclose
dalam Javascript. Koreksi saya jika saya salah di sini.sumber
String
nilai pengembalian kustom darionbeforeunload
. Jadi sekarang Anda tidak lagi dapat menampilkan pesan khusus sebelum membongkar.unload
?Dari Dokumentasi Firefox
Untuk beberapa alasan, browser berbasis Webkit tidak mengikuti spesifikasi untuk kotak dialog. Sebuah contoh yang hampir lintas-kerja akan dekat dari contoh di bawah ini.
Contoh ini untuk menangani semua browser.
sumber
Solusi Sederhana
sumber
// Ini berfungsi di IE7, jika Anda menutup tab atau browser dengan hanya satu tab
sumber
window.onunload = "alert('wait')"
danwindow.onbeforeunload = "alert('wait... chrome!')"
menggunakan konsol di Chromium / Ubuntu tetapi tidak dipecat ketika saya menutup tab.window.onunload = "alert('wait')"
dan seperti itu seharusnya tidak bekerja dengan baik. + Msgstr "Fungsi harus menetapkan nilai string ke properti returnValue dari objek Event dan mengembalikan string yang sama". Silakan lihat artikel MDNSaya harus secara otomatis mengeluarkan pengguna ketika browser atau tab ditutup, tetapi tidak ketika pengguna menavigasi ke tautan lain. Saya juga tidak ingin konfirmasi muncul saat itu terjadi. Setelah berjuang dengan ini untuk sementara waktu, terutama dengan IE dan Edge, inilah yang akhirnya saya lakukan (diperiksa bekerja dengan IE 11, Edge, Chrome, dan Firefox) setelah mendasarkan pendekatan dengan jawaban ini .
Pertama, mulai penghitung waktu mundur di server di
beforeunload
pengendali acara di JS. Panggilan ajax harus sinkron agar IE dan Edge dapat berfungsi dengan baik. Anda juga perlu menggunakanreturn;
agar dialog konfirmasi tidak muncul seperti ini:Memulai timer akan membuat
cancelLogout
flag menjadi false . Jika pengguna me-refresh halaman atau menavigasi ke tautan internal lain,cancelLogout
bendera di server disetel ke true . Setelah penghitung waktu berlalu, ia akan memeriksacancelLogout
bendera untuk melihat apakah acara logout telah dibatalkan. Jika timer telah dibatalkan, maka timer akan berhenti. Jika browser atau tab ditutup, makacancelLogout
bendera akan tetap salah dan pengendali acara akan mengeluarkan pengguna.Catatan implementasi: Saya menggunakan ASP.NET MVC 5 dan saya membatalkan logout dalam
Controller.OnActionExecuted()
metode yang diganti .sumber
OnActionExecuted
?Maaf, saya tidak dapat menambahkan komentar ke salah satu jawaban yang ada, tetapi jika Anda ingin menerapkan semacam dialog peringatan, saya hanya ingin menyebutkan bahwa fungsi event handler memiliki argumen - peristiwa. Dalam kasus Anda, Anda dapat memanggil event.preventDefault () untuk melarang meninggalkan halaman secara otomatis, kemudian mengeluarkan dialog Anda sendiri. Saya menganggap ini opsi yang jauh lebih baik daripada menggunakan peringatan jelek dan tidak aman standar (). Saya pribadi mengimplementasikan set kotak dialog saya sendiri berdasarkan objek kendoWindow (Kendo UI dari Telerik, yang hampir sepenuhnya bersumber terbuka, kecuali kendoGrid dan kendoEditor). Anda juga dapat menggunakan kotak dialog dari jQuery UI. Harap dicatat, bahwa hal-hal seperti itu tidak sinkron, dan Anda harus mengikat pawang untuk mengklik acara setiap tombol, tetapi ini semua sangat mudah untuk diterapkan.
Namun, saya setuju bahwa kurangnya acara tutup yang sebenarnya mengerikan: jika Anda, misalnya, ingin mengatur ulang keadaan sesi Anda di back-end hanya pada kasus penutupan sebenarnya, itu masalah.
sumber
Untuk tugas serupa, Anda dapat menggunakan
sessionStorage
untuk menyimpan data secara lokal hingga tab browser ditutup.The
sessionStorage
toko objek data hanya satu sesi (data akan dihapus ketika tab browser ditutup). ( W3Schools )Ini pulpen saya .
sumber
Tidak ada acara, tetapi ada properti
window.closed
yang didukung di semua browser utama pada saat penulisan ini. Jadi jika Anda benar-benar perlu tahu, Anda bisa polling jendela untuk memeriksa properti itu.if(myWindow.closed){do things}
Catatan: Polling apa pun umumnya bukan solusi terbaik. The
window.onbeforeunload
event harus digunakan jika mungkin, satu-satunya peringatan adalah bahwa hal itu juga kebakaran jika Anda beranjak.sumber
sumber
beforeunload
jika ingin menampilkan lansiran. Seperti ini:$(window).on('beforeunload', function(){ alert ('Bye now')});
Cobalah untuk menggunakannya:
sumber
Saya menemukan cara, yang berfungsi pada semua browser saya .
Diuji pada versi berikut: Firefox 57, Internet Explorer 11, Edge 41, salah satu Chrome terbaru (tidak akan menampilkan versi saya)
sumber
Karena belum ada yang menyebutkannya (8+ tahun kemudian): WebSocket bisa menjadi cara lain yang efektif untuk mendeteksi tab yang ditutup. Selama tab terbuka dan menunjuk ke host, klien dapat mempertahankan koneksi WebSocket aktif ke host.
Peringatan: Harap dicatat bahwa solusi ini benar-benar hanya layak untuk proyek jika WebSocket tidak memerlukan overhead signifikan tambahan dari apa yang sudah Anda lakukan.
Dalam periode waktu habis yang masuk akal (misalnya 2 menit), sisi server dapat menentukan bahwa klien telah pergi setelah WebSocket telah terputus dan melakukan tindakan apa pun yang diinginkan seperti menghapus file temp yang diunggah. (Dalam kasus penggunaan khusus saya, tujuan saya adalah untuk mengakhiri server aplikasi localhost tiga detik setelah koneksi WebSocket turun dan semua aktivitas CGI / FastCGI berakhir - koneksi tetap-hidup lainnya tidak mempengaruhi saya.)
Saya mempunyai masalah dalam menjalankan pengendali event onunload untuk bekerja dengan benar dengan suar (seperti yang direkomendasikan oleh jawaban ini ). Menutup tab tampaknya tidak memicu suar dan tab yang terbuka memicunya dengan cara yang berpotensi menyebabkan masalah. WebSocket memecahkan masalah yang saya temui dengan lebih bersih karena koneksi menutup kira-kira pada waktu yang sama ketika tab menutup dan berpindah halaman dalam aplikasi hanya membuka koneksi WebSocket baru dengan baik dalam jendela tunda.
sumber
JSFiddle Link
Hai semua, saya dapat mencapai klik 'Deteksi Browser dan Tab Tutup Acara' dengan menggunakan penyimpanan lokal dan stempel waktu. Semoga Anda semua bisa menyelesaikan masalah Anda dengan menggunakan solusi ini.
Setelah penelitian awal saya menemukan bahwa ketika kami menutup browser, browser akan menutup semua tab satu per satu untuk sepenuhnya menutup browser. Oleh karena itu, saya mengamati bahwa akan ada sedikit waktu tunda antara menutup tab. Jadi saya mengambil waktu tunda ini sebagai titik validasi utama saya dan dapat mencapai deteksi acara browser dan tab close.
Saya mengujinya di Chrome Browser Versi 76.0.3809.132 dan ternyata berfungsi
:) Pilih jika Anda menemukan jawaban saya membantu ....
sumber
sumber
here also can be string, that will be shown to the user
itu tidak, di firefox, itu di chrome namun ...Dimungkinkan untuk memeriksanya dengan bantuan window.closed di event handler pada acara 'unload' seperti ini, tetapi penggunaan timeout diperlukan (jadi hasilnya tidak dapat dijamin jika ada penundaan atau mencegah penutupan jendela):
Contoh JSFiddle (Diuji pada lates Safari, FF, Chrome, Edge dan IE11)
sumber
Saya telah mencoba semua solusi di atas, tidak ada satupun yang benar-benar bekerja untuk saya, khususnya karena ada beberapa komponen Telerik dalam proyek saya yang memiliki tombol 'Tutup' untuk jendela sembulan, dan ia menyebut acara 'sebelumuntuk memuat'. Juga, tombol pemilih tidak berfungsi dengan baik ketika Anda memiliki kisi-kisi Telerik di halaman Anda (maksud saya tombol di dalam kisi) Jadi, saya tidak dapat menggunakan saran di atas. Akhirnya ini solusinya bekerja untuk saya. Saya telah menambahkan acara onUnload di tag tubuh _Layout.cshtml. Sesuatu seperti ini:
dan kemudian menambahkan fungsi LogOff untuk mengalihkan ke Akun / LogOff yang merupakan metode bawaan di Asp.Net MVC. Sekarang, ketika saya menutup browser atau tab, itu mengarahkan ulang ke metode LogOff dan pengguna harus masuk ketika kembali. Saya sudah mengujinya di Chrome & Firefox. Dan itu berhasil!
sumber
Fungsi ini menampilkan kotak dialog konfirmasi jika Anda menutup jendela atau me-refresh halaman selama proses apa pun di browser. Fungsi ini berfungsi di semua browser. Anda harus mengatur isProcess var dalam proses ajax Anda.
sumber
sumber
sendkeylog
?Seperti yang disebutkan @jAndy, tidak ada kode javascript yang tepat untuk mendeteksi jendela yang ditutup. Saya mulai dari apa yang @Syno usulkan.
Saya telah melewati situasi seperti itu dan asalkan Anda mengikuti langkah-langkah ini, Anda akan dapat mendeteksinya.
Saya mengujinya di Chrome 67+ dan Firefox 61+.
};
sumber
resize
ketika jendela buram. Jika 100x kabur maka Anda akan memiliki 100 pendengar, yang akhirnya akan memperlambat browser.coba ini, saya yakin ini akan berhasil untuk Anda.
sumber
Coba ini. Itu akan berhasil. Metode pembongkaran jquery sudah tidak digunakan lagi.
sumber