我需要获取 DOM 元素中的所有 DOM 元素
myRootElement
,满足以下条件:
div
或 blockquote
)foo
或 bar
)如果只是条件1,我知道我可以写:
let elementsWithRightName = myRootElement.querySelectorAll("div, blockquote");
然后我可以过滤结果,如下所示:
let isOfNiceClass = (elem) => ["foo", "bar"].includes(elem.className);
let elementsOfInterest = [...elementsWithRightName].filter(isOfNiceClass);
但是有没有更好/最优雅/惯用的方法来应用这两个过滤器?
.matches()
:
classNames.some(c => elem.matches(`.${c}`))
或者,用新的
:is()
:
const tagNames = ['div', 'blockquote'];
const classNames = ['foo', 'bar', 'baz'];
const selector = `:is(${tagNames.join(', ')}):is(${classNames.map(c => '.' + c).join(', ')})`;
// ':is(div, blockquote):is(.foo, .bar, .baz)'
对于更复杂的情况,这取决于情况。然而,我想说 CSS 选择器可能是搜索元素最有效的方法:浏览器会在幕后优化它们,所以我们不必这样做。不过我不确定 XPath。