Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top