Skip to content

Instantly share code, notes, and snippets.

@yarkovaleksei
Forked from sstur/dom-to-json.js
Created April 5, 2019 07:57
Show Gist options
  • Save yarkovaleksei/e4d1804a4e5d6dd8048469a8889cdb41 to your computer and use it in GitHub Desktop.
Save yarkovaleksei/e4d1804a4e5d6dd8048469a8889cdb41 to your computer and use it in GitHub Desktop.

Revisions

  1. @sstur sstur created this gist Nov 9, 2013.
    74 changes: 74 additions & 0 deletions dom-to-json.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,74 @@
    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;
    }