Element.closest()
its support
は)パフォーマンスの面で最適ではないようで、原因が明らかに(一致する)querySelectorAll(への呼び出しを行います)たびに親をテストし、ジョブに対して1回の呼び出しで十分です。
MDNのclosest()のpolyfillは次のとおりです。 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;
};
}
への単一の呼び出しに注意してくださいしかし、アタッチされていない木の上で正しく動作しません。このように実現される機能を心に留め)(
//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>
最も近いものの(はdocument.firstChildルートから外します) Firefox 51.0.1に実装されているのは、分離したツリーでうまく動作しているようです。
document.documentElement.removeChild(detachedRoot);
child.closestTest("footer"); //null
child.closest("footer"); //<footer>
すべてのブラウザがこの方法を実装している場合のみ、「簡単に」できます。:-(これはとにかく書かれていなければなりません、私は 'macthes'フォークのための機能の検出と思います。それは難しくはありませんが、少し遅いでしょう – RobG
ええ、[近代化の例があります] /modernizr.com/docs/#prefixeddom)のベンダー接頭辞 'matchesSelector'に戻っています。 – hurrymaplelad