Crossbrowser onbeforeunload?

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

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

Ответ 1

Я нашел обходной путь для 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

Ответ 3

Основываясь на решении 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>

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

Ответ 4

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

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

Ответ 5

Затем вы можете использовать оба типа:

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