2015-10-27 10 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

Если вы можете предварять/добавить некоторые узлы, как братьев и сестер '$ node' перешедших в' editNode', она не будет решена даже с '' liveliness' из childNodes'. Возможно ли реорганизовать ваш код, чтобы такие изменения не вводились? – 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); 
      } 
     } 
    } 
} 
Смежные вопросы