Кроссбраузер перед загрузкой? - PullRequest
37 голосов
/ 12 сентября 2011

Работает ли window.onbeforeunload() во всех браузерах? Мне нужна функциональность onbeforeunload, которая поддерживается по крайней мере в IE6 и FF3.6.

Для IE onbeforeunload(), кажется, поддерживается только IE9

Ответы [ 5 ]

14 голосов
/ 30 мая 2012

Я нашел обходной путь для Firefox с функцией setTimeout, потому что он не работает так же, как другие веб-браузеры.

window.onbeforeunload = function (e) {
    var message = "Are you sure ?";
    var firefox = /Firefox[\/\s](\d+)/.test(navigator.userAgent);

    if (firefox) {
        //Add custom dialog
        //Firefox does not accept window.showModalDialog(), window.alert(), window.confirm(), and window.prompt() furthermore
        var dialog = document.createElement("div");
        document.body.appendChild(dialog);
        dialog.id = "dialog";
        dialog.style.visibility = "hidden";
        dialog.innerHTML = message; 
        var left = document.body.clientWidth / 2 - dialog.clientWidth / 2;
        dialog.style.left = left + "px";
        dialog.style.visibility = "visible";  
        var shadow = document.createElement("div");
        document.body.appendChild(shadow);
        shadow.id = "shadow";       
        //tip with setTimeout
        setTimeout(function () {
            document.body.removeChild(document.getElementById("dialog"));
            document.body.removeChild(document.getElementById("shadow"));
        }, 0);
    }

    return message;
}

GitHub: https://github.com/Aelios/crossbrowser-onbeforeunload

5 голосов
/ 22 сентября 2011

Нет, это не срабатывает во всех браузерах. Это не поддерживается в мобильных браузерах, например Сафари, Opera Mobile & Mini, Дельфин. См. Есть ли альтернативный метод использования onbeforeunload в мобильном сафари?

2 голосов
/ 14 февраля 2015

Опираясь на решение Tushar Ahirrao, оно работает в кросс-браузерном режиме и запускается один раз (работает в Firefox, Chrome и т. Д.)

<html>
<head>
<script type="text/javascript">
var app = {};
app.unloaded = false;
app.unload = function() {
    if (app.unloaded) return; else app.unloaded = true;
    // your code here
    return "YO";
};
</script>
</head>
<body onunload="return app.unload();" onbeforeunload="return app.unload();">
YO
</body>
</html>

Вставьте шаблон выше в пустой файл, затем отредактируйте его

1 голос
/ 12 сентября 2011

Насколько я помню, IE был единственным браузером, который реализовал onbeforeunload, но некоторые браузеры взяли это на себя, чтобы реализовать его.

Короче говоря, IE - единственный браузер (с очень ограниченнымисключения) вы найдете это событие последовательно в.

0 голосов
/ 12 сентября 2011

Тогда вы можете использовать оба варианта так:

<body onunload="functionName();" onbeforeunload='functionName();' >
...