Документ: метод createTreeWalker()
Базовая линия Широко доступная
Эта функция хорошо отработана и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с июля 2015 года.
Метод Document.createTreeWalker() возвращает новый созданный объект TreeWalker.
Синтаксис
createTreeWalker(root) createTreeWalker(root, whatToShow) createTreeWalker(root, whatToShow, filter)
Параметры
root-
A
Nodeпредставляющий корень объектаTreeWalker, который является начальным значениемTreeWalker.currentNode. whatToShowНеобязательно-
A
unsigned longпредставляющий битовую маску, созданную путём объединения постоянных свойствNodeFilter. Это удобный способ фильтрации определённых типов узлов. По умолчанию0xFFFFFFFF, представляющий постояннуюNodeFilter.SHOW_ALL.Постоянная Числовое значение Описание NodeFilter.SHOW_ALL0xFFFFFFFFОтображает все узлы. NodeFilter.SHOW_ATTRIBUTE0x2Отображает узлы Attr.NodeFilter.SHOW_CDATA_SECTION0x8Отображает узлы CDATASection.NodeFilter.SHOW_COMMENT0x80Отображает узлы Comment.NodeFilter.SHOW_DOCUMENT0x100Отображает узлы Document.NodeFilter.SHOW_DOCUMENT_FRAGMENT0x400Отображает узлы DocumentFragment.NodeFilter.SHOW_DOCUMENT_TYPE0x200Отображает узлы DocumentType.NodeFilter.SHOW_ELEMENT0x1Отображает узлы Element.NodeFilter.SHOW_ENTITYУстаревшее0x20Устаревший, больше не используется. NodeFilter.SHOW_ENTITY_REFERENCEУстаревшее0x10Устаревший, больше не используется. NodeFilter.SHOW_NOTATIONУстаревшее0x800Устаревший, больше не используется. NodeFilter.SHOW_PROCESSING_INSTRUCTION0x40Отображает узлы ProcessingInstruction.NodeFilter.SHOW_TEXT0x4Отображает узлы Text.Примечание: Так как родитель любого узла
Attrвсегдаnull,TreeWalker.nextNode()иTreeWalker.previousNode()никогда не вернут узелAttr. Для обхода узловAttrиспользуйтеElement.attributesвместо этого. filterНеобязательно-
Функция обратного вызова или объект с методом
acceptNode(), который возвращаетNodeFilter.FILTER_ACCEPT,NodeFilter.FILTER_REJECT, илиNodeFilter.FILTER_SKIP. Функция или метод будут вызываться для каждого узла в поддереве, базирующимся наroot, который принимается как включённый флагомwhatToShowдля определения того, следует ли включать его в список перебираемых узлов:- Если возвращаемое значение
NodeFilter.FILTER_ACCEPT, этот узел включается. - Если возвращаемое значение
NodeFilter.FILTER_REJECT, никакой узел в поддереве, базирующемся на этом узле, не включается. - Если возвращаемое значение
NodeFilter.FILTER_SKIP, этот узел не включается.
- Если возвращаемое значение
Возвращаемое значение
Новый объект TreeWalker.
Примеры
Использование whatToShow
В этом примере используется whatToShow для преобразования текстового содержимого в верхний регистр. Обратите внимание, что узлы текста потомков элемента #root также обрабатываются, несмотря на то, что они не являются дочерними узлами элемента #root.
HTML
<div id="root"> This is a text node. <span>And this is a <code>span</code> element.</span> </div>
CSS
span {
background-color: aqua;
}
JavaScript
const treeWalker = document.createTreeWalker(
document.querySelector("#root"),
NodeFilter.SHOW_TEXT,
);
while (treeWalker.nextNode()) {
const node = treeWalker.currentNode;
node.data = node.data.toUpperCase();
}
Результат
Использование filter
В этом примере используется filter для экранирования текстового содержимого. Для любого узла текста его содержимое будет экранироваться с помощью encodeURI(), если он является потомком элемента .escape но не является потомком любого элемента .no-escape.
HTML
<div>
<div>
This is not escaped. <span class="escape">But this is escaped.</span>
</div>
<div class="escape">This is escaped.</div>
<div class="no-escape">This is not escaped.</div>
</div>
<hr />
<div class="escape">
<div>
This is escaped. <span class="no-escape">But this is not escaped.</span>
</div>
<div class="no-escape">This is not escaped.</div>
</div>
<hr />
<div class="no-escape">
<div>This is not escaped.</div>
<div class="escape">This is not escaped.</div>
</div>
CSS
.escape {
border: dashed;
}
.no-escape {
border: solid;
}
JavaScript
const treeWalker = document.createTreeWalker(
document.body,
NodeFilter.SHOW_ELEMENT,
(node) =>
node.classList.contains("no-escape")
? NodeFilter.FILTER_REJECT
: node.closest(".escape")
? NodeFilter.FILTER_ACCEPT
: NodeFilter.FILTER_SKIP,
);
while (treeWalker.nextNode()) {
for (const node of treeWalker.currentNode.childNodes) {
if (node.nodeType === Node.TEXT_NODE && /\S/.test(node.data)) {
// Exclude whitespace-only text nodes
node.data = encodeURI(node.data.replace(/\s+/g, " "));
}
}
}
Результат
Спецификации
| Спецификация |
|---|
| DOM # dom-document-createtreewalker |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
createTreeWalker |
1 | 12 | 1 | 9 | 3 | 18 | 4 | 10.1 | 3 | 1.0 | 4.4 |
whatToShow_filter_parameters_optional |
4 | 13 | 12 | ≤15 | 3 | 18 | 14 | ≤14 | 3 | 1.0 | ≤37 |
См. также
-
TreeWalker: Связанный интерфейс
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Document/createTreeWalker