Container是一个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]);
}
}
答案 0 :(得分:9)
通常在遍历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);
}
}
}
答案 1 :(得分:0)
在
<p>I\'m in a <span>p</span>aragraph tag!!</p>
您请求第一个孩子,这是包含“我在一个”的文本节点。 文字“aragraph tag !!”是第三个孩子,没有记录。
奇怪的是,包含“p”的最后一行不应该出现,因为span元素不是容器的直接子元素。
答案 2 :(得分:0)
我不确定这是你需要的,或者你的环境是否可行,但jQuery可以很容易地完成类似的事情。这是一个可能有效的快速jQuery示例。
<html>
<head>
<script src="INCLUDE JQUERY HERE">
</script>
</head>
<body>
<span>
<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>
</span>
<script>
function traverse(elem){
$(elem).children().each(function(i,e){
console.log($(e).text());
traverse($(e));
});
}
traverse($("body").children().first());
</script>
</body>
<html>
这给出了以下控制台输出:
I\'m in a span!
I\'m in a div!
I\'m in a paragraph tag!!
p