Javascript – 迭代元素的递归函数

我刚刚开始阅读JavaScript,我正在尝试编写一个小的递归函数,它将搜索给定的节点并将值列表作为字符串返回。

我的HTML结构可能是这样的

parentfolder1
item1
item2
parentfolder2
item1
item2

这是我的Javascript函数:

 function jsoncreator(parentfolderclass){ var jstring = ''; //get first occurance of parent folder var parentfolder = document.getElementById(parentfolderclass); var childnodes = parentfolder.childNodes; for (property in childnodes){ jstring += property+ childnodes[property]; if(childnodes[property] === parentfolderclass){ jsoncreator(parentfolderclass); jstring += childnodes[property].value + '
'; } else{ //jstring += childnodes[i].value + '
'; } } document.write(jstring); }

所有我回来的都是

 0[object Text]1[object HTMLDivElement]2[object Text]3[object HTMLDivElement]4[object Text]5[object HTMLDivElement]6[object Text]length7itemfunction item() { [native code] } 

当我尝试打印childnodes值时,我得到了一堆未定义的返回值。

如果有人能解释我做错了什么,我真的很感激。

您将需要执行以下操作(递归跨浏览器)

使用Javascript

 function walkTheDOM(node, func) { func(node); node = node.firstChild; while (node) { walkTheDOM(node, func); node = node.nextSibling; } } function textNodeValuesToArray(node) { if (typeof node === "string") { node = document.getElementById(node); } var arrayOfText = []; function pushText(currentNode) { if (currentNode.nodeType === 3) { arrayOfText.push(currentNode.nodeValue); } } walkTheDOM(node, pushText); return arrayOfText; } console.log(textNodeValuesToArray("parentfolder")); 

在jsfiddle

或者使用treewalker

浏览器兼容性

支持IE9 +,FF2 +,Chrome 1 +,Safari 3 +,Opera 9+

使用Javascript

 function textNodeValuesToArray(node) { if (typeof node === "string") { node = document.getElementById(node); } var arrayOfText = [], treeWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, { acceptNode: function (node) { return NodeFilter.FILTER_ACCEPT; } }, false); while (treeWalker.nextNode()) { arrayOfText.push(treeWalker.currentNode.nodeValue); } return arrayOfText; } console.log(textNodeValuesToArray("parentfolder")); 

在jsfiddle

没有递归和跨浏览器将是这样的

使用Javascript

避免使用标签

标签在JavaScript中并不常用,因为它们使程序更难以阅读和理解。 尽可能避免使用标签,并根据具体情况,更喜欢调用函数或抛出错误。

 function walkDOM(root, func) { var node = root; start: while (node) { func(node); if (node.firstChild) { node = node.firstChild; continue start; } while (node) { if (node === root) { break start; } if (node.nextSibling) { node = node.nextSibling; continue start; } node = node.parentNode; } } } function textNodeValuesToArray(node) { if (typeof node === "string") { node = document.getElementById(node); } var arrayOfText = []; function pushText(currentNode) { if (currentNode.nodeType === 3) { arrayOfText.push(currentNode.nodeValue); } } walkDOM(node, pushText); return arrayOfText; } console.log(textNodeValuesToArray("parentfolder")); 

在jsfiddle

 
parentfolder1
item1
item2
parentfolder2
item1
item2
var children = document.getElementById('parentfolder').getElementsByClassName('*'); var childValues = new Array(); for(i=0; i