web-dev-qa-db-fra.com

Crossbrowser onbeforeunload?

window.onbeforeunload() se déclenche-t-il dans tous les navigateurs? J'ai besoin d'une fonctionnalité onbeforeunload qui est prise en charge au moins par IE6 et FF3.6.

Pour IE, onbeforeunload() semble seulement être pris en charge par IE9

37
powtac

J'ai trouvé une solution de contournement pour Firefox avec la fonction setTimeout car elle n'a pas le même comportement que les autres navigateurs Web.

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

14
Aelios

Non, il ne se déclenche pas dans tous les navigateurs. Il n'est pas pris en charge dans les navigateurs mobiles, par exemple Safari, Opera Mobile & mini, Dolphin. Voir Existe-t-il une méthode alternative à utiliser onbeforeunload dans le safari mobile?

5
Ian Stanway

S'appuyant sur la solution Tushar Ahirrao, cela fonctionne sur plusieurs navigateurs et se déclenche une fois (fonctionne dans Firefox, Chrome, peu importe)

<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>

Coller le modèle ci-dessus pour vider le fichier puis le modifier

2
Jacek Pietal

Je me souviens que IE était le seul navigateur à implémenter onbeforeunload, mais certains navigateurs ont pris sur eux de le mettre en œuvre.

Pour faire court, IE est le seul navigateur (avec des exceptions très limitées) dans lequel vous trouverez cet événement de manière cohérente.

1
Brad Christie