window.onbeforeunload không hoạt động trên iPad?


84

Có ai biết onbeforeunloadsự kiện có được hỗ trợ trên iPad hay không và / hoặc nếu có một cách khác để sử dụng nó?

Tôi đã thử khá nhiều thứ và có vẻ như onbeforeunloadsự kiện này không bao giờ được kích hoạt trên iPad (trình duyệt Safari).

Cụ thể, đây là những gì tôi đã thử:

  • window.onbeforeunload = function(event) { event.returnValue = 'test'; }
  • window.onbeforeunload = function(event) { return 'test'; }
  • (cả hai điều trên cùng nhau)
  • window.onbeforeunload = function(event) { alert('test')'; }
  • (tất cả các chức năng trên nhưng bên trong <body onbeforeunload="...">

Tất cả những điều này đều hoạt động trên FF và Safari trên PC, nhưng không hoạt động trên iPad.

Ngoài ra, tôi đã thực hiện những việc sau ngay sau khi tải trang:

alert('onbeforeunload' in window);
alert(typeof window.onbeforeunload);
alert(window.onbeforeunload);

Tương ứng, kết quả là:

  • true
  • object
  • null

Vì vậy, trình duyệt có thuộc tính này, nhưng vì lý do nào đó mà nó không bị kích hoạt.

Các cách tôi cố gắng điều hướng khỏi trang là nhấp vào nút quay lại và chuyển tiếp, bằng cách thực hiện tìm kiếm trên google ở ​​thanh trên cùng, bằng cách thay đổi vị trí trong thanh địa chỉ và bằng cách nhấp vào dấu trang.

Có ai có bất kỳ ý tưởng về những gì đang xảy ra? Tôi đánh giá rất cao bất kỳ đầu vào nào.

Cảm ơn


Cảm ơn cả hai vì những gì đã đóng góp. Nó phải là một trong những lý do mà bạn đã đề cập. Thật không may, không có tài liệu chính thức từ Apple về điều này và các hạn chế khác. Hy vọng rằng họ sẽ nghĩ ra một cách sáng tạo hơn để kích hoạt tính năng này, đồng thời ngăn chặn việc sử dụng nó với mục đích xấu. Tôi thường nghe nói rằng mọi người vô tình nhấn ra khỏi trang và mất tất cả dữ liệu họ đã nhập vào biểu mẫu.
Art Zambrano,

Bạn đã thử sử dụng addEventListener()chưa?
Xin chào71

2
Tôi khá chắc chắn beforeunloadkhông hoạt động trên Safari trên iOS. :-( Có lẽ không phải những gì bạn đang tìm kiếm, nhưng tôi có một đề nghị cho làm thế nào để kiểm tra đáng tin cậy cho một lao độngbeforeunload
Peter V. Mørch

1
Vào ngày 3 tháng 3 năm 2016, The window.onbeforeunload = function(event) { event.returnValue = 'test'; }không hoạt động trên cả Chrome và Safari của iOS 9.2.1. Tôi thực sự thích onbeforeunloadVì trang không thay đổi nếu tôi bấm hủy.
vanduc1102 Ngày

Có vẻ như vấn đề này đã được giải quyết trong Safari và iOS 13
Finesse

Câu trả lời:


20

Tôi nhận thấy rằng sự kiện onunload () kích hoạt. Đó là hành vi hơi kỳ quặc; bất cứ thứ gì bạn có trong hàm gọi lại được đính kèm với sự kiện sẽ thực sự được chạy sau khi trang mới được tải ở chế độ nền (Bạn không thể biết nó đã được tải chưa, nhưng việc ghi nhật ký máy chủ sẽ cho thấy rằng nó có).

Kỳ lạ hơn, nếu bạn có lệnh gọi xác nhận () trong onunload () của mình và người dùng đã nhấp vào liên kết để đi đến một nơi khác, bạn đang kinh doanh. Tuy nhiên, nếu người dùng đóng tab trình duyệt Safari trên iPad, sự kiện onunload () sẽ kích hoạt, nhưng xác nhận () của bạn sẽ có một phản hồi ngầm là hủy.


Huh, có vẻ như câu hỏi xác nhận này (trang thứ hai được nhấn trước thông báo xác nhận) không chỉ đúng với safari di động mà còn cho firefox (và có thể là những người khác). Bạn vừa thổi bay tâm trí của tôi.
Amalgovinus

4
unloadsự kiện không được dùng nữa thay vì pagehidexem developer.apple.com/library/ios/documentation/AppleAppilities/…
sol0mka Ngày

1
@ sol0mka: Thế là xong bạn ơi! Tuyệt quá! Trong trường hợp của tôi, mã sau đã thực hiện công việc, theo như tôi có thể thấy cho tất cả các trình duyệt VÀ iOS của mình: $ (window) .on ('beforeunload pagehide', function () {// nội dung của tôi phải được thực hiện trên trang thay đổi } ); Đây nên là câu trả lời được chấp nhận trong mắt tôi.
Garavani

18

Bit JavaScript này hoạt động với tôi trên Safari và Chrome trên ipad và iphone, cũng như máy tính để bàn / máy tính xách tay / các trình duyệt khác:

var isOnIOS = navigator.userAgent.match(/iPad/i)|| navigator.userAgent.match(/iPhone/i);
var eventName = isOnIOS ? "pagehide" : "beforeunload";

window.addEventListener(eventName, function (event) { 
    window.event.cancelBubble = true; // Don't know if this works on iOS but it might!
    ...
} );

1
Nó có thể bắt sự kiện, nhưng làm thế nào bạn có thể bật lên lời nhắc xác nhận? Sử dụng return 'test';tương tự như của op không đang làm việc ..
user2335065

Cảm ơn tôi đã bỏ lỡ điều đó trong câu hỏi ban đầu. Tôi chưa kiểm tra cụ thể điều này trên iOS, nhưng có thể thêm dòng bổ sung này sẽ hoạt động: window.event.cancelBubble = true; Tôi sẽ thêm vào câu trả lời của mình
Danger

2
Cảm ơn, nhưng thật đáng buồn là nó không hoạt động ... Tôi đã cố gắng đặt alert () bên trong nó, có vẻ như trang mới đã bắt đầu tải trước khi alert () được kích hoạt. Cũng thấy điều này: stackoverflow.com/questions/3239834/...
user2335065

@ user2335065 bạn có tìm thấy giải pháp nào cho tương tự không.
Neeraj Rathod

các bạn, bạn có tìm thấy giải pháp nào để hiển thị lời nhắc xác nhận trước khi rời trang không? Điều này hoạt động tốt trên mọi trình duyệt ngoại trừ Safari safari. Tôi cũng đã thử sự kiện pagehide, nhưng không hiệu quả với tôi. Cảm ơn trước.
Rahul

6

Chỉ có Apple mới biết chắc chắn, nhưng tôi đoán là họ cố tình không kích hoạt chức năng đó trong Safari di động vì nó thường được các nhân vật mờ ám sử dụng để khiến bạn ở lại trang web của họ hoặc bật lên nhiều cửa sổ khiêu dâm / quảng cáo.


55
Hoặc, bạn biết đấy, lưu các thay đổi của bạn tự động để chúng không bị mất chỉ vì bạn vô tình nhấn sai.
Joel Mueller,

4
Tôi không nói rằng đó là những cách sử dụng không hợp lệ, tôi chỉ nói rằng đó là những cách sử dụng thường xuyên nhất.
Charles Boyung

3
@JoelMueller Nhận xét của bạn phải là câu trả lời được chấp nhận :)
sanchez

1
@JoelMueller Đó chính xác là trường hợp sử dụng của tôi. Grrr @ apple
user2808054

@JoelMueller, bạn có thể vui lòng chia sẻ bất kỳ tài liệu chính thức nào mà chúng tôi có thể giải quyết tuyên bố này rằng mobile safari lưu các thay đổi tự động không.
Neeraj Rathod



2

https://code.google.com/p/chromium/issues/detail?id=97035

thấy nghe.

cảnh báo không còn được phép trong các sự kiện loại bỏ trang (tải trước khi tải xuống, tải xuống, ẩn trang).

Tôi nghĩ rằng các cảnh báo, nhắc nhở, xác nhận và các hành động khác như thế này cũng không còn được phép nữa.


1

Nếu bạn chỉ cần biết nếu trang còn lại, bạn có thể sử dụng document.unload. Nó hoạt động tốt trên các trình duyệt iOS. Nếu bạn xem trên tài liệu của Apple, bạn sẽ thấy rằng nó không được dùng nữa và họ khuyên bạn nên sử dụng document.pagehide


có, sự kiện này xảy ra trong safari, nhưng lời nhắc xác nhận không đến như trong chrome.
Rahul

1

Đây là một giải pháp sẽ hoạt động trên tất cả các trình duyệt hiện đại:

var unloaded = false;
window.addEventListener("beforeunload", function(e)
{
    if (unloaded)
        return;
    unloaded = true;
    console.log("beforeUnload");
});
window.addEventListener("visibilitychange", function(e)
{
    if (document.visibilityState == 'hidden')
    {
        if (unloaded)
            return;
        unloaded = true;
        console.log("beforeUnload");
    }
});

Các trình duyệt dành cho thiết bị di động không có xu hướng không hỗ trợ beforeunloadvì trình duyệt có thể chuyển sang chế độ nền mà không tải trang, sau đó bị hệ điều hành khai tử bất cứ lúc nào.

Hầu hết các trình duyệt trên máy tính để bàn đều chứa một lỗi khiến visibilityStatekhông được gọi khi tải tài liệu. Xem: tại đây .

Do đó, điều quan trọng là phải bao gồm cả hai sự kiện để bao gồm tất cả các tình huống.

NB

Tôi đã sử dụng console.logthay vì alerttrong ví dụ của mình vì alertsẽ bị chặn bởi một số trình duyệt khi được gọi từ beforeunloadhoặc visibilitychange.

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.