Sự kiện 'beforeunload' kích hoạt khi trang còn lại trong nền trên Android


8

Tôi đang cố gắng tạo một công cụ tải spinner đơn giản bật lên khi điều hướng. Nó xuất hiện bằng cách sử dụng sự kiện 'tải trước' khi điều hướng đi và sử dụng sự kiện 'tải' để ẩn lần nữa khi nó được thực hiện.

Vấn đề là khi tôi để trang dưới nền trên điện thoại của mình, ví dụ như một vài giờ, sự kiện 'beforeunload' sẽ hiển thị và hiển thị công cụ quay vòng. Có lẽ vì Chrome trên Android đang tải một phần trang để tiết kiệm bộ nhớ. Con quay không tự biến mất và dường như tôi không thể tìm ra cách làm cho nó biến mất một lần nữa một cách tao nhã.

Có sự kiện nào khác tôi nên sử dụng thay thế?

    window.addEventListener("load", function() {
        topSpinner.classList.add("closed");
    });

    window.addEventListener("beforeunload", function() {
        topSpinner.classList.remove("closed");
    });

vấn đề tương tự ở đây :-(
rabudde

2
Tôi đã tạo một câu đố cho việc này: jsfiddle.net/ov6b9pdL Mở cái này trên trình duyệt Chrome (Android?) Trên thiết bị di động của bạn. Tắt màn hình trong 5-10 phút và quay lại trình duyệt. Trong trường hợp của tôi, tôi có thể thấy lớp tải.
rabudde

Câu trả lời:


3

Chrome 68 (tháng 7 năm 2018) đã giới thiệu API Vòng đời Trang mới : sơ đồ trạng thái được cung cấp trong liên kết này không hiển thị cuộc gọi Hệ thống (trình duyệt) beforeunloadtrước khi đưa trang vào frozentrạng thái, nhưng đó rõ ràng là những gì đang xảy ra.

Thật hữu ích, API đã giới thiệu hai sự kiện mới kích hoạt khi trang đi vào và thoát khỏi trạng thái này: freezeresume.

Tôi đã giải quyết vấn đề này trên cả màn hình chrome và webview di động chỉ bằng cách thêm:

document.addEventListener('resume', (event) => {
  // The page has been unfrozen: remove the spinner if it's active
 topSpinner.classList.add("closed");
});

Tôi thấy giải pháp nhưng có ý kiến ​​gì về nguyên nhân có thể? Ngoài ra, có vẻ như từ API Vòng đời Trang có thể sau 'trước khi không tải', nó sẽ bị đóng băng và sau đó được phục hồi. Nhưng tôi đoán điều này sẽ khó theo dõi / gỡ lỗi.
Winston Jude


0

Tôi đã đăng nhập các sự kiện thông qua Ajax vào cơ sở dữ liệu. Các thử nghiệm của tôi cho thấy, không thể dự đoán được sự kiện nào đã được kích hoạt (tức là khi sử dụng PWA). Có focus, visibilitychange, resizebeforeunloadcó liên quan. Tôi đã rất ngạc nhiên khi bật màn hình với PWA hoạt động, đôi khi beforeunloadlà sự kiện duy nhất đã được đăng nhập vào cơ sở dữ liệu.

Tôi đang sử dụng mã sau đây, có vẻ như hoạt động mà không có tác dụng phụ:

var visibilityState = 'visible';
window.addEventListener('beforeunload', function(e) {
    if (visibilityState === 'visible') {
        loader.show(e);
    }
});
window.addEventListener('focus', loader.hide);
window.addEventListener('resize', loader.hide);
window.addEventListener('visibilitychange', function(e) {
    visibilityState = document.visibilityState;
    if (visibilityState === 'visible') {
        loader.hide(e);
    }
});

0

Cố gắng duy trì cờ trình tải thông qua localStorage, vì vậy nếu trang sau đó được tải lại, hãy kiểm tra lại cờ:

Mã giả dưới đây:

$(document).ready(function() {

  $('#loader').hide();
  localStorage.setItem("loader", false);

  window.addEventListener('beforeunload', showLoader);
});

var showLoader = function() {
  var isShow = localStorage.getItem("loader");
  if(!isShow){
      $('#loader').show();
      localStorage.setItem("loader", true);
  }
};

Điều này sẽ không giúp ích gì cho trường hợp sử dụng của OP, vì khi bật màn hình di động từ chế độ chờ, trang không thực sự được tải lại.
rabudde

Vì vậy, có thể bằng cách sử dụng hàm setTimeout mỗi x giây để kiểm tra trạng thái có thể hữu ích trong trường hợp đó không?
Ahed Kabalan

Không thân thiện lắm. Hãy tưởng tượng một tình huống mà bạn bật trên màn hình điện thoại di động của bạn với trình duyệt đã mở. Điều đầu tiên bạn sẽ thấy là biểu tượng trình tải sẽ bị xóa do setTimeoutsau xvài giây, vì vậy trong trường hợp xấu nhất bạn phải đợi xvài giây để xem lại trang. Ngoài ra, sử dụng bộ hẹn giờ chạy mọi lúc cho trường hợp đặc biệt này không thực sự sáng tạo.
rabudde

Không, ý tôi là hẹn giờ để kiểm tra giá trị cờ ở trên.
Ahed Kabalan

Tôi không biết ý của bạn là gì. Vui lòng chỉnh sửa mã của bạn để hiển thị cách làm việc này.
rabudde
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.