不使用 jQuery 选择所有具有“data-xxx”属性的元素

IT技术 javascript html dom
2021-01-17 12:02:56

仅使用纯 JavaScript,选择具有特定data-属性(假设data-foo)的所有 DOM 元素的最有效方法是什么

元素可能不同,例如:

<p data-foo="0"></p><br/><h6 data-foo="1"></h6>
6个回答

您可以使用querySelectorAll

document.querySelectorAll('[data-foo]');
很好,谢谢!半相关说明:如果要选择名称中带有冒号的属性,则需要像这样对冒号进行转义(至少在 Chrome 中):querySelectorAll('[attribute\\:name]')(请参阅:代码.google.com/p/chromium/issues/detail?id=91637 )
2021-03-20 12:02:56
这实际上并没有回答问题的标题。我不想选择“data-foo”。我想在“data-foobar”、“data-bar”、“data-name-i-dont-know”中选择“data-*”
2021-03-30 12:02:56
@gman此编辑无意中更改了原始标题的意图我现在已经恢复了。
2021-03-31 12:02:56
document.querySelectorAll("[data-foo]")

将为您提供具有该属性的所有元素。

document.querySelectorAll("[data-foo='1']")

只会得到值为 1 的值。

你如何为你得到的元素设置值?
2021-03-27 12:02:56
@StevenAguilar.querySelectorAll()返回一个NodeList. 正如该文档中所述,您可以使用.forEach(). 请注意,这是一个非 IE 解决方案:developer.mozilla.org/en-US/docs/Web/API/...如果您需要支持 IE,则必须使用常规for循环遍历NodeList
2021-03-31 12:02:56
document.querySelectorAll('data-foo')

获取具有属性 data-foo 的所有元素的列表

如果您想获取具有特定值的数据属性的元素,例如

<div data-foo="1"></div>
<div data-foo="2" ></div>

我想将 div 的 data-foo 设置为“2”

document.querySelector('[data-foo="2"]')

但是,如果我想将数据属性值与某个变量的值相匹配,就像我想获取元素一样,如果 data-foo 属性设置为 i

var i=2;

因此您可以使用模板文字动态选择具有特定数据元素的元素

document.querySelector(`[data-foo="${i}"]`)

请注意,即使您不在字符串中写入值,它也会像我写的那样转换为字符串

<div data-foo=1></div>

然后在 Chrome 开发者工具中检查元素,元素将如下所示

<div data-foo="1"></div>

您也可以通过在控制台中编写以下代码来交叉验证

console.log(typeof document.querySelector(`[data-foo]="${i}"`).dataset('dataFoo'))

为什么我写了 'dataFoo' 虽然属性是 data-foo 原因数据集属性被转换为camelCase 属性

我参考了以下链接

https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/data-* https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes

这是我在 stackoverflow 上的第一个答案,请让我知道如何改进我的答案写作方式。

试试→这里

    <!DOCTYPE html>
    <html>
        <head></head>
        <body>
            <p data-foo="0"></p>
            <h6 data-foo="1"></h6>
            <script>
                var a = document.querySelectorAll('[data-foo]');

                for (var i in a) if (a.hasOwnProperty(i)) {
                    alert(a[i].getAttribute('data-foo'));
                }
            </script>
        </body>
    </html>
使用 hasOwnProperty 是 2016 年到目前为止对我来说最好的答案,这对于其他迭代方式来说非常快 Mdn hasOwnProperty
2021-03-20 12:02:56
querySelectorAll() 中的 NodeList 是可迭代的(虽然不是数组)。循环for in将遍历长度和项目属性。相反,用于for of迭代旨在迭代的属性
2021-04-06 12:02:56

是一个有趣的解决方案:它使用浏览器的 CSS 引擎向与选择器匹配的元素添加一个虚拟属性,然后评估计算出的样式以找到匹配的元素:

它确实动态地创建了一个样式规则 [...] 然后它扫描整个文档(使用非常受谴责和 IE 特定但非常快的 document.all)并获取每个元素的计算样式。然后我们在结果对象上查找 foo 属性并检查它是否评估为“bar”。对于匹配的每个元素,我们添加到一个数组中。

对了,我删除了有关旧浏览器的提示。
2021-03-16 12:02:56
是的,很容易错过标签。因为它是 html5,所以我们都建议使用 document.querySelectorAll(并且 data-* 属性也是 html5 特定的)。
2021-03-20 12:02:56