Несколько onbeforeunload () и onunload () события

У меня есть странная проблема от клиента в том нашем коде, который они включают использование onbeforeunload () для инициирования диалогового окна, но они также включают другой код компаний, который также связывает этот обработчик событий.

Для обоих действительно ли возможно выполниться одновременно?

Я читал это, http://oreilly.com/catalog/9780596101992 "JavaScript: Полное руководство, Пятый Выпуск", чтобы попытаться помочь лучше понять, что происходит во внутренностях браузеров и стопке JavaScript, но это доказывает вполне изгиб ума.

Я понимаю от чтения книги, что некоторые события могут быть выполнены все одновременно, если они присоединяются с помощью уровня 2 API addEventListener (), но порядок будет до браузера. Однако нет никакого упоминания о onbeforeunload () события. Просто onunload ().

Который приводит меня к второй части вопроса. Если событие инициировано в onbeforeunload (), действительно ли я прав в размышлении, что, если это не возвращает true, onunload () никогда не будут называть?

Если кто-либо может пролить некоторый свет на него или поднять трубку меня с хорошим учебным руководством/руководством или на имеющий несколько обработчиков событий, присвоенных тому же событию, или на конкретно на этих двух событиях, которые были бы первоклассными.

Спасибо

5
задан David Yell 12 May 2010 в 14:37
поделиться

1 ответ

Возможно ли выполнение обоих одновременно?

Не буквально одновременно, нет - Javascript в браузеры (в настоящее время) однопоточные.Таким образом, для события onbeforeunload может быть несколько обработчиков, но они будут вызываться последовательно, а не одновременно. По крайней мере теоретически; на практике похоже, что вызывается только один из них (см. ниже).

Если событие запускается в onbeforeunload (), правильно ли я думаю, что, если оно не вернет true, 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, IE и Firefox, я всегда вижу уведомление только от одного из обработчиков onbeforeunload , даже когда я говорю, что можно пойти дальше и уйти. Я полагаю, что это, вероятно, потому, что в противном случае достаточно раздражающая страница могла бы просто зарегистрировать кучу обработчиков и продолжать приставать к пользователю, чтобы он оставался на странице.

После (одного) вопроса, если я разрешаю продолжить навигацию, я получаю оба сообщения о выгрузке.

8
ответ дан 14 December 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: