-
-
Save konekoya/ba8355754fb27e85f8f979e1a13e09ff to your computer and use it in GitHub Desktop.
Stringify DOM nodes using JSON (and revive again)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function toJSON(node) { | |
node = node || this; | |
var obj = { | |
nodeType: node.nodeType | |
}; | |
if (node.tagName) { | |
obj.tagName = node.tagName.toLowerCase(); | |
} else | |
if (node.nodeName) { | |
obj.nodeName = node.nodeName; | |
} | |
if (node.nodeValue) { | |
obj.nodeValue = node.nodeValue; | |
} | |
var attrs = node.attributes; | |
if (attrs) { | |
var length = attrs.length; | |
var arr = obj.attributes = new Array(length); | |
for (var i = 0; i < length; i++) { | |
attr = attrs[i]; | |
arr[i] = [attr.nodeName, attr.nodeValue]; | |
} | |
} | |
var childNodes = node.childNodes; | |
if (childNodes) { | |
length = childNodes.length; | |
arr = obj.childNodes = new Array(length); | |
for (i = 0; i < length; i++) { | |
arr[i] = toJSON(childNodes[i]); | |
} | |
} | |
return obj; | |
} | |
function toDOM(obj) { | |
if (typeof obj == 'string') { | |
obj = JSON.parse(obj); | |
} | |
var node, nodeType = obj.nodeType; | |
switch (nodeType) { | |
case 1: //ELEMENT_NODE | |
node = document.createElement(obj.tagName); | |
var attributes = obj.attributes || []; | |
for (var i = 0, len = attributes.length; i < len; i++) { | |
var attr = attributes[i]; | |
node.setAttribute(attr[0], attr[1]); | |
} | |
break; | |
case 3: //TEXT_NODE | |
node = document.createTextNode(obj.nodeValue); | |
break; | |
case 8: //COMMENT_NODE | |
node = document.createComment(obj.nodeValue); | |
break; | |
case 9: //DOCUMENT_NODE | |
node = document.implementation.createDocument(); | |
break; | |
case 10: //DOCUMENT_TYPE_NODE | |
node = document.implementation.createDocumentType(obj.nodeName); | |
break; | |
case 11: //DOCUMENT_FRAGMENT_NODE | |
node = document.createDocumentFragment(); | |
break; | |
default: | |
return node; | |
} | |
if (nodeType == 1 || nodeType == 11) { | |
var childNodes = obj.childNodes || []; | |
for (i = 0, len = childNodes.length; i < len; i++) { | |
node.appendChild(toDOM(childNodes[i])); | |
} | |
} | |
return node; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment