[英]Converting data-* attributes to an object
我正在玩HTML5的attr-data- *属性和相应的javascript 数据集
我正在做很多动态表单处理,所以我最终得到这样的东西:
<input data-feaux="bar" data-fizz="buzz"/>
由于HTMLElement.dataset
返回一个DOM string map
,我唯一可以弄清楚如何将其转换为本机对象的方法是:
var obj = JSON.parse(JSON.stringify(input_el.dataset))
有一个更好的方法吗?
编辑:
我为什么要这样做? 假设我有很多很多这样的元素。 我想循环遍历它们并将它们推入数组以便稍后处理,即
elements = document.querySelectorAll("input")
my_data_array = []
for(var i = 0; i < elements.length; i++) {
my_data_array.push(elements[i].dataset)
}
现在我有一系列对象,即[{feaux: "bar", fizz:"buzz"}....]
我可以使用。
但是,当我不将DOM string map
转换为对象时,数组不会被填充(即上面的代码不起作用)
编辑2
仔细观察,它实际上是一个DOM string map
,而不是一个object
。 纠正原始问题中的拼写错误以反映这一点。
不要忘记JSON.stringify和JSON.parse。
var data = document.getElementById('someElement').dataset;
data = JSON.parse(JSON.stringify(data));
根据Mozilla的说法,这应该可以在没有polyfill的情况下一直回到IE 8。
这是一个将元素数据集检索为普通对象的小函数:
function datasetToObject(elem){
var data = {};
[].forEach.call(elem.attributes, function(attr) {
if (/^data-/.test(attr.name)) {
var camelCaseName = attr.name.substr(5).replace(/-(.)/g, function ($0, $1) {
return $1.toUpperCase();
});
data[camelCaseName] = attr.value;
}
});
return data;
}
在es6中你可以使用对象传播。
{ ...element.dataset }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.