Почему после этой простой функции addEventListener используется значение false?

91

Для чего ложь в конце? Спасибо.

window.addEventListener('load', function() {
  alert("All done");
}, false);
0x499602D2
источник

Ответы:

11

Согласно MDN Web Docs , третий параметр:

useCapture
Если true, useCaptureуказывает на то, что пользователь хочет начать захват. После инициирования захвата все события указанного типа будут отправлены зарегистрированным пользователям, listenerпрежде чем будут отправлены в любой EventTargetобъект ниже в дереве DOM. События, которые поднимаются вверх по дереву, не запускают прослушиватель, назначенный для использования захвата. См. DOM Level 3 Events для подробного объяснения.

Лукас Джонс
источник
26
Я не так много знаю о javascript, поэтому у меня проблемы с получением этого ответа. Я вообще-то не знаю, что такое useCapture? Не могли бы вы рассказать мне что-нибудь об этом.
Ашока Мондал
1
@BikashChandraMondal ознакомьтесь с ответом ниже.
Libra
34
Пожалуйста, объясните, а не просто копировать / вставлять.
Damjan Pavlica
3
Что за бесполезный копипаст.
Себастьян Пальма
325

Я тоже проверил MDN, но до сих пор не понял, для чего useCaptureон нужен, поэтому этот ответ предназначен для тех, кто все еще не понимает его после проверки официальной документации.

Итак, во-первых, почти во всех браузерах происходит следующее:

Во всех браузерах, кроме IE <9, есть два этапа обработки событий.

Событие сначала идет вниз - это называется захват , а затем всплывает вверх . Такое поведение стандартизировано в спецификации W3C.

Это означает, что независимо от того, что вы установили useCapture, эти две фазы событий существуют всегда.

На этой картинке показано, как это работает.

введите описание изображения здесь

Согласно этой модели событие:

Захваты вниз - через 1 -> 2 -> 3.

Пузыри вверх - через 3 -> 2 -> 1.

Тогда возникает ваш вопрос. Третий вызываемый параметр useCaptureуказывает, на какой из двух фаз вы хотите, чтобы ваш обработчик обработал событие.

useCapture = true

Обработчик устанавливается на фазе захвата. События попадут в него раньше, чем в его дочерние элементы.

useCapture = false.

Обработчик настроен на фазу всплытия. События попадут в него после того, как попадут в его дети.

что означает, что если вы напишете такой код:

child.addEventListener("click", second);
parent.addEventListener("click", first, true);

при щелчке по дочернему элементу firstметод будет вызван раньше second.

По умолчанию для useCaptureфлага установлено значение false, что означает, что ваш обработчик будет вызываться только во время фазы восходящей цепочки событий .

Для получения подробной информации щелкните эту справочную ссылку и это .

Весы
источник
13
Очень красивый и исчерпывающий ответ. Я понимаю это намного лучше, чем сейчас.
0x499602D2
15
Очень хорошее объяснение. Человеческое прикосновение - вот в чем разница.
Рафаэль Эйнг
1
Я очень ценю это объяснение.
neilsimp1 08
1
Отличный ответ. Можете ли вы также объяснить, какой подход и когда следует использовать?
Рахул Арора
1
Это должен быть выбранный ответ. ОП, пожалуйста, сделайте это?
Саураб Тивари
6

@ Весов ответ очень хорош, просто есть люди вроде меня, которые лучше понимают взаимодействие кода с машиной.
Итак, следующий сценарий должен объяснять распространение события. На основе этой схемы описания я пытаюсь сделать следующее :
Следуя потоку событий вниз и вверх по следующей иерархии:

<window>
<document>
<body>
<section>
<div>
<paragraph>
<span>

Для простоты мы начнем с тела до обработчиков регистрации элемента span для фазы захвата и вернемся к обработчикам регистрации элемента body для фазы восходящей цепочки. Таким образом, результатом будет узел за узлом, направление, принятое событием от начала до конца. Нажмите "Показать консоль" на правой панели фрагмента, чтобы получить доступ к журналам.

    function handler(e){
        /* logs messages of each phase of the event flow associated with 
        the actual node where the flow was passing by */

        if ( e.eventPhase == Event.CAPTURING_PHASE ){
            console.log ("capturing phase :\n actual node : "+this.nodeName);
        }
        if ( e.eventPhase == Event.AT_TARGET){
            console.log( "at target phase :\n actual node : "+this.nodeName);
        }
        if ( e.eventPhase == Event.BUBBLING_PHASE){
            console.log ("bubbling phase :\n actual node : "+this.nodeName );
        }
    }

    /* The following array contains the elements between the target (span and you can
    click also on the paragraph) and its ancestors up to the BODY element, it can still
    go up to the "document" then the "window" element, for the sake of simplicity it is 
    chosen to stop here at the body element
    */

    arr=[document.body,document.getElementById("sectionID"),
    document.getElementById("DivId"),document.getElementById("PId"),
        document.getElementById("spanId")];

    /* Then trying to register handelers for both capturing and bubbling phases
    */
        function listener(node){
            node.addEventListener( ev, handler, bool )    
            /* ev :event (click), handler : logging the event associated with 
            the target, bool: capturing/bubbling phase */
        }
        ev="click";
        bool=true; // Capturing phase
        arr.forEach(listener);
        bool=false; // Bubbling phase
        /* Notice that both capturing and bubbling 
        include the at_target phase, that's why you'll get two `at_target` phases in
        the log */
        arr.forEach(listener);
        p {
            background: gray;
            color:white;
            padding: 10px;
            margin: 5px;
            border: thin solid black
        }
        span {
            background: white;
            color: black;
            padding: 2px;
            cursor: default;
        }
    <section ID="sectionID">
            <div  id="DivId">
                <p id="PId">
                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis <span id="spanId">CLICK ME </span> imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosq.
                </p>
            </div>
    </section>

Обратите внимание, что такие события, как фокус, не всплывают, поэтому кажется, что большинство событий всплывают.

user10089632
источник