เรียกใช้โค้ด JavaScript เมื่อปิดหน้าต่างหรือรีเฟรชหน้า?


110

มีวิธีเรียกใช้โค้ด JavaScript ขั้นสุดท้ายเมื่อผู้ใช้ปิดหน้าต่างเบราว์เซอร์หรือรีเฟรชหน้าหรือไม่

ฉันกำลังคิดถึงสิ่งที่คล้ายกับ onload แต่เหมือน onclose มากกว่า? ขอบคุณ.

ฉันไม่ชอบวิธี onbeforeunload ซึ่งมักจะให้กล่องยืนยันโผล่ขึ้นมา (ออกจากหน้า / อยู่ใน mozilla) หรือ (โหลดใหม่ / ไม่โหลดซ้ำบน chrome) มีวิธีรันโค้ดแบบเงียบ ๆ หรือไม่?


1
อาจซ้ำกันได้: stackoverflow.com/questions/805463/…
1.44mb


18
เดี๋ยวก่อนนี่ไม่ใช่เรื่องซ้ำ ... เขาต้องการทราบวิธีดำเนินการบางอย่างโดยไม่ต้องแจ้งให้ผู้ใช้ - คำถามที่เชื่อมโยงถามตรงกันข้าม ...
Phildo

คำตอบ:


86

มีทั้งwindow.onbeforeunloadและwindow.onunloadที่ใช้แตกต่างกันขึ้นอยู่กับเบราว์เซอร์ คุณสามารถกำหนดคุณสมบัติเหล่านี้ได้โดยการตั้งค่าคุณสมบัติของหน้าต่างเป็นฟังก์ชันหรือใช้.addEventListener:

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

โดยปกติonbeforeunloadจะใช้ในกรณีที่คุณต้องการหยุดไม่ให้ผู้ใช้ออกจากเพจ (เช่นผู้ใช้กำลังทำงานกับข้อมูลที่ไม่ได้บันทึกดังนั้นควรบันทึกก่อนออก) Operaonunloadไม่รองรับเท่าที่ฉันทราบ แต่คุณสามารถตั้งค่าทั้งสองอย่างได้ตลอดเวลา


สิ่งนี้ใช้ได้ผลกับฉัน: Firefox (69.0.2) และ Chrome (77.0.3865.90)
FelipeCaparelli

51

ตกลงผมพบว่าวิธีการแก้ปัญหาการทำงานนี้ประกอบด้วยการใช้เหตุการณ์แล้วทำให้ผลตอบแทนจากการจัดการbeforeunload nullการดำเนินการนี้จะเรียกใช้รหัสที่ต้องการโดยไม่มีกล่องยืนยันที่โผล่ขึ้นมา มันจะเป็นดังนี้:

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

หวังว่านี่จะช่วยได้


10
สิ่งนี้ไม่ได้ถูกยิงเมื่อนำทางออกและเมื่อรีเฟรช (F5) หรือไม่? ถ้าเป็นเช่นนั้นก็ไม่ได้ตอบคำถามจริงๆ ...
จาโก

1
ไม่ได้ทดสอบ แต่ฉันคิดว่าreturn false;ทำเหมือนกัน (เช่นป้องกันพฤติกรรมเริ่มต้น) และถูกต้องตามความหมายมากกว่า
collimarco

1
return false จะยังคงปรากฏขึ้นในกล่องโต้ตอบถามว่าคุณต้องการออกจากเพจหรือไม่ ฉันทดสอบบนสมอ ด้วยการคืนค่าว่างกล่องโต้ตอบไม่ปรากฏขึ้น แต่ก็ยังทำ console.log
Ricky Stam

21

บางครั้งคุณอาจต้องการแจ้งให้เซิร์ฟเวอร์ทราบว่าผู้ใช้กำลังออกจากเพจ สิ่งนี้มีประโยชน์ตัวอย่างเช่นในการล้างข้อมูลรูปภาพที่ไม่ได้บันทึกที่จัดเก็บไว้ชั่วคราวบนเซิร์ฟเวอร์เพื่อทำเครื่องหมายผู้ใช้นั้นเป็น "ออฟไลน์" หรือเพื่อบันทึกเมื่อเสร็จสิ้นเซสชัน

ในอดีตคุณจะส่งคำขอ AJAX ในbeforeunloadฟังก์ชัน แต่มีปัญหาสองประการ หากคุณส่งคำขอแบบอะซิงโครนัสไม่มีการรับประกันว่าคำขอจะดำเนินการอย่างถูกต้อง หากคุณส่งคำขอแบบซิงโครนัสจะน่าเชื่อถือกว่า แต่เบราว์เซอร์จะหยุดทำงานจนกว่าคำขอจะเสร็จสิ้น หากเป็นการร้องขอที่ช้าผู้ใช้จะไม่สะดวกอย่างมาก

