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)、その値自体が定義されている場合に限ります。それ以外の場合は、ループを続行する必要があります。

関数がないreturnと再帰しますが、答えは出ません。

于 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 に答える