Element.closest()
its support
Реализация такой функции с Element.matches(), кажется, не является оптимальным с точки зрения производительности, по-видимому, причиной матчей() сделает вызов querySelectorAll() каждый раз, когда вы проверьте родителя, а для задания достаточно одного вызова.
Вот полипол для ближайшего() на MDN. Обратите внимание на один вызов querySelectorAll()
if (window.Element && !Element.prototype.closest) {
Element.prototype.closest =
function(s) {
var matches = (this.document || this.ownerDocument).querySelectorAll(s),
i,
el = this;
do {
i = matches.length;
while (--i >= 0 && matches.item(i) !== el) {};
} while ((i < 0) && (el = el.parentElement));
return el;
};
}
Но имейте в виду, что функция, выполняемая, как это не будет работать должным образом на незакрепленной дерева (отдельно от корня document.documentElement)
//Element.prototype.closestTest = function(s){...as seen above...};
var detachedRoot = document.createElement("footer");
var child = detachedRoot.appendChild(document.createElement("div"));
detachedRoot.parentElement; //null
child.closestTest("footer"); //null
document.documentElement.append(detachedRoot);
child.closestTest("footer"); //<footer>
Хотя ближе всего() который реализован в Firefox 51.0.1, кажется, отлично работает с отдельным деревом
document.documentElement.removeChild(detachedRoot);
child.closestTest("footer"); //null
child.closest("footer"); //<footer>
Это «должно быть проще», только если все браузеры реализуют метод - их нет.:-(Так что метод longhand должен быть написан так или иначе, я думаю, с обнаружением функции для вилки 'macthes'. Это было бы не сложно, но, вероятно, немного медленнее. – RobG
Да, [у модернизатора есть пример] (http: /modernizr.com/docs/#prefixeddom) отпадает назад к поставщику с префиксом 'matchesSelector'. – hurrymaplelad