2015-10-27 180 views
2

我有这样的方法,通过所有节点循环:遍历所有的DOM元素,包括添加的元素

public function processNode(DOMNode $element){ 
    if($element instanceof DOMElement){ 
     foreach($element->childNodes as $node){ 
      // Adds child nodes and/or modifies the current node 
      $this->editNode($node); 
      if($node->hasChildNodes()){ 
       $this->processNode($node); 
      } 
     } 
    } 
} 

但是,我认为,当节点在editNode()方法中添加的,这不接他们,处理这些节点。

有没有更好的方式让我遍历所有节点,包括已经通过editNode()添加的节点?

+0

如果您能够将某些节点作为传递到editNode的'$ node'的兄弟节点预先加入/追加一些节点,即使使用'childNodes'的'liveliness'也不会解决。是否有可能重新组织您的代码,所以不会引入这样的更改? – raina77ow

+0

可能不是,因为我添加了一个名为'repeat'的属性,它看起来像这个'

',它循环访问一个数组并重复内部div以获得与value值数组中相同数量的内容。 –

回答

0

它看起来像做for而不是foreach是一个更好的方法。然后,我可以处理使用foreach时跳过的项目。

public function processNode(DOMNode $element){ 
    if($element instanceof DOMElement){ 
     $nodes = $element->childNodes; 
     for($i = 0; $i < $nodes->length; $i++){ 
      $node = $nodes->item($i); 
      $this->editNode($node); 
      if($node->hasChildNodes()){ 
       $this->processNode($node); 
      } 
     } 
    } 
}