如何通过与数据属性数组进行比较来查找HTML中的多个元素?

How to find multiple elements in HTML by comparison to an array of data attributes?

提问人:Anna FLYTE 提问时间:10/4/2023 最后编辑:Anna FLYTE 更新时间:10/4/2023 访问量:40

问:

给定 HTML:

<div class="element" data-name="cat">
<div class="element" data-name="bird">
<div class="element" data-name="dog">

我只想找到与我保存在这样的数组中的数据属性匹配的元素

let Array1 = ["dog","cat","lizard"]

我以为我可以用querySelectorAll和数据属性过滤器来做到这一点,但它根本不起作用。返回一个空的节点列表。

let Elements = document.body.querySelectorAll('.element[data-name="${Array1}"]')

我正在研究一个正在查看网页的 firefox 扩展程序,所以我无法触摸 HTML,宁愿留在纯 javascript 中。我对编程很陌生,这是一个个人项目。

javascript 数组 firefox-addon 元素 queryselector

评论

0赞 ITDW 10/4/2023
你不能把一个数组放在一个css选择器中,你将不得不遍历数组,或者用多个选择器做一些聪明的reduce技巧

答:

1赞 nfv 10/4/2023 #1

不幸的是,没有捷径可走。我建议遍历您的可能值数组。由于 querySelectorAll 返回 ,您需要使用扩展语法 () 将其扩展到捕获的元素数组中。NodeList...

const className = 'element',
    attribute = 'data-name',
    attribute_values = ['cat', 'bird', 'dog'],
    elements = [];
for (let value of attribute_values) {
    elements.push(...document.querySelectorAll('.' + className + '[' + attribute + '=' + value + ']'));
}

评论

1赞 Anna FLYTE 10/4/2023
我现在明白了,我让它起作用了。非常感谢
0赞 nfv 10/4/2023
感谢您的更新,@AnnaFLYTE。如果此答案对您有帮助,请将其标记为正确答案,以便认为此问题已解决。
1赞 JW Yap 10/4/2023 #2

解释

没有直接的方法可以做到这一点,因为 querySelector 被设计为仅基于单个 css/属性选择器选择元素。但是,我们可以通过多次重复查询来实现这一点。

法典

// Method 1: Loop through all the elements with attributes ['data-name']
// Then, apply filter to search for particular attribute value
const elementsWithAttrDataName = document.querySelectorAll('[data-name]');
const results = Array.from(elementsWithAttrDataName).filter(ele => {
  return ele.getAttribute('data-name') === 'cat' || ele.getAttribute('data-name') === 'dog';
});
console.log(results.length);


// Method 2: Loop through all the keys you want to search for
var elements = [];
let keys = ["cat", "dog"];
keys.forEach(function(key){
    elements.push(document.querySelectorAll('[data-name="'+key+'"]'));
});

console.log(elements.length);