选择所有带有“data-xxx”的元素不使用 jQuery 的属性
仅使用纯 JavaScript,选择具有特定 data-
属性(例如 data-foo
)的所有 DOM 元素的最有效方法是什么。
这些元素可能不同,例如:
<p data-foo="0"></p><br/><h6 data-foo="1"></h6>
Using only pure JavaScript, what is the most efficient way to select all DOM elements that have a certain data-
attribute (let's say data-foo
).
The elements may be different, for example:
<p data-foo="0"></p><br/><h6 data-foo="1"></h6>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
您可以使用 querySelectorAll:
You can use querySelectorAll:
将为您提供具有该属性的所有元素。
只会得到值为 1 的值。
will get you all elements with that attribute.
will only get you ones with a value of 1.
获取具有 data-foo 属性的所有元素的列表
如果您想获取具有某些特定值的 data 属性的元素,例如
,我想获取 data-foo 设置为“2”的 div
但这里出现了扭曲... 如果我想将 data attirubte 值与某个变量的值匹配怎么办? 例如,如果我想获取 data-foo 属性设置为 i 的元素,
那么您可以可以使用模板文字动态选择具有特定数据元素的元素
注意即使你没有在字符串中写入值,它会转换为字符串,就像我写入
然后检查 Chrome 开发人员工具中的元素一样,该元素将如下所示
你也可以通过在控制台中编写下面的代码来交叉验证
为什么我写了
'dataFoo'
虽然属性是 data-foo 原因数据集属性被转换为驼峰式属性我在下面引用了链接:
to get list of all elements having attribute data-foo
If you want to get element with data attribute which is having some specific value e.g
and I want to get div with data-foo set to "2"
But here comes the twist ... what if I want to match the data attirubte value with some variable's value? For example, if I want to get the elements where data-foo attribute is set to i
so you can dynamically select the element having specific data element using template literals
Note even if you don't write value in string it gets converted to string like if I write
and then inspect the element in Chrome developer tool the element will be shown as below
You can also cross verify by writing below code in console
why I have written
'dataFoo'
though the attribute is data-foo reason dataset properties are converted to camelCase propertiesI have referred below links:
尝试一下 → 此处
Try it → here
原生 JavaScript 的
querySelector
和querySelectorAll
方法可用于定位元素。如果您的数据集
值是变量,请使用模板字符串。Native JavaScript's
querySelector
andquerySelectorAll
methods can be used to target the element(s). Use a template string if yourdataset
value is a variable.这里是一个有趣的解决方案:它使用浏览器 CSS 引擎向与选择器匹配的元素添加虚拟属性,然后评估计算的样式以查找匹配的元素:
Here is an interesting solution: it uses the browsers CSS engine to to add a dummy property to elements matching the selector and then evaluates the computed style to find matched elements:
虽然不如
querySelectorAll
(有很多问题)那么漂亮,但这里有一个非常灵活的函数,可以递归 DOM,并且应该适用于大多数浏览器(新旧浏览器)。只要浏览器支持您的条件(即:数据属性),您就应该能够检索该元素。对于好奇的人:不要费心在 jsPerf 上测试它与 QSA。 Opera 11 等浏览器会缓存查询并扭曲结果。
代码:
然后,您可以使用以下代码启动它:
recurseDOM(document.body, {"1": 1});
以提高速度,或者只是recurseDOM(document.body);
code>包含您的规范的示例: http://jsbin.com/unajot/1/edit
示例不同规格:http://jsbin.com/unajot/2/edit
While not as pretty as
querySelectorAll
(which has a litany of issues), here's a very flexible function that recurses the DOM and should work in most browsers (old and new). As long as the browser supports your condition (ie: data attributes), you should be able to retrieve the element.To the curious: Don't bother testing this vs. QSA on jsPerf. Browsers like Opera 11 will cache the query and skew the results.
Code:
You can then initiate it with the following:
recurseDOM(document.body, {"1": 1});
for speed, or justrecurseDOM(document.body);
Example with your specification: http://jsbin.com/unajot/1/edit
Example with differing specification: http://jsbin.com/unajot/2/edit
不知道是谁给我打了 -1,但这是证据。
http://jsfiddle.net/D798K/2/
Not sure who dinged me with a -1, but here's the proof.
http://jsfiddle.net/D798K/2/