DOM | Интерфейс TreeWalker

DOM | Интерфейс TreeWalker

IDL

[Exposed=Window]
interface TreeWalker {
   [SameObject] readonly attribute Node root;
   readonly attribute unsigned long whatToShow;
   readonly attribute NodeFilter? filter;
            attribute Node currentNode;

   Node? parentNode();
   Node? firstChild();
   Node? lastChild();
   Node? previousSibling();
   Node? nextSibling();
   Node? previousNode();
   Node? nextNode();
};

 

Примечание!

Объекты TreeWalker могут быть созданы с использованием метода createTreeWalker() для объектов Document.

Каждый объект TreeWalker имеет связанный «текущий» (current) (узел).

Примечание!

Как упоминалось ранее, у объектов TreeWalker есть связанный корень, whatToShow и фильтр.

Получатель атрибута root при вызове должен возвращать корень этого this.

Получатель атрибута whatToShow при вызове должен возвращать whatToShow этого this.

Получатель атрибута filter при вызове должен возвращать фильтр этого this.

Получатель атрибута currentNode при вызове должен возвращать текущего этого this.

Установщик атрибута currentNode при вызове должен установить текущего этого this на заданное значение.

 

Метод parentNode() при вызове должен выполнить следующие шаги:

1. Пусть node будет текущим этого this.
2. Пока node не равен null и не является корнем этого this:
1. Установите узел node на родителя node.
2. Если node не равен null и фильтрованный узел node в this возвращает FILTER_ACCEPT, тогда установите текущего этого this для node и верните node.
3. Верните null

Чтобы «обойти детей» (to traverse children) с помощью обходчика walker и типа type, выполните следующие действия:

1. Пусть узел node будет обходчиком walker текущего.
2. Установите узел node как первого ребёнка node, если тип type является первым, и последним ребёнком node, если тип type является последним.
3. Пока узел node не равен null:
   1. Пусть result будет результатом фильтрации узла node в walker.
   2. Если result является FILTER_ACCEPT, тогда установите текущего для ходока walker на node и верните node.
   3. Если result является FILTER_SKIP, то:
      1. Пусть child будет первым ребёнком узла node, если тип type является первым, и последним ребёнком узла node, если тип type является последним.
      2. Если child не равен null, установите узел node в child и продолжайте.
   4. Пока узел node не равен null:
      1. Пусть sibling будет следующим родственником узла node, если тип type является первым, и предыдущим родственником узла node, если тип type является последним.
      2. Если sibling не равен null, установите node равным sibling и прервите.
      3. Пусть parent будет родителем узла node.
      4. Если parent имеет значение null, корень walker или текущий walker, возвращается значение null.
      5. Установить node как parent.
4. Вернуть null.

Метод firstChild() при вызове должен обойти детей с this и первым.

 

Метод lastChild() при вызове должен обойти детей с this и последним.

Чтобы «обойти родственников» (to traverse siblings) с помощью обходчика walker и типа type, выполните следующие действия:

1. Пусть узел node будет обходчиком walker текущего.
2. Если узел node является корнем, вернуть null.
3. Пока истинно true:
   1. Пусть sibling будет следующим родственником узла node, если тип type следующий, и предыдущим родственником узла node, если тип type предыдущий.
   2. Пока sibling не равен null:
      1. Установить node равным sibling.
      2. Пусть result будет результатом фильтрации узла node в walker.
      3. Если result является FILTER_ACCEPT, тогда установите текущего ходока walker на узел node и верните node.
      4. Установите sibling на первого ребёнка node, если тип type является следующим, и последнего ребёнка узла node, если тип type является предыдущим.
      5. Если result является FILTER_REJECT или sibling имеет значение null, тогда установите sibling на следующего родственника node, если тип type следующий, и предыдущему родственнику node, если тип type предыдущий.
   3. Установите node как родителя node.
   4. Если узел node равен null или корень ходока walker, возвращается null.
   5. Если возвращаемое значение фильтрованного узла node в обходчике walker - FILTER_ACCEPT, то вернуть null.

Метод nextSibling() при вызове должен обходить родственников (проходить через братьев и сестер) с this и следующим.

Метод previousSibling() при вызове должен обходить родственников (проходить через братьев и сестер) с this и предыдущим.

При вызове метода previousNode() необходимо выполнить следующие действия:

1. Пусть node будет текущим этого this.
2. Пока node не является корнем этого this:
   1. Пусть sibling будет предыдущим родственником узла node.
   2. Пока sibling не равен null:
      1. Установить node равным sibling.
      2. Пусть result будет результатом фильтрации node внутри this.
      3. Пока result не является FILTER_REJECT и у узла node есть ребёнок:
         1. Установите node на последнего ребёнка node.
         2. Установите result на результат фильтрации node внутри this.
      4. Если result является FILTER_ACCEPT, установите текущего этого this на node и верните node.
      5. Установить sibling на предыдущего родственника node.
   3. Если node является корнем этого this или родитель node имеет значение NULL, возвращается значение NULL.
   4. Установите node как родитель node.
   5. Если возвращаемое значение фильтрованного узла node внутри этого this - FILTER_ACCEPT, то установите текущего этого this на node и верните node.
3. Верните NULL

 

При вызове метода nextNode() необходимо выполнить следующие действия:

1. Пусть node будет текущим этого this.
2. Пусть result будет FILTER_ACCEPT.
3. Пока истина true:
   1. Пока result не является FILTER_REJECT и у узла node есть ребёнок:
      1. Установите node на его первого ребёнка.
      2. Установите result на результат фильтрации node в этом this.
      3. Если result является FILTER_ACCEPT, установите текущего этого this на node и верните node.
   2. Пусть sibling равен NULL.
   3. Пусть temporary будет node.
   4. Пока временное temporary не равно NULL:
      1. Если temporary является корнем этого this , то вернуть null.
      2. Сделать sibling на следующего родственника temporary.
      3. Если sibling не равен null, установите node равным sibling и прервите.
      4. Установите temporary на родителя temporary
   5. Установите result на результат фильтрации узла node в этом this.
   6. Если result является FILTER_ACCEPT, установите текущего этого this на node и верните node.