39

Does window.onbeforeunload() fire in all browsers? I need a onbeforeunload functionality which is supported at least by IE6 and FF3.6.

For IE, onbeforeunload() seems only to be supported by IE9

powtac
  • 40,542
  • 28
  • 115
  • 170

5 Answers5

15

I found a workaround for Firefox with setTimeout function because it does not have the same behaviour as other web browsers.

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

Aelios
  • 11,849
  • 2
  • 36
  • 54
6

No it does not fire in all browsers. It's not supported in mobile browsers e.g. Safari, Opera Mobile & mini, Dolphin. See Is there an alternative method to use onbeforeunload in mobile safari?

Community
  • 1
  • 1
Ian Stanway
  • 610
  • 8
  • 25
  • Yes it does. The OP asked "Does window.onbeforeunload() fire in all browsers?" and my answer is "it's not supported in mobile browsers". – Ian Stanway Dec 05 '14 at 17:00
  • While this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes. – J Santosh Oct 24 '15 at 05:37
  • 2
    Whilst I agree generally, in this case my answer does include the essential parts of the linked article (not supported in mobile browsers), plus I am linking to SO so there is no danger of the link becoming invalid. – Ian Stanway Nov 06 '15 at 12:14
2

Building upon Tushar Ahirrao solution this works cross browser and triggers once (Works in Firefox, Chrome, whatever)

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

Paste above template to empty file then edit it

Jacek Pietal
  • 1,980
  • 1
  • 18
  • 27
1

It's my recollection that IE was the only browser to implement onbeforeunload, but some browsers have taken it upon themselves to implement it.

Long story short, IE is about the only browser (with very finite exceptions) you'll find this event consistently in.

Brad Christie
  • 100,477
  • 16
  • 156
  • 200
  • Given it's a microsoft product, [MSDN](http://msdn.microsoft.com/en-us/library/ms536907%28v=vs.85%29.aspx) would be a great place to start. – Brad Christie Sep 12 '11 at 14:39
  • Yes I saw this page already, but I don't see any information about the support of IE versions on it, or do I miss something? – powtac Sep 12 '11 at 14:41
  • 1
    @powtac: I believe it goes pretty far back (though I remember issues arising in IE8 with this event). You can also [test for support](http://stackoverflow.com/questions/158673/onbeforeunload-support-detection) and bind when found and default when absent. – Brad Christie Sep 12 '11 at 14:44
-6

Then you can use both like this :

<body onunload="functionName();" onbeforeunload='functionName();' >
Tushar Ahirrao
  • 12,669
  • 17
  • 64
  • 96