2015-02-24 5 views
1

При построении TreeWalker, почему currentNode указывает на корень, даже если он не может пройти критерии фильтра?Почему TreeWalker currentNode по умолчанию для корневого узла?

Я бы ожидал, что оно будет равно null, пока я не вызову nextNode, чтобы я мог проверить, передается ли корню критерии фильтра.

Я предполагаю, что это так, как он был разработан, я просто не совсем понимаю причину. Это не соответствует моему варианту использования всех элементов с определенным набором атрибутов, включая корень. Если я поднимусь к родительскому корню, я включу братьев и сестер, которых я не хочу.

ответ

1

current node не представляет результат последнего вызова метода, но он обозначает текущее состояние ходьбы, узел, из которого сделан следующий шаг. Он никогда не должен быть нулевым и действительно может быть узлом, который не будет пропускать фильтр - он может быть установлен произвольно (вручную, а не только пошаговые методы).

Только возвращаемые значения всех вызовов метода будут отфильтрованы узлами, а они могут быть null.

Это не соответствует моему варианту использования всех элементов с определенным набором атрибутов, включая корень.

Использование parentNode method должны в конечном итоге получить вас в корневой узел, если он соответствует фильтру, или null иначе.

+0

Я думаю, что дизайн TreeWalker испорчен, но, может быть, я что-то упустил. Во всяком случае, я решил использовать свою собственную индивидуальную реализацию. Может быть медленнее, чем родной, но он работает. Я приму ответ, как единственный вариант со стандартной реализацией. – dave

+0

@dave: На самом деле у меня такое чувство, что алгоритм ['nextNode'] (https://dom.spec.whatwg.org/#dom-treewalker-nextnode), как и в настоящее время в спецификации, также глючит, поскольку он никогда не поднимается на дерево. – Bergi

0

currentNode указывает на корень, потому что тогда он может рекурсивно пересекать поддерево документов, вызывая каждый childNode как корень собственного дерева. Это не обязательно указывает на корень документа, только узел root, с которым было создано дерево. См. tree traversal

+0

Я устанавливаю корень в элемент внутри документа. Я не понимаю, почему он был спроектирован так, чтобы указанный корень не был включен как часть обхода TreeWalker. Для nextNode было бы тривиально проверить, является ли currentNode нулевым и попытается его обработать. – dave

+0

, если вы установили корень в нуль, как вы предполагали, вы ожидаете, как вы можете вызвать nextNode? СледующийNode пустого корня будет null –

+0

Я * не * установил корень в null. В конструкторе я передаю ненулевой узел. Я бы ожидал, что nextNode проверит этот узел и вернет его, если он пройдет указанный мной фильтр. Таким образом, я ожидаю, что * currentNode * имеет значение null сразу после создания TreeWalker, но не для корня только для чтения. – dave