![](/img/trans.png)
[英]How can I hide element with the data-xxx attribute in javascript?
[英]Select all elements with a "data-xxx" attribute without using jQuery
仅使用纯 JavaScript,什么是 select 具有特定data-
属性(假设data-foo
)的所有 DOM 元素的最有效方法。
元素可能不同,例如:
<p data-foo="0"></p><br/><h6 data-foo="1"></h6>
您可以使用querySelectorAll :
document.querySelectorAll('[data-foo]');
document.querySelectorAll("[data-foo]")
将为您提供具有该属性的所有元素。
document.querySelectorAll("[data-foo='1']")
只会得到值为 1 的值。
document.querySelectorAll('data-foo')
获取具有属性 data-foo 的所有元素的列表
如果您想获取具有某些特定值的数据属性的元素,例如
<div data-foo="1"></div>
<div data-foo="2" ></div>
我想将 data-foo 设置为“2”的 div
document.querySelector('[data-foo="2"]')
但是,如果我想将数据属性值与某个变量的值匹配,比如如果 data-foo 属性设置为 i,我想获取元素
var i=2;
因此您可以使用模板文字动态 select 具有特定数据元素的元素
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>
这是一个有趣的解决方案:它使用浏览器 CSS 引擎向匹配选择器的元素添加一个虚拟属性,然后评估计算的样式以找到匹配的元素:
它确实动态地创建了一个样式规则 [...] 然后扫描整个文档(使用大量 decried 和 IE 特定但非常快的 document.all)并获取每个元素的计算样式。 然后,我们在生成的 object 上查找 foo 属性,并检查其计算结果是否为“bar”。 对于每个匹配的元素,我们添加到一个数组中。
本机 JavaScript 的querySelector
和querySelectorAll
方法可用于定位元素。 如果您的dataset
值是变量,请使用模板字符串。
var str = "term"; var term = document.querySelectorAll(`[data-type=${str}]`); console.log(term[0].textContent); var details = document.querySelector('[data-type="details"]'); console.log(details.textContent);
<dl> <dt data-type="term">Thing</dt> <dd data-type="details">The most generic type.</dd> </dl>
var matches = new Array();
var allDom = document.getElementsByTagName("*");
for(var i =0; i < allDom.length; i++){
var d = allDom[i];
if(d["data-foo"] !== undefined) {
matches.push(d);
}
}
不知道是谁给我打了-1,但这是证据。
虽然不如querySelectorAll
漂亮(有很多问题),但这里有一个非常灵活的 function 递归 DOM 并且应该在大多数浏览器(旧的和新的)中都可以工作。 只要浏览器支持您的条件(即:数据属性),您应该能够检索该元素。
好奇的人:不要费心在 jsPerf 上测试这个和 QSA。 像 Opera 11 这样的浏览器会缓存查询并扭曲结果。
代码:
function recurseDOM(start, whitelist)
{
/*
* @start: Node - Specifies point of entry for recursion
* @whitelist: Object - Specifies permitted nodeTypes to collect
*/
var i = 0,
startIsNode = !!start && !!start.nodeType,
startHasChildNodes = !!start.childNodes && !!start.childNodes.length,
nodes, node, nodeHasChildNodes;
if(startIsNode && startHasChildNodes)
{
nodes = start.childNodes;
for(i;i<nodes.length;i++)
{
node = nodes[i];
nodeHasChildNodes = !!node.childNodes && !!node.childNodes.length;
if(!whitelist || whitelist[node.nodeType])
{
//condition here
if(!!node.dataset && !!node.dataset.foo)
{
//handle results here
}
if(nodeHasChildNodes)
{
recurseDOM(node, whitelist);
}
}
node = null;
nodeHasChildNodes = null;
}
}
}
然后,您可以使用以下命令启动它:
recurseDOM(document.body, {"1": 1});
为了速度,或者只是recurseDOM(document.body);
您的规范示例: http://jsbin.com/unajot/1/edit
不同规格的示例: http://jsbin.com/unajot/2/edit
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.