MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/MDN-dev-survey

Это экспериментальная технология
Так как спецификация этой технологии ещё не стабилизировалась, смотрите таблицу совместимости по поводу использования в различных браузерах. Также заметьте, что синтаксис и поведение экспериментальной технологии может измениться в будущих версиях браузеров, вслед за изменениями спецификации.

Метод Element.closest() возвращает ближайший родительский элемент (или сам элемент), который соответствует заданному CSS-селектору или null, если таковых элементов вообще нет.

Синтаксис

var elt = element.closest(selectors); 
  • selectorsстрока, а точнее DOMString, содержащая CSS-селектор, к примеру: "#id", ".class", "div"...
  • Результат - элемент DOM (Element), либо null.

Исключения

SYNTAX_ERR
Указаный css-селектор не является допустимым ("/=21=1", "&@*#", "%'54523" и т.п приведут к ошибке).

Пример

<div id="block" title="Я - блок">
    <a href="#">Я ссылка в никуда</a>
    <a href="http://site.ru">Я ссылка на сайт</a>
    <div>
       <div id="too"></div>
    </div>
</div>

Думаю, стоит рассмотреть несколько примеров:

var div = document.querySelector("#too"); //Это элемент от которого мы начнем поиск

div.closest("#block"); //Результат - самый первый блок древа выше
div.closest("div"); //Сам блок #too и будет результатом, так как он подходит под селектор "div"
div.closest("a"); //null - В предках #too нет не одного тега "a"!
div.closest("div[title]") //#block - так как ближе нет блоков с атрибутом title.

 

Полифилл #1 (рекурсивный метод)

(function(ELEMENT) {
    ELEMENT.matches = ELEMENT.matches || ELEMENT.mozMatchesSelector || ELEMENT.msMatchesSelector || ELEMENT.oMatchesSelector || ELEMENT.webkitMatchesSelector;
    ELEMENT.closest = ELEMENT.closest || function closest(selector) {
        if (!this) return null;
        if (this.matches(selector)) return this;
        if (!this.parentElement) {return null}
        else return this.parentElement.closest(selector)
      };
}(Element.prototype));


Полифилл #2 (через цикл)

(function(e){ 
 e.closest = e.closest || function(css){ 
   var node = this;
  
   while (node) { 
      if (node.matches(css)) return node; 
      else node = node.parentElement; 
   } 
   return null; 
 } 
})(Element.prototype);

Спецификация

Specification Status Comment
DOM
Определение 'Element.closest()' в этой спецификации.
Живой стандарт Initial definition.

Поддержка браузерами

Особенность Chrome Firefox (Gecko) Internet Explorer Opera Safari
Базовая поддержка 41 35.0 (35.0) Нет 28 Нет
Особенность Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Базовая поддержка ? 35.0 (35.0) Нет ? Нет

Метки документа и участники

Метки: 
 Внесли вклад в эту страницу: akaguny, AlexOvchinkin, SeanSilke, vittorio-tortugo, In4in
 Обновлялась последний раз: akaguny,