Jalankan kode JavaScript pada penutupan jendela atau penyegaran halaman?

110

Apakah ada cara untuk menjalankan kode JavaScript akhir saat pengguna menutup jendela browser atau menyegarkan halaman?

Saya sedang memikirkan sesuatu yang mirip dengan onload tetapi lebih seperti onclose? Terima kasih.

Saya tidak suka metode onbeforeunload, yang selalu menghasilkan kotak konfirmasi yang muncul (tinggalkan halaman / tetap di mozilla) atau (muat ulang / jangan muat ulang di chrome). Apakah ada cara untuk mengeksekusi kode secara diam-diam?

Peter
sumber
1
Kemungkinan duplikat: stackoverflow.com/questions/805463/…
1,44mb
18
Tunggu- ini sebenarnya BUKAN duplikat ... Dia ingin tahu cara mengeksekusi sesuatu TANPA meminta pengguna- pertanyaan terkait menanyakan sebaliknya ...
Phildo

Jawaban:

86

Ada window.onbeforeunloaddan window.onunload, yang digunakan secara berbeda tergantung pada browser. Anda dapat menentukannya baik dengan mengatur properti jendela ke fungsi, atau menggunakan .addEventListener:

window.onbeforeunload = function(){
   // Do something
}
// OR
window.addEventListener("beforeunload", function(e){
   // Do something
}, false);

Biasanya, onbeforeunloaddigunakan jika Anda perlu menghentikan pengguna meninggalkan halaman (mis. Pengguna sedang mengerjakan beberapa data yang belum disimpan, jadi dia harus menyimpan sebelum keluar). onunloadtidak didukung oleh Opera , sejauh yang saya tahu, tetapi Anda selalu dapat mengatur keduanya.

JCOC611
sumber
Ini berhasil untuk saya: Firefox (69.0.2) dan Chrome (77.0.3865.90)
FelipeCaparelli
51

Oke, saya menemukan solusi yang berfungsi untuk ini, itu terdiri dari menggunakan beforeunloadacara dan kemudian membuat pawang kembali null. Ini mengeksekusi kode yang diinginkan tanpa kotak konfirmasi yang muncul. Ini berjalan seperti ini:

window.onbeforeunload = closingCode;
function closingCode(){
   // do something...
   return null;
}

Semoga ini membantu.

Peter
sumber
10
Bukankah ini juga diaktifkan saat menavigasi keluar dan saat menyegarkan (F5)? Jika demikian, itu tidak benar-benar menjawab pertanyaan ...
Jago
1
Tidak diuji, tapi saya pikir return false;melakukan hal yang sama (yaitu mencegah perilaku default) dan itu lebih benar secara semantik.
collimarco
1
return false akan tetap memunculkan kotak dialog yang menanyakan apakah Anda ingin meninggalkan halaman atau tidak. Saya mengujinya di jangkar. Dengan return null dialog tidak muncul tetapi masih muncul di console.log
Ricky Stam
20

Terkadang Anda mungkin ingin memberi tahu server bahwa pengguna meninggalkan halaman. Ini berguna, misalnya, untuk membersihkan gambar yang belum disimpan yang disimpan sementara di server, untuk menandai pengguna itu sebagai "luring", atau untuk masuk saat mereka selesai sesinya.

Secara historis, Anda akan mengirim permintaan AJAX dalam beforeunloadfungsi tersebut, namun ini memiliki dua masalah. Jika Anda mengirim permintaan asinkron, tidak ada jaminan bahwa permintaan tersebut akan dijalankan dengan benar. Jika Anda mengirim permintaan sinkron, itu lebih dapat diandalkan, tetapi browser akan berhenti hingga permintaan selesai. Jika ini adalah permintaan yang lambat, ini akan menjadi ketidaknyamanan yang sangat besar bagi pengguna.

