Marat Tanalinのソリューションは問題ありませんが、の標準構文elem.matchesSelector
はelem.matches
次
function getAncestorBySelector(elem, selector) {
if (!elem.matches(selector + ' ' + elem.tagName)) {
// If element is not inside needed element, returning immediately.
return null;
}
// Loop for finding an ancestor element that matches your selector.
}
残念ながら、まだすべてのブラウザがこの構文をサポートしているわけではありません。いくつかのブラウザはまだプレフィックスバージョンを実装しており、OperaMinielem.matchesSelector
はこの機能をまったくサポートしていません。
この問題を軽減するために、MDNによって提案されているように、説明されているアプローチを次のポリフィルと組み合わせることができます。
if (!Element.prototype.matches) {
Element.prototype.matches =
Element.prototype.matchesSelector ||
Element.prototype.mozMatchesSelector ||
Element.prototype.msMatchesSelector ||
Element.prototype.oMatchesSelector ||
Element.prototype.webkitMatchesSelector ||
function(s) {
var matches = (this.document || this.ownerDocument).querySelectorAll(s),
i = matches.length;
while (--i >= 0 && matches.item(i) !== this) {}
return i > -1;
};
}
または、完全に破棄することを検討してelem.matchesSelector
、次のようなものを使用することもできます。
function getAncestorBySelector(elem, selector) {
if([].indexOf.call(document.querySelectorAll(selector + ' ' + elem.tagName), elem) === -1) {
// If element is not inside needed element, returning immediately.
return null;
}
// Loop for finding an ancestor element that matches your selector.
}
どちらの実装でも、少なくとも、のサポートが必要ですquerySelectorAll
。これは、最新のすべてのブラウザでサポートされている機能です。
ブラウザのサポート:
