gpt4 book ai didi

javascript - 多个 onbeforeunload() 和 onunload() 事件

转载 作者:数据小太阳 更新时间:2023-10-29 06:03:52 33 4
gpt4 key购买 nike

我有一个来自客户的奇怪问题,他们包含的代码使用 onbeforeunload() 来触发对话框,但他们还包含另一个公司代码,该代码也绑定(bind)了此事件处理程序。

有没有可能两者同时执行?

我一直在读这个,http://oreilly.com/catalog/9780596101992 “JavaScript:权威指南,第五版”试图帮助更好地理解浏览器内部和 Javascript 堆栈中发生的事情,但事实证明它相当费脑筋。

我从书中了解到,如果使用 Level 2 API addEventListener() 附加某些事件,则它们可以同时执行,但顺序将取决于浏览器。但是没有提到 onbeforeunload() 事件。只是 onunload()

这让我想到了问题的第二部分。如果在 onbeforeunload() 中触发了一个事件,我认为除非它返回 true,否则永远不会调用 onunload() 是否正确?

如果有人可以阐明它,或者给我提供一个很好的教程/指南,或者将多个事件处理程序分配给同一个事件,或者专门针对这两个事件,那就太棒了。

最佳答案

Is it possible for both to execute at the same time?

不是同时字面上,不是 - 浏览器中的 Javascript(当前)是单线程的。因此 onbeforeunload 事件可以有多个处理程序,但它们将被连续调用,而不是同时调用。至少在理论上;实际上,看起来只有其中一个被调用(见下文)。

If an event is triggered in onbeforeunload() am I right in thinking that unless it returns true, the onunload() will never be called?

如果任何 onbeforeunload 处理程序取消卸载,则不会调用任何 onunload 处理程序。您可以通过做两件事来取消卸载(因为这里的浏览器不同):首先,您将一个字符串分配给 event 对象的 returnValue 属性,然后返回该字符串出功能。详情 herehere . (该字符串作为提示,让用户决定是否取消卸载。)

快速测试

理论说了这么多,让我们看看实际发生了什么:

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Test Page</title>
<style type='text/css'>
body {
font-family: sans-serif;
}
</style>
<script type='text/javascript'>
window.onload = pageInit;
function pageInit() {
hook(window, 'beforeunload', beforeUnload1);
hook(window, 'beforeunload', beforeUnload2);
hook(window, 'unload', unload1);
hook(window, 'unload', unload2);
}

function beforeUnload1(event) {
var s;

event = event || window.event;
s = "Message from beforeUnload1";
event.returnValue = s
return s;
}

function beforeUnload2(event) {
var s;

event = event || window.event;
s = "Message from beforeUnload2";
event.returnValue = s
return s;
}

function unload1(event) {
alert("Message from unload1");
}

function unload2(event) {
alert("Message from unload2");
}

var hook = (function() {
var d;

function hookViaAttachEvent(obj, eventName, handler) {
obj.attachEvent('on' + eventName, handler);
}
function hookViaAddEventListener(obj, eventName, handler) {
obj.addEventListener(eventName, handler, false);
}

d = document.createElement('span');
if (d.addEventListener) {
return hookViaAddEventListener;
}
else if (d.attachEvent) {
return hookViaAttachEvent;
}
throw "Neither attachEvent nor addEventListener found.";
})();
function hook(eventName, handler) {

}
</script>
</head>
<body></body>
</html>

在 Chrome、IE 和 Firefox 上,我只看到来自 onbeforeunload 处理程序之一的通知,即使我说可以继续并离开也是如此。我想这可能是因为否则,一个足够烦人的页面可能只是注册了一堆处理程序并不断地提醒用户留在页面上。

在(一个)问题之后,如果我允许继续导航,我会收到两条卸载消息。

关于javascript - 多个 onbeforeunload() 和 onunload() 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2819792/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com