Свойство target интерфейса Event является ссылкой на объект, который был инициатором события. Он отличается от Event.currentTarget , если обработчик события вызывается во время всплытия (bubbling) или захвата события.
theTarget = event.target
Пример
Свойство event.target может быть использовано для реализации делегирования событий.
в этом контексте e.target.style.visibility = ‘hidden’; > // Назначим обработчик к списку // Он будет вызван когда кликнут на любой
ul.addEventListener(‘click’, hide, false);
Спецификации
Specification
DOM Standard # ref-for-dom-event-target③
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Found a content problem with this page?
Edit the page on GitHub.
Report the content issue.
View the source on GitHub.
This page was last modified on 6 янв. 2024 г. by MDN contributors.
Материал на этой странице устарел, поэтому скрыт из оглавления сайта.
Более новая информация по этой теме находится на странице https://learn.javascript.ru/bubbling-and-capturing.
Давайте сразу начнём с примера.
Этот обработчик для сработает, если вы кликните по вложенному тегу или :
Кликните на EM, сработает обработчик на DIV
Вам не кажется это странным? Почему же сработал обработчик на , если клик произошёл на ?
Всплытие
Основной принцип всплытия:
При наступлении события обработчики сначала срабатывают на самом вложенном элементе, затем на его родителе, затем выше и так далее, вверх по цепочке вложенности.
Например, есть 3 вложенных элемента FORM > DIV > P , с обработчиком на каждом:
body *
Всплытие гарантирует, что клик по внутреннему
вызовет обработчик onclick (если есть) сначала на самом
, затем на элементе далее на элементе , и так далее вверх по цепочке родителей до самого document .
Поэтому если в примере выше кликнуть на P , то последовательно выведутся alert : p → div → form .
Этот процесс называется всплытием, потому что события «всплывают» от внутреннего элемента вверх через родителей, подобно тому, как всплывает пузырёк воздуха в воде.
Всплывают почти все события.
Ключевое слово в этой фразе – «почти».
Например, событие focus не всплывает. В дальнейших главах мы будем детально знакомиться с различными событиями и увидим ещё примеры.
Целевой элемент event.target
На каком бы элементе мы ни поймали событие, всегда можно узнать, где конкретно оно произошло.
Самый глубокий элемент, который вызывает событие, называется «целевым» или «исходным» элементом и доступен как event.target .
Отличия от this (= event.currentTarget ):
event.target – это исходный элемент, на котором произошло событие, в процессе всплытия он неизменен.
this – это текущий элемент, до которого дошло всплытие, на нём сейчас выполняется обработчик.
Например, если стоит только один обработчик form.onclick , то он «поймает» все клики внутри формы. Где бы ни был клик внутри – он всплывёт до элемента , на котором сработает обработчик.
this ( =event.currentTarget ) всегда будет сама форма, так как обработчик сработал на ней.
event.target будет содержать ссылку на конкретный элемент внутри формы, самый вложенный, на котором произошёл клик.
Возможна и ситуация, когда event.target и this – один и тот же элемент, например если в форме нет других тегов и клик был на самом элементе .
Прекращение всплытия
Всплытие идёт прямо наверх. Обычно событие будет всплывать наверх и наверх, до элемента , а затем до document , а иногда даже до window , вызывая все обработчики на своём пути.
Но любой промежуточный обработчик может решить, что событие полностью обработано, и остановить всплытие.
Для остановки всплытия нужно вызвать метод event.stopPropagation() .
Например, здесь при клике на кнопку обработчик body.onclick не сработает:
event.stopImmediatePropagation()
Если у элемента есть несколько обработчиков на одно событие, то даже при прекращении всплытия все они будут выполнены.
То есть, stopPropagation препятствует продвижению события дальше, но на текущем элементе все обработчики отработают.
Для того, чтобы полностью остановить обработку, современные браузеры поддерживают метод event.stopImmediatePropagation() . Он не только предотвращает всплытие, но и останавливает обработку событий на текущем элементе.
Не прекращайте всплытие без необходимости!
Всплытие – это удобно. Не прекращайте его без явной нужды, очевидной и архитектурно прозрачной.
Зачастую прекращение всплытия создаёт свои подводные камни, которые потом приходится обходить.
Мы делаем меню. Оно обрабатывает клики на своих элементах и делает для них stopPropagation . Вроде бы, всё работает.
Позже мы решили отслеживать все клики в окне, для какой-то своей функциональности, к примеру, для статистики – где вообще у нас кликают люди. Например, Яндекс.Метрика так делает, если включить соответствующую опцию.
Над областью, где клики убиваются stopPropagation , статистика работать не будет! Получилась «мёртвая зона».
Проблема в том, что stopPropagation убивает всякую возможность отследить событие сверху, а это бывает нужно для реализации чего-нибудь «эдакого», что к меню отношения совсем не имеет.
Погружение
В современном стандарте, кроме «всплытия» событий, предусмотрено ещё и «погружение».
Оно гораздо менее востребовано, но иногда, очень редко, знание о нём может быть полезным.
Строго говоря, стандарт выделяет целых три стадии прохода события:
Событие сначала идёт сверху вниз. Эта стадия называется «стадия перехвата» (capturing stage).
Событие достигло целевого элемента. Это – «стадия цели» (target stage).
После этого событие начинает всплывать. Это – «стадия всплытия» (bubbling stage).
В стандарте DOM Events 3 это продемонстрировано так:
То есть, при клике на TD событие путешествует по цепочке родителей сначала вниз к элементу («погружается»), а потом наверх («всплывает»), по пути задействуя обработчики.
Ранее мы говорили только о всплытии, потому что другие стадии, как правило, не используются и проходят незаметно для нас.
Обработчики, добавленные через on. -свойство, ничего не знают о стадии перехвата, а начинают работать со всплытия.
Чтобы поймать событие на стадии перехвата, нужно использовать третий аргумент addEventListener :
Если аргумент true , то событие будет перехвачено по дороге вниз.
Если аргумент false , то событие будет поймано при всплытии.
Стадия цели, обозначенная на рисунке цифрой (2) , особо не обрабатывается, так как обработчики, назначаемые обоими этими способами, срабатывают также на целевом элементе.
Есть события, которые не всплывают, но которые можно перехватить
Бывают события, которые можно поймать только на стадии перехвата, а на стадии всплытия – нельзя…
Например, таково событие фокусировки на элементе onfocus. Конечно, это большая редкость, такое исключение существует по историческим причинам.
Примеры
В примере ниже на , ,
стоят те же обработчики, что и раньше, но на этот раз – на стадии погружения. Чтобы увидеть перехват в действии, кликните в нём на элементе
:
target js что это
target — это свойство объекта события (event), которое указывает на элемент, на котором произошло событие. В JavaScript, это может быть любой элемент на веб-странице, например, кнопка, ссылка, форма и т.д.
Часто target используется в обработчиках событий (event listener), чтобы определить, на каком элементе произошло событие, и выполнить соответствующие действия. Например, можно использовать target для изменения содержимого элемента или добавления/удаления классов CSS.
Пример использования target для добавления класса CSS:
Часто можно встретить использование метода .closest() в подобных обработчиках. Это нужно для того, получить нужный элемент (кнопку), вместо других элементов. Если внутри кнопки будет другой вложенный элемент (например, ), то клик на нем отразится в содержимом свойства target , вместо ожидаемого btn .