JavaScript kodu pencere kapatıldığında veya sayfa yenilendiğinde çalıştırılsın mı?


110

Bir kullanıcı bir tarayıcı penceresini kapattığında veya sayfayı yenilediğinde son bir JavaScript kodunu çalıştırmanın bir yolu var mı?

Onload'a benzer bir şey düşünüyorum ama daha çok onclose gibi mi? Teşekkürler.

Onbeforeunload yöntemini sevmiyorum, bu her zaman bir onay kutusu açılır (sayfadan ayrıl / mozilla'da kal) veya (chrome'da yeniden yükle / yeniden yükleme). Kodu sessizce çalıştırmanın bir yolu var mı?




18
Bekle - bu aslında bir kopya DEĞİLDİR ... Kullanıcıya bir istem OLMADAN bir şeyin nasıl yürütüleceğini bilmek istiyor - bağlantılı sorular tam tersini soruyor ...
Phildo

Yanıtlar:


86

Tarayıcıya bağlı olarak farklı şekilde kullanılan hem window.onbeforeunloadve vardır window.onunload. Pencere özelliklerini işlevlere ayarlayarak veya aşağıdakileri kullanarak bunları değerlendirebilirsiniz .addEventListener:

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

Genellikle, onbeforeunloadkullanıcının sayfadan çıkmasını durdurmanız gerektiğinde kullanılır (örneğin, kullanıcı kaydedilmemiş bazı veriler üzerinde çalışıyor, bu nedenle ayrılmadan önce kaydetmesi gerekir). bildiğim kadarıyla Operaonunload tarafından desteklenmiyor , ancak her zaman ikisini de ayarlayabilirsiniz.


Bu benim için çalıştı: Firefox (69.0.2) ve Chrome (77.0.3865.90)
FelipeCaparelli

51

Tamam, bunun için çalışan bir çözüm buldum, beforeunloadolayı kullanmaktan ve ardından işleyiciyi geri döndürmekten ibaret null. Bu, istenen kodu bir onay kutusu belirmeden yürütür. Şöyle bir şey oluyor:

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

Bu yardımcı olur umarım.


10
Bu, dışarı çıkarken ve tazelerken de (F5) ateşlenmiyor mu? Eğer öyleyse, soruyu gerçekten ele almıyor ...
Jago

1
Test edilmedi, ama bence return false;aynısını yapıyor (yani varsayılan davranışı engelliyor) ve anlamsal olarak daha doğru.
collimarco

1
dönüş yanlış, yine de sayfadan ayrılmak isteyip istemediğinizi soran iletişim kutusunu açacaktır. Bir çapa üzerinde test ettim. Return null ile iletişim kutusu açılmadı ama yine de console.log'u kullanıyordu
Ricky Stam

21

Bazen sunucuya, kullanıcının sayfadan ayrıldığını bildirmek isteyebilirsiniz. Bu, örneğin sunucuda geçici olarak depolanan kaydedilmemiş görüntüleri temizlemek, bu kullanıcıyı "çevrimdışı" olarak işaretlemek veya oturumlarını tamamladıklarında oturum açmak için kullanışlıdır.

Geçmişte, beforeunloadişlevde bir AJAX isteği gönderirdiniz , ancak bunun iki sorunu vardır. Eşzamansız bir istek gönderirseniz, isteğin doğru şekilde yürütüleceğine dair bir garanti yoktur. Eşzamanlı bir istek gönderirseniz, bu daha güvenilirdir, ancak tarayıcı istek tamamlanana kadar askıda kalır. Bu yavaş bir istekse, bu kullanıcı için büyük bir rahatsızlık olacaktır.

Şans eseri, şimdi sahibiz navigator.sendBeacon(). sendBeacon()Yöntemin kullanılmasıyla, Kullanıcı Aracısının bunu yapma fırsatı olduğunda, yüklemeyi geciktirmeden veya sonraki gezinmenin performansını etkilemeden veriler web sunucusuna eşzamansız olarak iletilir. Bu, analitik verilerinin gönderilmesiyle ilgili tüm sorunları çözer: veriler güvenilir bir şekilde gönderilir, eşzamansız olarak gönderilir ve sonraki sayfanın yüklenmesini etkilemez. İşte kullanımına bir örnek:

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

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

sendBeacon()şurada desteklenmektedir :

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

Şu anda şuralarda desteklenmemektedir:

  • Internet Explorer
  • Opera Mini

Desteklenmeyen tarayıcılar için destek eklemeniz gerekmesi durumunda sendBeacon () için bir polyfill burada . Yöntem tarayıcıda mevcut değilse, bunun yerine senkronize bir AJAX isteği gönderecektir.


Bu soru "Sunucuya istek göndermek için" davası kapsamındaydı. Buradaki fikir, her kullanıcı için açık sekmelerde sekmeler tutabilmekti ve bir sekme kapatıldığında arka uçta temizleyebilmekti.
Peter

@Peter Bütünlük için ekledim, ama sildim.
Mike

@Mike, lütfen cevabınızı SİLMEYİN. Sadece seçilen en iyi cevabı tamamlamakla kalmaz (sizin olmalı), aynı zamanda pencereden çıkış veya kapanışı yakalamak için kullanılan etkinliği de sunar
Alex8752

@ Alex8752 Cevabımı silmedim, burada görüntüleyebileceğiniz soru ile ilgisi olmayan bir kısmını düzenledim .
Mike

1
@AshokKumar Sunucuya ne göndereceğinizin kontrolü sizdedir. GET ile bir şeyler göndermek istiyorsanız, isteğinizi http://example.com/script.php?token=something&var1=val1&var2=val2bu değerleri GET'e koymak gibi bir şeye göndermenizi engelleyen hiçbir şey yoktur .
Mike

14

jQuery sürümü:

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

Güncelleme : jQuery 3:

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

Teşekkürler Garrett


8

Buradaki belgeler onbeforeunload olayını dinlemeyi ve / veya pencereye bir olay dinleyicisi eklemeyi teşvik eder.

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

Ayrıca, pencerenin .onunload veya .onbeforeunload özelliklerini bir işlev veya işlev referansı ile doldurabilirsiniz.

Davranış tarayıcılar arasında standartlaştırılmamış olsa da işlev, tarayıcının sayfadan ayrılıp ayrılmayacağını onaylarken görüntüleyeceği bir değer döndürebilir.


7

Kullanabilirsiniz window.onbeforeunload.

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

3

Olay çağrılır beforeunload, böylece bir işlev atayabilirsiniz window.onbeforeunload.


-2

Bunun gibi bir şey deneyebilirsiniz:

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

<body onBeforeUnload="loadOut()">

23
Dikkat edin, bunu eski zamanlarda okuyan insanlar - bu eski JS ve HTML ve buradaki diğer öneriler çok daha iyi.
RAnders00
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.