Кратко
СкопированоМетод Element ищет и возвращает ближайший (начиная с самого элемента) родительский элемент, соответствующий указанному CSS-селектору. Если ни один элемент не соответствует указанному CSS-селектору, возвращается null.
Пример
СкопированоДля элемента <div id найдём ближайшие родительские элементы, соответствующие селекторам ' и 'div:
<article class="container common"> <header class="container-header container"> <div id="25" class="common"> <span class="title">Заголовок</span> </div> </header></article>
<article class="container common">
<header class="container-header container">
<div id="25" class="common">
<span class="title">Заголовок</span>
</div>
</header>
</article>
const element = document.querySelector('#25')const closestElement1 = element.closest('.container')const closestElement2 = element.closest('div.common')console.log(closestElement1)// <header class="container-header container">console.log(closestElement2)// <div id="25" class="common">
const element = document.querySelector('#25')
const closestElement1 = element.closest('.container')
const closestElement2 = element.closest('div.common')
console.log(closestElement1)
// <header class="container-header container">
console.log(closestElement2)
// <div id="25" class="common">
Как пишется
СкопированоElement принимает в качестве аргумента строку с искомым CSS-селектором.
Если строка не является валидным CSS-селектором, произойдёт ошибка «'SyntaxError' DOMException».
Element возвращает Element, соответствующий указанному CSS-селектору, или null, если искомый элемент не был найден.
Как понять
СкопированоМетод Element позволяет искать в DOM ближайший подходящий элемент среди родительских, начиная от элемента для которого метод был вызван.
Типичный пример использования Element — определение области действия при клике. Допустим, у нас есть множество кнопок, находящихся во вложенных контейнерах. Необходимо найти ближайший к нажатой кнопке контейнер.
<div class="container main-container"> <button id="1" class="button">Кнопка 1</button> <div class="container parent-container"> <button id="2" class="button"> <span class="button-content">Кнопка 2</span> </button> <div class="container child-container"> <button id="3" class="button">Кнопка 3</button> </div> </div></div>
<div class="container main-container">
<button id="1" class="button">Кнопка 1</button>
<div class="container parent-container">
<button id="2" class="button">
<span class="button-content">Кнопка 2</span>
</button>
<div class="container child-container">
<button id="3" class="button">Кнопка 3</button>
</div>
</div>
</div>
Для решения задачи достаточно добавить только один обработчик события click:
const mainContainer = document.querySelector('.main-container')mainContainer.addEventListener('click', function (e) { // Элемент, на котором был выполнен клик const targetElem = e.target // Определяем был ли выполнен клик // на одной из кнопок или внутри её const buttonElem = targetElem.closest('.button') // Если клик был выполнен вне кнопки, buttonElem === null if (buttonElem === null) { // Если клик выполнен не на кнопке, ничего не делаем e.stopPropagation() return } const containerElem = targetElem.closest('.container') // Выводим в консоль контейнер, содержащий нажатую кнопку console.log(containerElem)})
const mainContainer = document.querySelector('.main-container')
mainContainer.addEventListener('click', function (e) {
// Элемент, на котором был выполнен клик
const targetElem = e.target
// Определяем был ли выполнен клик
// на одной из кнопок или внутри её
const buttonElem = targetElem.closest('.button')
// Если клик был выполнен вне кнопки, buttonElem === null
if (buttonElem === null) {
// Если клик выполнен не на кнопке, ничего не делаем
e.stopPropagation()
return
}
const containerElem = targetElem.closest('.container')
// Выводим в консоль контейнер, содержащий нажатую кнопку
console.log(containerElem)
})