Untungnya, sekarang kami punya navigator.sendBeacon(). Dengan menggunakan sendBeacon()metode ini, data ditransmisikan secara asinkron ke server web saat Agen Pengguna memiliki kesempatan untuk melakukannya, tanpa menunda pembongkaran atau memengaruhi kinerja navigasi berikutnya. Ini menyelesaikan semua masalah dengan pengiriman data analitik: data dikirim dengan andal, dikirim secara asinkron, dan tidak memengaruhi pemuatan halaman berikutnya. Berikut contoh penggunaannya:

window.addEventListener("unload", logData, false);

function logData() {
  navigator.sendBeacon("/log.php", analyticsData);
}

sendBeacon()adalah didukung di:

  • Tepi 14
  • Firefox 31
  • Chrome 39
  • Safari 11.1
  • Opera 26
  • iOS Safari 11.4

Saat ini TIDAK didukung di:

  • Internet Explorer
  • Opera Mini

Berikut ini polyfill untuk sendBeacon () jika Anda perlu menambahkan dukungan untuk browser yang tidak didukung. Jika metode ini tidak tersedia di browser, itu akan mengirim permintaan AJAX sinkron sebagai gantinya.

Mike
sumber
Pertanyaan ini berada dalam lingkup kasus "Mengirim permintaan ke server". Idenya adalah untuk dapat mengawasi tab yang terbuka per pengguna dan membersihkan backend saat tab ditutup.
Peter
@Peter Saya memasukkannya untuk kelengkapan, tetapi saya menghapusnya.
Mike
@Mike, tolong, JANGAN hapus jawaban Anda. Ini tidak hanya menyelesaikan jawaban terbaik yang dipilih (itu harus menjadi milik Anda) tetapi juga menyajikan acara yang digunakan untuk menangkap atau menutup jendela
Alex8752
@ Alex8752 Saya tidak menghapus jawaban saya, saya mengedit sebagian darinya yang tidak relevan dengan pertanyaan, yang dapat Anda lihat di sini .
Mike
1
@AshokKumar Anda mengontrol apa yang Anda kirim ke server. Jika Anda ingin mengirim sesuatu dengan GET, tidak ada yang mencegah Anda mengirimkan permintaan Anda ke sesuatu seperti http://example.com/script.php?token=something&var1=val1&var2=val2memasukkan nilai-nilai itu ke dalam GET.
Mike
14

versi jQuery:

$(window).unload(function(){
    // Do Something
});

Perbarui : jQuery 3:

$(window).on("unload", function(e) {
    // Do Something
});

Terima kasih Garrett

Paras
sumber
8

Dokumentasi di sini mendorong mendengarkan event onbeforeunload dan / atau menambahkan event listener di window.

window.addEventListener('beforeunload', function(event) {
  //do something here
}, false);

Anda juga dapat mengisi properti jendela .onunload atau .onbeforeunload dengan fungsi atau referensi fungsi.

Meskipun perilaku tidak distandarisasi di seluruh browser, fungsi tersebut dapat mengembalikan nilai yang akan ditampilkan browser saat mengonfirmasi apakah akan meninggalkan halaman.

davejoem
sumber
7

Anda bisa menggunakan window.onbeforeunload.

window.onbeforeunload = confirmExit;
function confirmExit(){
    alert("confirm exit is being called");
    return false;
}
Gurpreet Singh
sumber
3

Acara tersebut dipanggil beforeunload, sehingga Anda dapat menetapkan fungsi ke window.onbeforeunload.

Phssthpok.dll
sumber
-2

Anda dapat mencoba sesuatu seperti ini:

<SCRIPT language="JavaScript">
<!--
function loadOut()
{
window.location="http://www.google.com";
}
//-->
</SCRIPT>

<body onBeforeUnload="loadOut()">
Dane Balia
sumber
23
Berhati-hatilah, orang-orang membaca ini di zaman kuno - ini adalah JS dan HTML kuno dan saran lain di sini jauh lebih baik.
RAnders00