2015-10-27 149 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); 
      } 
     } 
    } 
}