2012-02-07 9 views
1

こんにちは私はDojoを使い始めています。私はノーベルリストトラバーサルで遊んでいて、次のような振る舞いを見つけました。Dojoノードトラバーサルの動作が混乱する

dojo.query("form.searchform").forEach(function(node, index, arr){  
    var f = dojo.query("form.searchform");  
    alert(f[0]); //[object HTMLFormElement] 
    alert(node); //[object HTMLFormElement] 
    alert(f.children()); //[object HTMLInputElement] as expected 
    alert(node.children()); //undefined. why?? 
}); 

次のようにSearchformは次のとおりです。

<form class="searchform" name="docsearch" method="post" 
action="somelink.php"><input class="searchbox" name="search" 
type="text" value="" id="search" name="search" size="30"/> 
</form> 

ここで何が起こっていますか? foreachループ内のノードを使用してその子にアクセスしたいそれ、どうやったら出来るの?

EDIT: children()がうまくいかなかった理由は完全には明らかではありませんが、次のコードはこの問題を解決しました。

 var f = dojo.query("form.searchform");  
     alert(f[0]); //[object HTMLFormElement] 
     alert(node); //[object HTMLFormElement] 
     alert(f.children()); //[object HTMLInputElement] as expected 
     for(i=0;node.childNodes[i] != undefined; i++){     
     if (node.childNodes[i].nodeType == 1) { 
      alert(node.childNodes[i].value); // gives value of searchbox. 
     } 
    } 

答えて

1

あなたのノードは、テキストノードなどの任意のタイプのノードでもかまいません。ノードタイプを確認して要素ノードを確認する必要があります。検査しているノードがテキストノードの場合、子ノードはありません。 < br />や< div> </div>のような空のdivのように、ノードに実際に子が含まれていない場合は子もありません。ノードの詳細についてはhttps://developer.mozilla.org/en/nodeTypeをチェックしますが、基本的に、あなたはあなたにコードを変更したい:

dojo.query("form.searchform").forEach(function(node, index, arr){  
    var f = dojo.query("form.searchform");  
    alert(f[0]); //[object HTMLFormElement] 
    alert(node); //[object HTMLFormElement] 
    alert(f.children()); //[object HTMLInputElement] as expected 
    if (node.nodeType == 1) { 
    alert(node.children()); 
    } 
}); 
+0

いや、そのdoesntのヘルプ。 nodeTypeは1ですが、if条件が満たされています。 これは、ノードに子がないことを意味しています。 f [0] .childrenも未定義であることに注意してください。 したがって、どのHTMLFormElementがノードを参照していますか? searchformはhtmlページ内の唯一のフォームです。 – crazyphoton

+0

NodeTypeは子があることを保証しません。それは要素ノードだけを言います。そして私は前にこれを気付かなかったが、node.childNodesではなくnode.children? –

+0

はい、私はそのノードが何であるか疑問に思っています。 ifブロック内で警告(node.innerHTML)を行うと、次のようになります。 \t \t \t \t \t         はなぜ、これは子供ではないのですか? 子供はdojo関数です。http://dojotoolkit.org/api/1.5/dojo/NodeList/children – crazyphoton