Обратный порядок элементов в DOMNodeList - PullRequest
1 голос
/ 01 октября 2010

Hello Я делаю RSS-ридер и использую DOM.
Теперь я застрял, пытаясь изменить порядок элементов в DOMNodeList.
Я могу сделать это с 2 циклами - один для массива и один для rsort () .
Есть ли способ изменить порядок в DOMNodeList или это нужно сделать с помощью «пути массива»?

Ответы [ 3 ]

5 голосов
/ 01 октября 2010

Нет метода для обращения к DOMNodeList.

Но вы можете оставить его как есть, и, если вам это нужно, пройтись по нему от конца к началу.

Пример:

<?php
$doc=new DOMDocument;
$doc->loadXML('
<div>
  <span>1
    <span>2
      <span>3
      </span>
    </span>
  </span>
</div>');

$nodeList=$doc->getElementsByTagName('span');
for($n=$nodeList->length-1;$n>=0;--$n)
{
  echo $nodeList->item($n)->firstChild->data;//returns 321
}
?>

Просто наведите указатель на конец списка NodeList, используя NodeList-> length , затем уменьшите индекс и получите доступ к NodeList-> item (index)

0 голосов
/ 23 апреля 2012

Альтернатива использованию documentFragment (который может заканчиваться нежелательным префиксом пространства имен по умолчанию): клонировать NodeList, перенести все элементы в клон, а затем заменить исходный узел:

function reverseNodeList($nodeList) {
    // clone the original node
    $reverseNodeList = $nodeList->cloneNode();
    // move all nodes off the bottom of the original list onto the new one
    while ($nodeList->lastChild) $reverseNodeList->appendChild($nodeList->lastChild);
    // replace the original node with the new one
    $nodeList->parentNode->replaceChild($reverseNodeList, $nodeList);
}
0 голосов
/ 01 октября 2010

Почему бы вам не сделать это на стороне клиента с помощью JavaScript? Код для данного узла n будет:

function reverse(n) {  // Reverses the order of the children of Node n
    var f = document.createDocumentFragment(  );  // Get an empty DocumentFragment
    while(n.lastChild)                 // Loop backward through the children,
          f.appendChild(n.lastChild);  // moving each one to the DocumentFragment
    n.appendChild(f);                  // Then move them back (in their new order)
}
...