Несколько onbeforeunload () и onunload () события
-
26-09-2019 - |
Вопрос
У меня есть странная проблема от клиента в том, что наш код, который они включают в себя использование onbeforeunload () для запуска диалогового окна, но они также включают в себя другие коду компании, которые также связывают этот обработчик событий.
Можно ли оба выполнять одновременно?
Я читал это, http://oreilly.com/catalog/9780596101992. «JavaScript: окончательный гид, пятое издание», чтобы попытаться лучше понять, что происходит в интерналах браузеров и стек JavaScript, но оно доказывает довольно разум.
Из читания книги я понимаю, что некоторые события могут быть выполнены все в то же время, если они прикреплены с помощью API-addeventListenlistenlistener (), но заказ будет добраться до браузера. Однако нет упоминания о событии Onbeforeunload (). Просто нагрузка ().
Что приводит меня ко второй части вопроса. Если событие запущено в onbeforeunload () Я прав, думая, что если он не возвращается правда, onunload () никогда не будет вызвана?
Если кто-то может пролить свет на него, или подключите меня с хорошим учебным пособием / руководством по либо имеющим несколько обработчиков событий, назначенные одному и тому же событию, либо, в частности, на этих двух событиях, которые были бы ACE.
Спасибо
Решение
Можно ли оба выполнять одновременно?
Нет буквально В то же время нет - JavaScript в браузерах (в настоящее время) однопоточная. Так что могут быть несколько обработчиков для onbeforeunload
Событие, но они будут называться серийно, не одновременно. По крайней мере, в теории; На практике, похоже, только один из них называется (см. Ниже).
Если событие запущено в onbeforeunload () Я прав, думая, что если он не возвращается правда, onunload () никогда не будет вызвана?
Если кто-то onbeforeunload
Обработчик отменяет разгрузку, нет onunload
обработчик будет вызван. Вы отмените разгрузку, делая две вещи (потому что здесь браузеры отличаются здесь): сначала вы назначаете строку в returnValue
свойство event
Объект, а затем вы возвращаете эту строку из функции. Подробности здесь а также здесь. Отказ (Строка используется в качестве подсказки, позволяя пользователю решать, отменить ли выгрузка.)
Быстрый тест
Так много для теории, давайте посмотрим на то, что на самом деле происходит:
<!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, то есть и Firefox, я только вижу уведомление от одного из onbeforeunload
обработчики, даже когда я говорю, что все в порядке, чтобы идти вперед и уйти. Я ожидаю, что это, вероятно, потому, что иначе, в противном случае достаточно раздражающая страница может просто зарегистрировать кучу обработчиков и продолжать ногой пользователь, чтобы остаться на странице.
После (одного) вопроса, если я позволю навигации продолжить, я получаю оба сообщения разгрузки.