closest: поиск родителя
element.closest(selector)поднимается по DOM-дереву вверх от самого элемента и возвращает ближайшего предка (или сам элемент), соответствующего CSS-селектору, либоnullесли такого нет.
Зачем нужно
closest незаменим при делегировании событий: щелчок происходит на дочернем элементе, а логику нужно привязать к родительскому контейнеру. Метод заменяет ручной обход parentElement в цикле и делает код чистым и декларативным.
Где используется
- Делегирование событий: нашли кликнутый элемент → поднялись до нужного контейнера
- Проверка, находится ли элемент внутри определённого компонента
- Закрытие модальных окон и дропдаунов при клике вне них
Синтаксис
const ancestor = element.closest(cssSelector);
// Возвращает Element или null
Примеры
Делегирование событий на список
const list = document.querySelector('.todo-list');
list.addEventListener('click', (event) => {
// Найти ближайший .todo-item начиная с target
const item = event.target.closest('.todo-item');
if (!item) return; // клик был не на элементе списка
// Определить, по какой кнопке кликнули
if (event.target.closest('.btn-delete')) {
item.remove();
} else if (event.target.closest('.btn-complete')) {
item.classList.toggle('completed');
}
});
Закрытие дропдауна при клике вне
document.addEventListener('click', (event) => {
const dropdown = document.querySelector('.dropdown');
// Если клик был не внутри дропдауна — закрыть
if (!event.target.closest('.dropdown')) {
dropdown.classList.remove('open');
}
});
Проверка контекста элемента
function handleInput(event) {
const form = event.target.closest('form');
if (!form) return;
const formId = form.id;
console.log(`Ввод в форме: ${formId}`);
}
document.addEventListener('input', handleInput);
Подъём до нужного уровня
const btn = document.querySelector('.card__btn');
// Найти карточку, содержащую кнопку
const card = btn.closest('.card');
const section = btn.closest('section');
console.log(card); // .card элемент
console.log(section); // ближайший <section>
Частые ошибки
- Не проверять результат на
null— если ни один предок не подходит, метод вернётnull; обращение к свойствамnullвызовет ошибку. - Путать с
querySelector—querySelectorищет вниз по дереву,closest— вверх. - Использовать для поиска дочернего элемента — для этого подойдёт
querySelector;closestработает только вверх.
Связанные темы
- _MOC DOM
- _MOC JavaScript
- parentElement, children, siblings
- firstChild, lastChild, nextSibling
- preventDefault и stopPropagation