Element.closest()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since апÑÐµÐ»Ñ 2017 г..
ÐеÑод Element.closest() возвÑаÑÐ°ÐµÑ Ð±Ð»Ð¸Ð¶Ð°Ð¹Ñий ÑодиÑелÑÑкий ÑÐ»ÐµÐ¼ÐµÐ½Ñ (или Ñам ÑлеменÑ), коÑоÑÑй ÑооÑвеÑÑÑвÑÐµÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ CSS-ÑелекÑоÑÑ Ð¸Ð»Ð¸ null, еÑли ÑаковÑÑ
ÑлеменÑов вообÑе неÑ.
СинÑакÑиÑ
var elt = element.closest(selectors);
ÐÑклÑÑениÑ
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 (ÑекÑÑÑивнÑй меÑод)
ÐÐ»Ñ Ð±ÑаÑзеÑов не поддеÑживаÑÑÐ¸Ñ Element.closest(), но позволÑÑÑÐ¸Ñ Ð¸ÑполÑзоваÑÑ element.matches() (или пÑеÑикÑнÑй ÑквиваленÑ) еÑÑÑ Ð¿Ð¾Ð»Ð¸Ñил:
(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 (ÑеÑез Ñикл)
Тем не менее, еÑли вам ÑÑебÑеÑÑÑ Ð¿Ð¾Ð´Ð´ÐµÑжка IE 8, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ ÑледÑÑÑий полиÑил. ÐмейÑе Ð²Ð²Ð¸Ð´Ñ - ÑÑÐ¾Ñ ÑпоÑоб позволÑÐµÑ Ð¸ÑполÑзоваÑÑ CSS ÑелекÑоÑÑ ÑолÑко ÑÑÐ¾Ð²Ð½Ñ 2.1 и Ð¼Ð¾Ð¶ÐµÑ Ð¶ÑÑко ÑоÑмозиÑÑ.
(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 |
|---|
| DOM > # ref-for-dom-element-closestâ > |
СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами
СмоÑÑиÑе Ñакже
- ÐнÑеÑÑейÑ
Element. - СинÑакÑÐ¸Ñ ÑелекÑоÑов
- ÐÑÑгие меÑодÑ, пÑинимаÑÑие ÑелекÑоÑÑ:
element.querySelector()иelement.matches().