Используя «делегирование событий» (установив обработчик событий для элемента, находящегося высоко в дереве DOM, и позволяя событиям из нижних элементов дерева всплывать и быть захваченными), мы можем настроить простоодин обработчик события на уровне body
, а затем мы можем проверить фактический источник всплывающего события по коллекции элементов, соответствующих вашим критериям.
См. встроенные комментарии для получения дополнительной информации:
// Set the event listener at the <body> and wait for other
// events to bubble up to it.
document.body.addEventListener("click", function(evt){
// Get an array of all the <a> elements that are descendants of <div> elements
let matches = Array.prototype.slice.call(document.querySelectorAll("div a"));
// Test to see if array contains the one that was clicked
if(matches.includes(evt.target)){
console.log("You clicked an <a> that is a descendant of a <div>!");
}
});
<div>
<section>
<a>first</a>
<a>second</a>
</section>
</div>
<section>
<a>third</a>
<a>fourth</a>
</section>
<section>
<div>
<a>fifth</a>
<a>sixth</a>
</div>
</section>