2010-12-12 6 views
1

さて、私は私自身のgetElementByClassNameを足すことだし、これは私の問題です:なぜ関数内のchildNodes [i]が未定義を返しますが、オブジェクトに警告しますか?

function getElementByClassName(elemento,clase){ 
     var i = 0; 
     if(elemento.hasChildNodes()){ 
      while(elemento.childNodes[i]){ 
       if(elemento.childNodes[i].nodeType != 3){ 
        if(elemento.childNodes[i].className == clase){ 
         return elemento.childNodes[i]; // <---- This is my problem, change to alert 
        } 
        else { 
        getElementByClassName(elemento.childNodes[i],clase); 
        } 
       } 

       i++ 
      } 
     } 
} 

var div = getElementByClassName(document.body,"foo"); 

alert(div); 

それは未定義の警告が、私は(関数内)に置く場合は、この警告[objectHTMLDivElement]と未定義なので、これはundefinedを返し理由を警告これが[objectHTMLDivElement]でアラートを認識している場合は、

答えて

0

あなたの質問に答えるには、else節であなたの関数を再帰的に呼び出していて戻り値で何もしないので、実装がうまくいかない理由があります。だからあなたのコードがオブジェクトを見つけるのですが、返されることはありません。

これは若干修正されたものですが、アプローチには他にも制限があります。複数のクラスを持つ要素が見つからない場合(つまり、<div class="foo bar">は返されません)。あなたが学習の練習としてこれをやっていない限り、私はYoniの答えのリンクのような既存の実装に進むことをお勧めします。

function getElementByClassName(elemento, clase) 
{ 
    var i = 0; 
    if (elemento.hasChildNodes()) 
    { 
     while (elemento.childNodes[i]) 
     { 
      if (elemento.childNodes[i].nodeType != 3) 
      { 
       if (elemento.childNodes[i].className == clase) 
        return elemento.childNodes[i]; 
       else 
       { 
        var result = getElementByClassName(elemento.childNodes[i], clase); 
        if (result != null) 
         return result; 
       } 
      } 
      i++; 
     } 
    } 
    return null; 
} 
+0

ありがとうございます、それはうまくいきます。これは学習のためのものです。私はあなたのコードを勉強します。 –

関連する問題