My question is pretty simple, I would like to recreate a html page with json, but I do not want to mess with existing html, framework and co...
Example :
var myDiv = { tag : "div", style : "color:blue", class : "jj", content : "Hello"};
var myDiv = { tag : "div", style : "color:blue", class : "jj", content : "Hello"};
var param = { forbid : { tag : true, content : true } };
var createTag = function(o) {
var node = document.createElement(o.tag);
for (att in o) {
if (!param.forbid[att]) node.setAttribute(att, o[att]);
}
node.appendChild(document.createTextNode(o.content))
return node;
}
document.body.textContent = createTag(myDiv).outerHTML;
the result of this code is :
<div style="color:blue" class="jj"> Hello </div>
How can I be sure that "tag" and "content" doesn't mess with existing/future attributes? And keep it simple?
To avoid conflicts with attributes, I would keep them separated
var myDiv = {
tagName: "div",
attributes: {
style: "color: blue",
class: "jj"
},
childNodes: ["Hello"]
};
function parseTree(node) {
if(typeof node === 'string') // Text node
return document.createTextNode(node);
// Otherwise, assuming an element. Consider adding
// `node.nodeType` if you want multiple node types
var el = document.createElement(node.tagName);
if(node.hasOwnProperty('attributes'))
for(var attr in node.attributes)
if(node.attributes.hasOwnProperty(attr))
el.setAttribute(attr, node.attributes[attr]);
if(node.hasOwnProperty('childNodes'))
node.childNodes.forEach(function(child) {
el.appendChild(parseTree(child));
});
return el;
}
document.body.textContent = parseTree({
tagName: "div",
attributes: {
style: "color: blue",
class: "jj"
},
childNodes: ["Hello"]
}).outerHTML;
Alternatively, you could use strings with some characters not allowed in attribute names. For example, \u0000 or .
var myDiv = {
" tagName": "div",
style: "color: blue",
class: "jj",
" childNodes": ["Hello"]
};
function parseTree(node) {
if(typeof node === 'string') // Text node
return document.createTextNode(node);
// Otherwise, assuming an element. Consider adding
// `node[" nodeType"]` if you want multiple node types
var el = document.createElement(node[" tagName"]);
for(var attr in node)
if(node.hasOwnProperty(attr) && attr[0] !== " ")
el.setAttribute(attr, node[attr]);
if(node[" childNodes"])
node[" childNodes"].forEach(function(child) {
el.appendChild(parseTree(child));
});
return el;
}
document.body.textContent = parseTree({
" tagName": "div",
style: "color: blue",
class: "jj",
" childNodes": ["Hello"]
}).outerHTML;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With