通过DOM解析获得所有孩子和价值观

Tyl*_*coe 7 javascript recursion dom

容器是一个div我添加了一些基本的HTML.

debug_log函数正在打印以下内容:

我在一个跨度!
我在一个div!
我在一个
p

p标签中其他文本发生了什么("aragraph tag !!").我想我不明白如何走过文档树.我需要一个函数来解析整个文档树并返回所有元素及其值.下面的代码是一个第一次破解,只是显示所有值.

    container.innerHTML = '<span>I\'m in a span! </span><div> I\'m in a div! </div><p>I\'m in a <span>p</span>aragraph tag!!</p>';

    DEMO.parse_dom(container);



   DEMO.parse_dom = function(ele)
    {
        var child_arr = ele.childNodes;

        for(var i = 0; i < child_arr.length; i++)
        {
            debug_log(child_arr[i].firstChild.nodeValue);
            DEMO.parse_dom(child_arr[i]);
        }
     }
Run Code Online (Sandbox Code Playgroud)

小智 10

通常,在遍历DOM时,您需要指定起点.从那里,检查起点是否有childNodes.如果是这样的话,循环遍历它们并递归函数,如果它们也有childNodes.

这是使用这些节点的DOM形式输出到控制台的一些代码(我使用document/HTML元素作为起点).window.console如果您允许非开发人员加载此页面/代码并使用console以下内容,则需要运行if.

recurseDomChildren(document.documentElement, true);

function recurseDomChildren(start, output)
{
    var nodes;
    if(start.childNodes)
    {
        nodes = start.childNodes;
        loopNodeChildren(nodes, output);
    }
}

function loopNodeChildren(nodes, output)
{
    var node;
    for(var i=0;i<nodes.length;i++)
    {
        node = nodes[i];
        if(output)
        {
            outputNode(node);
        }
        if(node.childNodes)
        {
            recurseDomChildren(node, output);
        }
    }
}

function outputNode(node)
{
    var whitespace = /^\s+$/g;
    if(node.nodeType === 1)
    {
        console.log("element: " + node.tagName);  
    }else if(node.nodeType === 3)
    {
        //clear whitespace text nodes
        node.data = node.data.replace(whitespace, "");
        if(node.data)
        {
            console.log("text: " + node.data); 
        }  
    }  
}
Run Code Online (Sandbox Code Playgroud)

示例:http://jsfiddle.net/ee5X6/