在Dojo节点列表遍历中混淆行为

时间:2012-02-07 16:00:09

标签: dojo

您好,我刚刚开始使用Dojo。我正在玩nodelist遍历并发现以下行为。

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??
});

搜索表如下:

<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循环中使用node来访问它的子节点。我该怎么做?

编辑: 还不完全清楚为什么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 个答案:

答案 0 :(得分:1)

您的节点可能是任何类型的节点,包括文本节点等。您需要检查节点类型以确保其是一个元素节点。如果您正在检查的节点是文本节点,则它不会有子节点。如果节点实际上不包含子节点,也不会有子节点,例如&lt; br /&gt;或者是一个空的div,例如&lt; div&gt;&lt; / div&gt;。查看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());
  }
});