2015-09-12 2 views
2

Я запутался с «Event Listener», «Event Handler», «Event Bubbling» и «Event Capturing» в JavaScript.Обработчики событий и прослушиватели и события Bubbling и Event Capturing

У меня есть поиск в Интернете и просмотрели другой сайт, но у меня все еще есть проблема с пониманием некоторых различий и даже основного состояния.

Как указывает this article, обработчик событий создается и слушает событие.

  • Означает ли это, что функции JavaScript, прикрепленные к элементам внутри DOM, не являются обработчиком событий, и они являются прослушивателями событий?

Кроме того, here Я нашел различия между «пузырьками событий» и «захватом событий». Кроме того, я прочитал некоторое время назад, что в dojo все события захватываются тегом <body>.

  • Означает ли это, что к остальным элементам внутри DOM нет JavaScript, прикрепленных к остальным элементам?

  • Точнее, это правда, что если событие будет обрабатываться родителем через «Событие Bubbling», нет необходимости добавлять слушателя к детям?

Каково точное определение этих терминов? Обработчики

+0

Насколько я знаю, обработчик события привязан один раз к элементу в dom, а прослушиватель событий запускается независимо от того, был ли загружен контент dom после того, как слушатель был связан – kurt

ответ

7

События/Слушатели событий

Там нет никакой разницы между прослушивателем событий и обработчиком событий - для всех практических целей, они то же самое. Но, это может помочь думать о них иначе:

можно определить один «обработчик» ...

function myHandler(e){ alert('Event handled'); } 

... и прикрепить его к нескольким элементам с помощью «addEventListener»:

elementA.addEventListener('click', myHandler); 
elementB.addEventListener('click', myHandler, true); 

Или, я могу определить мой "обработчик" как замыкание в 'addEventListener':

elementC.addEventListener('click', function(e){ alert('Event Handled'); }); 

Захват событий/событие Bubbling

Вы можете думать о захвате события как о противоположном событию Bubbling - или как о двух половинах жизненного цикла события. Элементы DOM могут быть вложены (конечно). Первое событие CAPTURES от самого внешнего родителя до самого внутреннего ребенка, а затем BUBBLES от самого внутреннего ребенка до самого внешнего родителя.

Возможно, вы заметили, что в моем примере выше слушатель, прикрепленный к элементу B, имеет дополнительный параметр - true - который не передается элементу A.Это говорит слушателю ответить на событие на фазе CAPTURE, тогда как по умолчанию будет отвечать на фазу BUBBLE. Попробуйте это на jsfiddle.net:

Скажем, у нас есть 3 вложенных DIV элементы:

<div id="one"> 
    1 
    <div id="two"> 
     2 
     <div id="three"> 
      3 
     </div> 
    </div> 
</div> 

... и мы придаем 'Клик' обработчик к каждому:

document.getElementById('one').addEventListener('click', function(){ alert('ONE'); }); 
document.getElementById('two').addEventListener('click', function(){ alert('TWO'); }, true); 
document.getElementById('three').addEventListener('click', function(){ alert('THREE') }); 

Если нажать '1', вы увидите окно с текстом «ONE».

Если нажать кнопку «2», вы увидите окно предупреждения «два», а затем встревоженное поле «ONE» (потому что «два» выстрелил первые во время ЗАХВАТА ФАЗЫ и «один» является открыл огнь по дороге обратно в течение BUBBLE ФАЗЫ)

Если вы нажмете «3», вы увидите окно предупреждения «два» (ФИГУРИРУЮТ), а затем встревоженное полем «ТРИ» (BUBBLED), а затем поле предупреждения «ONE» (BUBBLED).

Очистить как грязь, не так ли?

+0

Вы имеете в виду всякий раз, когда я нажимаю на любой элемент, который я вызываю обработчик, привязанный ко всем своим предкам в фазе пузырьков? Я имею в виду, когда этот пузырь будет остановлен? В вашем примере он будет вызывать весь обработчик до тех пор, пока он не достигнет родителя, к которому нет ничего привязанного или пока он не достигнет тела? – Suo6613

+1

Да, снятый флажок, он будет пузыриться до , активируя каждого родителя, который прослушивает событие ... если вы специально не остановите его. Вы можете добавить вызов «stopPropogation» к вашему обработчику, чтобы остановить событие, пузырящееся после того, как вы подействовали на него, если вы этого не хотите. – Ragdata

+0

Спасибо. Просто чтобы подтвердить! поэтому в вашем примере, если не было обработчика, прикрепленного к div # 2, когда я нажал на div # 3, я увижу окно предупреждения «ОДИН», а затем «ТРИ», поскольку пузырьки передаются родительскому объекту без привязки к нему обработчика и вы также не остановили пузырь. Правильно? – Suo6613

Смежные вопросы