Element.closest()
its support
Die Umsetzung einer solchen Funktion mit Element.matches() scheint nicht optimal in Bezug auf Leistung, führen offenbar übereinstimmt() wird jedes Mal, wenn Sie einen Anruf zu querySelectorAll() machen Testen Sie einen Elternteil, während nur ein Anruf für den Job ausreicht.
Hier ist ein Polyfill für engsten() auf MDN. Hinweis einen einzigen Anruf zu 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;
};
}
Aber beachten Sie, dass wie diese implementierte Funktion nicht richtig auf nicht befestigten Baum arbeiten (losgelöst von document.documentElement root)
//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>
Obwohl am nächsten() das ist in Firefox 51.0.1 implementiert scheint gut mit freistehenden Baum
document.documentElement.removeChild(detachedRoot);
child.closestTest("footer"); //null
child.closest("footer"); //<footer>
Es funktioniert "sollte einfacher sein" nur, wenn alle Browser implementieren die Methode-sie nicht.:-(Also eine Longhand-Methode muss sowieso geschrieben werden, ich denke mit Feature-Erkennung für eine Gabel "macthes". Es wäre nicht schwer, aber wahrscheinlich ein wenig langsam. – RobG
Ja, [modernisierer hat ein Beispiel] (http://modernizr.com/docs/#prefixeddom) des Zurückfallens auf den Hersteller 'matchesSelector' – hurrymaplelad