window.onbeforeunload не працює на iPad?


84

Хтось знає, чи onbeforeunloadподія підтримується на iPad та / або існує інший спосіб її використання?

Я спробував майже все, і здається, onbeforeunloadподія ніколи не запускається на iPad (браузер Safari).

Зокрема, це те, що я пробував:

  • window.onbeforeunload = function(event) { event.returnValue = 'test'; }
  • window.onbeforeunload = function(event) { return 'test'; }
  • (обидва вищезазначені разом)
  • window.onbeforeunload = function(event) { alert('test')'; }
  • (всі вищезазначені функції, але всередині <body onbeforeunload="...">

Всі вони працюють на FF та Safari на ПК, але не на iPad.

Крім того, я зробив наступне відразу після завантаження сторінки:

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

Відповідно, результати такі:

  • true
  • object
  • null

Отже, браузер справді має властивість, але з якихось причин він не запускається.

Я намагаюся відійти від сторінки, натискаючи кнопки назад і вперед, виконуючи пошук Google у верхній панелі, змінюючи місце розташування в адресному рядку та натискаючи закладку.

Хтось уявляє, що відбувається? Буду дуже вдячний за будь-який внесок.

Дякую


Дякуємо обом за внесок. Це має бути одна з причин, про яку ви згадали. На жаль, офіційної документації від Apple щодо цього та інших обмежень немає. Сподіваємось, вони запропонують більш креативний спосіб увімкнення цієї функції, одночасно запобігаючи зловмисному використанню її. Дуже часто я чую, що люди випадково відриваються від сторінки і втрачають усі дані, які вони ввели у форму.
Art Zambrano,

Ви пробували використовувати addEventListener()?
Hello71

2
Я майже впевнений, beforeunloadщо не працює в Safari на iOS. :-( Можливо, не те, що ви шукаєте, але у мене є пропозиція щодо того, як надійно перевірити робочий станbeforeunload
Peter V. Mørch

1
3 березня 2016 року The window.onbeforeunload = function(event) { event.returnValue = 'test'; }не працює як на Chrome, так і на Safari iOS 9.2.1. Мені дуже подобається, onbeforeunloadоскільки сторінка не змінюється, якщо натиснути кнопку скасувати.
vanduc1102

Здається, ця проблема була вирішена в Safari та iOS 13
Finesse

Відповіді:


20

Я виявив, що подія onunload () спрацьовує. Це поведінка дещо дивна; все, що є у вашій функції зворотного виклику, приєднаній до події, насправді запускається після завантаження нової сторінки у фоновому режимі (Ви ще не можете сказати, що вона завантажена, але реєстрація на сервері покаже, що вона є).

Як не дивно, якщо у вас є виклик підтвердження () у вашому onunload (), і користувач натиснув посилання, щоб піти кудись ще, ви займаєтеся бізнесом. Однак, якщо користувач закриває вкладку браузера iPad Safari, подія onunload () спрацює, але ваше підтвердження () матиме неявне скасування як відповідь.


Га, здається, ця примхливість підтвердження (що друга сторінка потрапляє перед повідомленням про підтвердження) справедлива не тільки для мобільного сафарі, але і для firefox (і, мабуть, інших). Ви просто здули мене з розуму.
Амальговін

4
unloadподія припинена на користь pagehideдив. developer.apple.com/library/ios/documentation/AppleApplications/…
sol0mka

1
@ sol0mka: Ось і все, чоловіче! Чудово! У моєму випадку наступний код справився, наскільки я бачу для всіх своїх браузерів І iOS: $ (window) .on ('beforeunload pagehide', function () {// мої речі, які потрібно зробити на сторінці змінити}); Це має бути прийнятою відповіддю на мої очі.
Гаравані

18

Цей фрагмент JavaScript працює для мене в Safari та Chrome на ipad та iphone, а також на настільних комп'ютерах / ноутбуках / інших браузерах:

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
Він може вловити подію, але як можна з’явити запит на підтвердження? Використання return 'test';подібного до операційного не працює.
user2335065

Дякую, я пропустив це в оригінальному питанні. Я спеціально не тестував це на iOS, але, можливо, додавання цього додаткового рядка буде працювати: window.event.cancelBubble = true; Доповню до своєї відповіді
Danger

2
Дякую, але, на жаль, це не працює ... Я спробував розмістити в ньому alert (), здається, нова сторінка почала завантажуватися до того, як запуститься alert (). Також дивіться: stackoverflow.com/questions/3239834 / ...
user2335065

@ user2335065 ви знайшли якесь рішення для того самого.
Neeraj Rathod

хлопці, ви знайшли якесь рішення, щоб показати запит на підтвердження перед виходом зі сторінки? Це чудово працює в кожному браузері, окрім сафарі IOS. Я теж спробував подію pagehide, але мені не вдалося. Заздалегідь спасибі.
Рахул

6

Тільки Apple могла б точно знати, але я припускаю, що вони навмисно не ввімкнули цю функцію в мобільному Safari, оскільки вона найчастіше використовується тіньовими персонажами, щоб змусити вас залишатися на їхньому сайті або з’являти безліч порно / рекламних вікон.


55
Або, знаєте, збережіть зміни автоматично, щоб вони не були загублені лише тому, що ви випадково постукали не те,
Джоел Мюллер

4
Я не сказав, що не було дійсних застосувань, я просто сказав, що це найчастіше.
Charles Boyung,

3
@JoelMueller Ваш коментар повинен бути прийнятою відповіддю :)
sanchez

1
@JoelMueller Це саме мій випадок використання. Grrr @ apple
user2808054

@JoelMueller, будь ласка, поділіться будь-яким офіційним документом, де ми можемо звернутися до цього твердження, що мобільне сафарі автоматично зберігає зміни.
Neeraj Rathod

3

У WebKit є відома помилка з onbeforeunload. Я вважаю, що це виправлено в останній бета-версії Chrome 5, але цілком можливо, що браузер iPad створений з версії WebKit, яка не має виправлення.

Звіт про помилку Chrome .


1
Я розгублений чи ця помилка все ще існує у браузері iPad?
Пітер


2

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

бачити чути.

попередження більше не дозволяються під час подій закриття сторінки (перед вивантаженням, вивантаженням, прихованням сторінки).

Я думаю, попередження, сповіщення, підтвердження та інші подібні дії також більше не дозволяються.


1

Якщо вам просто потрібно знати, чи залишилася сторінка, ви можете скористатися нею document.unload. Це чудово працює в браузерах ios. Якщо ви бачите в документації Apple, ви виявите, що вона застаріла, і вони рекомендують використовувати document.pagehide


так, ця подія спрацьовує в сафарі, але запит на підтвердження не надходить, як у chrome.
Рахул,

1

Ось рішення, яке має працювати на всіх сучасних браузерах:

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");
    }
});

Мобільні браузери, як правило, не підтримують, beforeunloadоскільки браузер може перейти у фоновий режим, не розвантажуючи сторінку, і в будь-який час бути вбитий операційною системою.

Більшість браузерів на робочому столі містять помилку, яка призводить visibilityStateдо того, що при вивантаженні документа не викликається. Дивіться: тут .

Тому важливо включити обидві події, щоб охопити всі сценарії.

Примітка

Я використовував console.logзамість цього alertу своєму прикладі, оскільки alertдеякі браузери заблокують при виклику з beforeunloadабо visibilitychange.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.