作为标题,如何JSON.stringify一个dom元素,并将json更改为dom元素.
任何人都知道怎么做,谢谢.
Here is the code :
var container = document.querySelectorAll('.container')
var json=JSON.stringify(container)
{"0":{},"1":{},"2":{},"3":{}}"//result
expected result:
{"tagname":"div","class":"container","value":"test","childelement":[...]}
Run Code Online (Sandbox Code Playgroud)
我认为最合理的方法是将要序列化的DOM元素的哪些属性列入白名单:
JSON.stringify(container, ["id", "className", "tagName"])
Run Code Online (Sandbox Code Playgroud)
JSON.stringify函数的第二个参数允许您更改字符串化过程的行为.您可以使用要序列化的属性列表指定一个数组.更多信息:JSON.stringify
如果您想要序列化其子节点,还需要一些额外的工作.在这种情况下,您必须将replacer函数指定为第二个参数JSON.stringify,而不是数组.
let whitelist = ["id", "tagName", "className", "childNodes"];
function domToObj (domEl) {
var obj = {};
for (let i=0; i<whitelist.length; i++) {
if (domEl[whitelist[i]] instanceof NodeList) {
obj[whitelist[i]] = Array.from(domEl[whitelist[i]]);
}
else {
obj[whitelist[i]] = domEl[whitelist[i]];
}
};
return obj;
}
JSON.stringify(container, function (name, value) {
if (name === "") {
return domToObj(value);
}
if (Array.isArray(this)) {
if (typeof value === "object") {
return domToObj(value);
}
return value;
}
if (whitelist.find(x => (x === name)))
return value;
})
Run Code Online (Sandbox Code Playgroud)
replacer函数将托管对象转换为知道如何序列化的childNodes本机对象JSON.stringify.该whitelist数组具有要序列化的属性列表.您可以在此处添加自己的属性.
如果要序列化引用托管对象的其他属性(例如,firstChild),则可能需要在replacer函数中执行一些额外的工作.
我想知道同样的事情,我很感激@ncardeli 的回答。在我的应用程序中,我需要一些不同的东西,我想我会分享以防万一有人感兴趣。它也递归地显示任何孩子的属性。
按下面的按钮运行示例。您可以将任何您想要的属性添加到 obj 中,从而添加到结果中。
function showStringifyResult(target) {
let result = document.getElementById("result");
result.select();
result.setRangeText(JSON.stringify(stringify(target), null, ' '));
}
function stringify(element) {
let obj = {};
obj.name = element.localName;
obj.attributes = [];
obj.children = [];
Array.from(element.attributes).forEach(a => {
obj.attributes.push({ name: a.name, value: a.value });
});
Array.from(element.children).forEach(c => {
obj.children.push(stringify(c));
});
return obj;
}Run Code Online (Sandbox Code Playgroud)
#list {
margin-top: 18px;
}Run Code Online (Sandbox Code Playgroud)
<h1>
Press the Stringify button to write the stringified object to the textarea below.
</h1>
<button onClick="showStringifyResult(document.body)" class="c1">
Stringify
</button>
<div id="list">
A list for example:
<ul class="first second">
<li id="First Item">Item 1</li>
<li>Item 2</li>
<li class="inactive">Item 3</li>
<li data-tag="tag">Item 4</li>
</ul>
</div>
<textarea id="result" cols="200" rows="20" ></textarea>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4888 次 |
| 最近记录: |