跨浏览器onbeforeunload?

IT技术 javascript cross-browser onbeforeunload
2021-01-26 13:01:03

是否window.onbeforeunload()在所有浏览器中触发?我需要至少 IE6 和 FF3.6 支持的 onbeforeunload 功能。

对于 IE,onbeforeunload()似乎只有IE9 支持

5个回答

我找到了一种具有setTimeout功能的Firefox 解决方法,因为它与其他 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

很酷的解决方案!如果你想从 Github 添加一个链接回到这个讨论,让这个讨论中的知识保持联系......
2021-03-22 13:01:03
其实Opera不知道onbeforeunload事件,仅此而已
2021-03-24 13:01:03
not seem to catch onbeforeunload event如果有一个本地 onbeforeunload 事件,这意味着什么
2021-03-28 13:01:03
@Aelios,这会导致像 Opera 这样的浏览器onbeforeunload在卸载之前触发事件吗?
2021-03-30 13:01:03
在 Chromium 上,这会为我弹出一个确认对话框。但是,如果 I return null,则不会。
2021-04-10 13:01:03

不,它不会在所有浏览器中触发。它在移动浏览器中不受支持,例如 Safari、Opera Mobile & mini、Dolphin。请参阅是否有其他方法可以在移动 Safari 中使用 onbeforeunload?

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会无效。
2021-03-13 13:01:03
是的,它确实。OP 询问“window.onbeforeunload() 是否在所有浏览器中触发?” 我的回答是“移动浏览器不支持它”。
2021-03-25 13:01:03
虽然我普遍同意,但在这种情况下,我的回答确实包括链接文章的基本部分(移动浏览器不支持),而且我正在链接到 SO,因此没有链接失效的危险。
2021-04-02 13:01:03

建立在 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>

将上面的模板粘贴到空文件中,然后对其进行编辑

我记得 IE 是唯一实现 IE 的浏览器onbeforeunload,但有些浏览器已经自行实现了它。

长话短说,IE 是唯一一个你会发现这个事件始终存在的浏览器(有非常有限的例外)。

@powtac:我相信它可以追溯到很久以前(尽管我记得在 IE8 中出现了这个事件的问题)。您还可以在找到时测试支持和绑定,并在不存在时默认。
2021-03-25 13:01:03
是的,我已经看到了这个页面,但是我没有看到任何关于 IE 版本支持的信息,或者我错过了什么?
2021-04-08 13:01:03
鉴于它是微软产品,MSDN将是一个很好的起点。
2021-04-10 13:01:03

然后你可以像这样使用两者:

<body onunload="functionName();" onbeforeunload='functionName();' >
但是支持这两个事件的浏览器会执行两次。
2021-03-17 13:01:03
一个带有 var 来检查它是否已经被触发的函数在这里就可以了。
2021-03-23 13:01:03
@pimvdb ..然后使用一个标志..如果它为真,则执行函数,一旦执行,则将其设为假。
2021-03-30 13:01:03
这个答案太粗糙了。需要解释,因为它不是很有帮助。
2021-03-30 13:01:03