window.onbeforeunload і window.onunload не працює у Firefox, Safari, Opera?


76

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

Тож я використав window.onbeforeunloadдля підтвердження попередження та window.onunloadдля logout().

  1. Але обидві функції працюють в IE і Chrome. (Додаток працює нормально)

  2. window.onbeforeunload не працює в Опері, і моє повідомлення не відображатиметься у Firefox.

  3. window.onunload не працює в Safari, Opera та Firefox.

Мій код JavaScript буде:

// Used for confirmation, to closing the window 
window.onbeforeunload = function () {

    return  "Are you sure want to LOGOUT the session ?";
}; 

// Used to logout the session, when browser window was closed 
window.onunload = function () {

    if((sessionId != null)&&(sessionId!="null")&& (sessionId != ""))
        logout();
};

Я також спробував ту ж функцію з JQuery,

<script type="text/javascript">

    $(window).on('beforeunload', function() {
        return 'Are you sure want to LOGOUT the session ?';
    });

    $(window).unload(function() {
        if ((sessionId != null) && (sessionId != "null") && (sessionId != "")) {
            logout();
        }
    });
    
</script>

Працює на моєму Firefox, за винятком того, що повідомлення не те, що ви надіслали. jsfiddle.net/yhx6d
Fabrício Matté

Дякуємо за відповідь ... Так, повідомлення не відображатиметься. Також вихід із системи () не працює. Це означає, що window.onunload () не працює?
Людина

window.onbeforeunload і window.onunload не працюють в Opera?
Людина

1
Opera не підтримує, onbeforeunload а її підтримка onunloadнеповна.
Марсель Корпель

1
люб'язно перевірка stackoverflow.com/questions/5548505 / ... для FireFox випуску
mymotherland

Відповіді:


93

На жаль, використовувані вами методи не підтримуються у цих браузерах. На підтримку моєї відповіді (цієї непідтримуючої поведінки) я навів посилання нижче.

onbeforeunloadі onunloadне працює в opera... щоб підтримати це

onbeforeunload в Opera
http://www.zachleat.com/web/dont-let-the-door-hit-you-onunload-and-onbeforeunload/

Хоча onunloadподія не працює повністю, ви можете використовувати onunloadпопередження, якщо користувач натискає посилання, щоб відійти від сторінки з незбереженою формою.

onunloadне працює в safari... щоб підтримати це

https://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/

Ви можете скоріше спробувати використовувати pagehideподію в браузері сафарі замість onunload.

onunloadне працює в firefox... щоб підтримати це

https://bugzilla.mozilla.org/show_bug.cgi?id=681636

Вони ще не знайшли рішення у FF

Бажаю вам удачі!


40
Я дав вам +50 нагород. Оскільки ви багато працювали, щоб отримати цю запропоновану відповідь. І це допоможе з інших питань.
Людина

3
будь які оновлення ? все ще не підтримується?, будь-які обхідні шляхи?
Франсіско Корралес Моралес

Посилання, яким ви поділилися для підтримки твердження, onunloadяке не працює у Firefox, призначене, коли сторінка знаходиться лише у спливаючій ситуації. "window.onUnload не працює, коли сторінка знаходиться у спливаючому вікні"
Нік Роландо,

43

Ось робоче рішення для ie, firefox та chrome:

var myEvent = window.attachEvent || window.addEventListener;
var chkevent = window.attachEvent ? 'onbeforeunload' : 'beforeunload'; /// make IE7, IE8 compitable

            myEvent(chkevent, function(e) { // For >=IE7, Chrome, Firefox
                var confirmationMessage = 'Are you sure to leave the page?';  // a space
                (e || window.event).returnValue = confirmationMessage;
                return confirmationMessage;
            });

@ user3253009. як ви знайдете відповідь тут?
KumarHarsh

Яка відповідь @KumarHarsh?
faisale

@ user3253009, коли з’являться спливаючі вікна з написом «Залишатись на сторінці» або «Залишити сторінку», чи зможемо ми зрозуміти відповідь, натиснув користувач яку кнопку.
KumarHarsh

ні @KumarHarsh, ви не можете зрозуміти відповідь, це поведінка браузера, або ви можете залишитися або залишити сторінку.
faisale

2
@ user3253009, чудово! Але, здається, це не працює на сафарі на iPhone. Будь-яке можливе обхідне рішення для цього?
user2335065

17

Мені вдалося змусити його працювати в IE та FF за допомогою jQuery:

$(window).bind('beforeunload', function(){

});

замість: вивантажити, розвантажити або попередньо завантажити


@JavaPlayer Здається, це працює для мене у firefox 26.x ... Чи шукали ви інші помилки JavaScript. Це продовжує працювати для мене.
nathan hayfield

@nathanhayfield Це працює нормально, але є спливаюче вікно. Як я міг проігнорувати це?
WP Learner

@nathanhayfield я також спробував, і є попередження для підтвердження. Чому це показано? у моїй функції / коді немає попередження
WP Learner

14

Я отримав рішення для onunloadвсіх браузерів, крім Opera, змінивши асинхронний запит Ajax на синхронний запит.

xmlhttp.open("POST","LogoutAction",false);

Це добре працює для всіх браузерів, крім Opera .


він працює у firefox, але, на жаль, mdn каже, що його нібито застаріло
oldboy

6

Подія onunload викликається не у всіх браузерах. Гірше того, ви не можете перевірити повернене значення події onbeforeunload. Це заважає нам фактично виконати попередню функцію виходу.

Тим не менш, ви можете зламати це.

Вихід із виходу з виклику першим у події onbeforeunload. потім підкажіть користувачеві. Якщо користувач скасує вихід, автоматично ввійдіть назад, використовуючи подію onfocus. Як би назад, але я думаю, що це має спрацювати.

'use strict';

var reconnect = false;

window.onfocus = function () {
  if (reconnect) {
    reconnect = false;
    alert("Perform an auto-login here!");
  }
};

window.onbeforeunload = function () {
  //logout();
  var msg = "Are you sure you want to leave?";
  reconnect = true;
  return msg;
};

3
Здається, це дуже небезпечно робити. Для можливості автоматичного входу користувача назад в облікові дані потрібно зберігати в браузері, який, в основному, дозволяє ввійти в систему будь-кому.
Ніклас,

2

Firefox просто не відображає власні повідомлення перед завантаженням. Mozilla заявляє, що захищає кінцевих користувачів від зловмисних веб-сайтів, які можуть відображати оманливий текст.

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