【发布时间】:2011-05-10 09:04:31
【问题描述】:
给定一个具有零个或多个data-* 属性的任意 HTML 元素,如何检索数据的键值对列表。
例如鉴于此:
<div id='prod' data-id='10' data-cat='toy' data-cid='42'>blah</div>
我希望能够以编程方式检索此内容:
{ "id":10, "cat":"toy", "cid":42 }
使用 jQuery (v1.4.3),如果事先知道键,则使用 $.data() 访问数据的各个位很简单,但对于任意数据集如何做到这一点并不明显。
我正在寻找一种“简单”的 jQuery 解决方案(如果存在),但不介意其他较低级别的方法。我尝试解析 $('#prod').attributes,但我缺乏 javascript-fu 让我失望了。
更新
customdata 做我需要的。然而,仅仅为它的一小部分功能包括一个 jQuery 插件似乎有点过头了。
查看源代码帮助我修复了自己的代码(并改进了我的 javascript-fu)。
这是我想出的解决方案:
function getDataAttributes(node) {
var d = {},
re_dataAttr = /^data\-(.+)$/;
$.each(node.get(0).attributes, function(index, attr) {
if (re_dataAttr.test(attr.nodeName)) {
var key = attr.nodeName.match(re_dataAttr)[1];
d[key] = attr.nodeValue;
}
});
return d;
}
更新 2
正如接受的答案所示,使用 jQuery (>=1.4.4) 的解决方案很简单。 $('#prod').data() 将返回所需的数据字典。
【问题讨论】:
-
Addresing "update 2" 注意 jquery data() 使用一些内部缓存并且 data(key, value) 不会传播到 DOM,这可能会引起很多麻烦。同样由于 jquery 3 data() 将属性 data-some-thing="test" 转换为 {someThing: "test"}
标签: javascript jquery html attributes