Chạy mã JavaScript khi đóng cửa sổ hoặc làm mới trang?


110

Có cách nào để chạy mã JavaScript cuối cùng khi người dùng đóng cửa sổ trình duyệt hoặc làm mới trang không?

Tôi đang nghĩ về một thứ tương tự như onload nhưng giống onclose hơn? Cảm ơn.

Tôi không thích phương pháp onbeforeunload, luôn dẫn đến một hộp xác nhận bật lên (rời khỏi trang / ở lại trên mozilla) hoặc (tải lại / không tải lại trên chrome). Có cách nào để thực thi mã một cách lặng lẽ?


1
Có thể trùng lặp: stackoverflow.com/questions/805463/…
1,44mb


18
Wait- này thực sự không phải là một trùng lặp ... Ông muốn biết làm thế nào để thực hiện một cái gì đó KHÔNG một dấu nhắc để do người dùng những câu hỏi liên quan yêu cầu ngược lại ...
Phildo

Câu trả lời:


84

Có cả hai window.onbeforeunloadwindow.onunload, được sử dụng khác nhau tùy thuộc vào trình duyệt. Bạn có thể đánh giá chúng bằng cách đặt các thuộc tính cửa sổ thành các hàm hoặc sử dụng .addEventListener:

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

Thông thường, onbeforeunloadđược sử dụng nếu bạn cần ngăn người dùng rời khỏi trang (ví dụ: người dùng đang làm việc trên một số dữ liệu chưa được lưu, vì vậy họ nên lưu trước khi rời khỏi). onunloadkhông được Opera hỗ trợ , theo như tôi biết, nhưng bạn luôn có thể đặt cả hai.


Điều này làm việc cho tôi: Firefox (69.0.2) và Chrome (77.0.3865.90)
FelipeCaparelli

51

Ok, tôi đã tìm thấy một giải pháp hiệu quả cho việc này, nó bao gồm sử dụng beforeunloadsự kiện và sau đó làm cho trình xử lý quay trở lại null. Điều này thực thi mã truy nã mà không có hộp xác nhận bật lên. Nó đi một cái gì đó như thế này:

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

Hi vọng điêu nay co ich.


10
Điều này không được kích hoạt khi điều hướng ra ngoài và khi làm mới (F5)? Nếu vậy, nó không thực sự giải quyết các câu hỏi ...
Jago

1
Không được thử nghiệm, nhưng tôi nghĩ là return false;làm như vậy (tức là ngăn chặn hành vi mặc định) và nó đúng hơn về mặt ngữ nghĩa.
collimarco

1
return false sẽ vẫn bật lên hộp thoại hỏi bạn có muốn rời khỏi trang hay không. Tôi đã thử nghiệm nó trên một mỏ neo. Với sự trở lại vô hộp thoại không bật lên nhưng nó vẫn đã làm console.log
Ricky Stam

20

Đôi khi bạn có thể muốn cho máy chủ biết rằng người dùng đang rời khỏi trang. Điều này rất hữu ích, chẳng hạn, để xóa các hình ảnh chưa lưu được lưu trữ tạm thời trên máy chủ, để đánh dấu người dùng đó là "ngoại tuyến" hoặc để ghi lại khi họ hoàn thành phiên của mình.

Trước đây, bạn sẽ gửi một yêu cầu AJAX trong beforeunloadhàm, tuy nhiên điều này có hai vấn đề. Nếu bạn gửi một yêu cầu không đồng bộ, không có gì đảm bảo rằng yêu cầu sẽ được thực thi chính xác. Nếu bạn gửi một yêu cầu đồng bộ, nó đáng tin cậy hơn, nhưng trình duyệt sẽ bị treo cho đến khi yêu cầu hoàn tất. Nếu đây là một yêu cầu chậm, đây sẽ là một sự bất tiện rất lớn cho người dùng.

May mắn thay, bây giờ chúng tôi có navigator.sendBeacon(). Bằng cách sử dụng sendBeacon()phương pháp này, dữ liệu được truyền không đồng bộ đến máy chủ web khi Tác nhân người dùng có cơ hội làm như vậy, mà không làm chậm trễ việc tải hoặc ảnh hưởng đến hiệu suất của điều hướng tiếp theo. Điều này giải quyết tất cả các vấn đề với việc gửi dữ liệu phân tích: dữ liệu được gửi đáng tin cậy, được gửi không đồng bộ và nó không ảnh hưởng đến việc tải trang tiếp theo. Đây là một ví dụ về cách sử dụng của nó:

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

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

sendBeacon()được hỗ trợ trong:

  • Cạnh 14
  • Firefox 31
  • Chrome 39
  • Safari 11.1
  • Opera 26
  • iOS Safari 11.4

Nó hiện KHÔNG được hỗ trợ trong:

  • trình duyệt web IE
  • Opera Mini

Đây là một polyfill cho sendBeacon () trong trường hợp bạn cần thêm hỗ trợ cho các trình duyệt không được hỗ trợ. Nếu phương thức không khả dụng trong trình duyệt, nó sẽ gửi một yêu cầu AJAX đồng bộ để thay thế.


Câu hỏi này thuộc phạm vi của trường hợp "Gửi yêu cầu đến máy chủ". Ý tưởng là có thể giữ các tab trên các tab đang mở cho mỗi người dùng và dọn dẹp phần phụ trợ khi một tab bị đóng.
Peter

@Peter Tôi đã bao gồm nó cho hoàn chỉnh, nhưng tôi đã xóa nó.
Mike

@Mike, làm ơn, KHÔNG xóa câu trả lời của bạn. Nó không chỉ hoàn thành câu trả lời tốt nhất được lựa chọn (nó phải là của bạn) mà còn trình bày các sự kiện sử dụng để cửa sổ bắt exit hay gần
Alex8752

@ Alex8752 Tôi không xóa câu trả lời của mình, tôi đã chỉnh sửa một phần của nó không liên quan đến câu hỏi, bạn có thể xem tại đây .
Mike

1
@AshokKumar Bạn kiểm soát những gì bạn gửi đến máy chủ. Nếu bạn muốn gửi mọi thứ bằng GET, không có gì ngăn cản bạn gửi yêu cầu của mình đến một thứ gì đó như http://example.com/script.php?token=something&var1=val1&var2=val2thế đưa những giá trị đó vào GET.
Mike

14

Phiên bản jQuery:

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

Cập nhật : jQuery 3:

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

Cảm ơn Garrett


8

Tài liệu ở đây khuyến khích nghe sự kiện onbeforeunload và / hoặc thêm trình nghe sự kiện trên window.

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

Bạn cũng có thể chỉ cần điền các thuộc tính .onunload hoặc .onbeforeunload của cửa sổ với một hàm hoặc một tham chiếu hàm.

Mặc dù hành vi không được chuẩn hóa trên các trình duyệt, nhưng hàm có thể trả về một giá trị mà trình duyệt sẽ hiển thị khi xác nhận có rời khỏi trang hay không.


7

Bạn có thể sử dụng window.onbeforeunload.

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

3

Sự kiện được gọi beforeunload, vì vậy bạn có thể gán một hàm cho window.onbeforeunload.


-2

Bạn có thể thử một cái gì đó như sau:

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

<body onBeforeUnload="loadOut()">

23
Hãy cẩn thận, mọi người đọc cái này không phải thời xa xưa - đây là JS và HTML cổ đại và các đề xuất khác ở đây là cách tốt hơn.
RAnders00
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.