3

我有一个需要遍历的简单 html 结构。出于某种原因,我的递归函数在任何嵌套节点上返回“未定义”,但对父节点不返回。不幸的是,这需要是本机 js,没有 jQuery。谢谢!

HTML:

<div id="container">
  <div id="head"> 
    <span id="left"><</span> 
    <span id="right">></span> 
  </div>
</div>

脚本:

var h = hasId(container, 'head');
var l = hasId(container, 'left');
var r = hasId(container, 'right');

console.log(h + " : " + r + " : " + l);
//[object HTMLDivElement] : undefined : undefined

function hasId(ele, id) {
    for (var i = 0; i < ele.childNodes.length; i++) {
        var child = ele.childNodes[i];
        if(child.id == id) return child;
        else hasId(child, id);
    }
}
4

3 回答 3

14

您只是对return递归调用的调用。此外,您应该测试其结果是否已定义。如果是,您可以返回它,如果不是,则继续循环。

var h = hasId(container, 'head');
var l = hasId(container, 'left');
var r = hasId(container, 'right');

console.log(h + " : " + r + " : " + l);
//[object HTMLDivElement] : undefined : undefined

function hasId(ele, id) {
    for (var i = 0; i < ele.childNodes.length; i++) {
        var child = ele.childNodes[i];
        if(child.id == id) return child;
        else {
          var next = hasId(child, id);
          if(next) return next;
        };
    }
}​
于 2012-05-25T23:14:31.343 回答
6

else子句应该return是 的值hasId(child, id),但前提是该值本身已定义,否则它必须继续循环。

没有 areturn函数将递归,但不给出答案。

于 2012-05-25T23:11:54.860 回答
0

你可以像这样修复它:

var h = hasId(container, 'head');
var l = hasId(container, 'left');
var r = hasId(container, 'right');

console.log(h + " : " + r + " : " + l);

function hasId(ele, id) {
    for (var i = 0; i < ele.childNodes.length; i++) {
        var child = ele.childNodes[i];
        if(child.id == id || (child = hasId(child, id))){
           return child;
        }
    }
    return false;
}
于 2012-05-25T23:15:02.730 回答