navigator.sendBeacon()โชคดีที่ตอนนี้เรามี ด้วยการใช้sendBeacon()วิธีนี้ข้อมูลจะถูกส่งแบบอะซิงโครนัสไปยังเว็บเซิร์ฟเวอร์เมื่อ User Agent มีโอกาสที่จะดำเนินการดังกล่าวโดยไม่ทำให้การยกเลิกการโหลดล่าช้าหรือส่งผลต่อประสิทธิภาพของการนำทางถัดไป วิธีนี้ช่วยแก้ปัญหาทั้งหมดในการส่งข้อมูลการวิเคราะห์: ข้อมูลถูกส่งอย่างน่าเชื่อถือส่งแบบอะซิงโครนัสและไม่ส่งผลกระทบต่อการโหลดหน้าถัดไป นี่คือตัวอย่างการใช้งาน:

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

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

sendBeacon()จะได้รับการสนับสนุนใน:

  • ขอบ 14
  • Firefox 31
  • Chrome 39
  • Safari 11.1
  • โอเปร่า 26
  • iOS Safari 11.4

ขณะนี้ยังไม่รองรับใน:

  • Internet Explorer
  • โอเปร่ามินิ

นี่คือpolyfill สำหรับ sendBeacon ()ในกรณีที่คุณต้องการเพิ่มการรองรับสำหรับเบราว์เซอร์ที่ไม่รองรับ หากวิธีการดังกล่าวไม่มีอยู่ในเบราว์เซอร์ก็จะส่งคำขอ AJAX แบบซิงโครนัสแทน


คำถามนี้อยู่ในขอบเขตของกรณี "เพื่อส่งคำขอไปยังเซิร์ฟเวอร์" แนวคิดคือเพื่อให้สามารถติดตามแท็บที่เปิดต่อผู้ใช้และล้างข้อมูลในแบ็กเอนด์เมื่อปิดแท็บ
ปีเตอร์

@ ปีเตอร์ฉันรวมไว้เพื่อความสมบูรณ์ แต่ฉันลบทิ้ง
Mike

@ ไมค์โปรดอย่าลบคำตอบของคุณ ไม่เพียง แต่ตอบคำตอบที่ดีที่สุดที่เลือกเท่านั้น (ควรเป็นของคุณ) แต่ยังนำเสนอเหตุการณ์ที่ใช้ในการจับทางออกหน้าต่างหรือปิด
Alex8752

@ Alex8752 ผมไม่ได้ลบคำตอบของฉันฉันออกมาแก้ไขส่วนหนึ่งของมันที่ไม่เกี่ยวข้องกับคำถามที่คุณสามารถดูที่นี่
Mike

1
@AshokKumar คุณเป็นผู้ควบคุมสิ่งที่คุณส่งไปยังเซิร์ฟเวอร์ หากคุณต้องการส่งสิ่งของโดย GET ไม่มีสิ่งใดที่ขัดขวางไม่ให้คุณส่งคำขอไปยังบางสิ่งเช่นhttp://example.com/script.php?token=something&var1=val1&var2=val2การใส่ค่าเหล่านั้นลงใน GET
ไมค์

15

jQuery เวอร์ชัน:

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

ปรับปรุง : jQuery 3:

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

ขอบคุณ Garrett


8

เอกสารประกอบที่นี่สนับสนุนการฟังเหตุการณ์ onbeforeunload และ / หรือเพิ่มตัวฟังเหตุการณ์บนหน้าต่าง

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

คุณยังสามารถเติมคุณสมบัติ. onunload หรือ. onbeforeunload ของหน้าต่างด้วยฟังก์ชันหรือการอ้างอิงฟังก์ชัน

แม้ว่าพฤติกรรมจะไม่เป็นมาตรฐานในเบราว์เซอร์ แต่ฟังก์ชันนี้อาจส่งคืนค่าที่เบราว์เซอร์จะแสดงเมื่อยืนยันว่าจะออกจากหน้าหรือไม่



3

กรณีที่มีการเรียกเพื่อให้คุณสามารถกำหนดฟังก์ชั่นbeforeunloadwindow.onbeforeunload


-2

คุณสามารถลองสิ่งนี้:

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

<body onBeforeUnload="loadOut()">

26
ระวังคนที่อ่านสิ่งนี้ในสมัยโบราณนี่คือ JS และ HTML แบบโบราณและคำแนะนำอื่น ๆ ที่นี่เป็นวิธีที่ดีกว่า
RAnders00
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.