Документ: метод evaluate()
Базовая поддержка Широко доступна
Эта функция хорошо отработана и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с июля 2015 года.
Метод evaluate() интерфейса Document выбирает элементы на основе выражения XPath, переданного в параметрах.
Выражения XPath можно вычислять как в HTML, так и в XML документах.
Синтаксис
evaluate(xpathExpression, contextNode, namespaceResolver, resultType, result)
Параметры
xpathExpression-
Строка, представляющая xpath для вычисления.
contextNode-
Узловой контекст для запроса (см. спецификацию XPath). Обычно в качестве узла контекста передаётся
document. namespaceResolver-
Функция, которая получит любые префиксы имен пространств имён и должна вернуть строку, представляющую URI пространства имён, связанного с этим префиксом. Она будет использоваться для разрешения префиксов в самом xpath, чтобы они могли быть сопоставлены с документом. Значение
nullобычно используется для HTML-документов или когда не используются префиксы имен пространств имён. resultType-
Целое число, соответствующее типу результата
XPathResultдля возврата. Возможны следующие значения:ANY_TYPE(0)-
Любой тип, который естественным образом получается из заданного выражения.
NUMBER_TYPE(1)-
Результат, содержащий единственное число. Полезно, например, в выражении xpath с использованием функции
count(). STRING_TYPE(2)-
Результат, содержащий единственную строку.
BOOLEAN_TYPE(3)-
Результат, содержащий единственное булево значение. Полезно, например, в выражении xpath с использованием функции
not(). UNORDERED_NODE_ITERATOR_TYPE(4)-
Результат, содержащий все узлы, соответствующие выражению. Узлы в результате не обязательно упорядочены так же, как и в документе.
Примечание: Результаты этого типа содержат ссылки на узлы в документе. Изменение узла приведет к аннулированию итератора. После изменения узла попытка итерироваться по результатам приведет к ошибке.
ORDERED_NODE_ITERATOR_TYPE(5)-
Результат, содержащий все узлы, соответствующие выражению. Узлы в результате упорядочены так же, как и в документе.
Примечание: Результаты этого типа содержат ссылки на узлы в документе. Изменение узла приведет к аннулированию итератора. После изменения узла попытка итерироваться по результатам приведет к ошибке.
UNORDERED_NODE_SNAPSHOT_TYPE(6)-
Результат, содержащий снимки всех узлов, соответствующих выражению. Узлы в результате не обязательно упорядочены так же, как и в документе.
Примечание: Результаты этого типа являются снимками, которые представляют собой по существу списки сопоставленных узлов. Вы можете изменять документ, изменяя узлы снимка. Изменение документа не аннулирует снимок; однако, если документ изменён, снимок может не соответствовать текущему состоянию документа, поскольку узлы могут быть перемещены, изменены, добавлены или удалены.
ORDERED_NODE_SNAPSHOT_TYPE(7)-
Результат, содержащий снимки всех узлов, соответствующих выражению. Узлы в результате упорядочены так же, как и в документе.
Примечание: Результаты этого типа являются снимками, которые представляют собой по существу списки сопоставленных узлов. Вы можете изменять документ, изменяя узлы снимка. Изменение документа не аннулирует снимок; однако, если документ изменён, снимок может не соответствовать текущему состоянию документа, поскольку узлы могут быть перемещены, изменены, добавлены или удалены.
ANY_UNORDERED_NODE_TYPE(8)-
Результат, содержащий любой единственный узел, соответствующий выражению. Узел не обязательно является первым узлом в документе, который соответствует выражению.
FIRST_ORDERED_NODE_TYPE(9)-
Результат, содержащий первый узел в документе, соответствующий выражению.
result-
Существующий
XPathResultдля использования в результатах. Если установленоnull, метод создаст и вернёт новыйXPathResult.
Возвращаемое значение
XPathResult, связывающий с выбранными узлами. Если result было null, это новый объект, если нет, то это тот же объект, что и переданный в качестве параметра result.
Примеры
Поиск всех заголовков H2 по XPath
const headings = document.evaluate(
"/html/body//h2",
document,
null,
XPathResult.ANY_TYPE,
null,
);
/* Search the document for all h2 elements.
* The result will likely be an unordered node iterator. */
let thisHeading = headings.iterateNext();
let alertText = "Level 2 headings in this document are:\n";
while (thisHeading) {
alertText += `${thisHeading.textContent}\n`;
thisHeading = headings.iterateNext();
}
alert(alertText); // Alerts the text of all h2 elements
Обратите внимание, в приведенном примере предпочтительнее более подробное xpath по сравнению с общими сокращениями, такими как //h2. Обычно более конкретные селекторы xpath, как в примере выше, обычно обеспечивают значительное улучшение производительности, особенно в очень больших документах. Это происходит потому, что вычисление запроса не тратит время на посещение ненужных узлов. Использование // обычно медленное, так как оно посещает каждый узел от корня и все подузлы, ищет возможные совпадения.
Дальнейшая оптимизация может быть достигнута тщательным использованием параметра контекста. Например, если вам известно, что искомое содержимое находится где-то внутри тега body, вы можете использовать это:
document.evaluate(".//h2", document.body, null, XPathResult.ANY_TYPE, null);
Обратите внимание, что в приведенном примере document.body используется в качестве контекста вместо document, поэтому xpath начинается с элемента body. (В этом примере "." важно, чтобы указать, что поиск должен начинаться с узла контекста, document.body. Если бы "." был опущен (оставлена //h2), запрос начался бы с корневого узла (html), что было бы более затратным.)
См. Введение в использование XPath в JavaScript для получения дополнительной информации.
Получение элемента по xml:id
Эта функция заменяет Document.getElementById(), когда вам нужно искать по xml:id.
function getElementByIdWrapper(xmlDoc, id) {
return xmlDoc.evaluate(
`//*[@xml:id="${id}"]`,
xmlDoc,
() => "http://www.w3.org/XML/1998/namespace",
XPathResult.FIRST_ORDERED_NODE_TYPE,
null,
).singleNodeValue;
}
Спецификации
| Спецификация |
|---|
| DOM # dom-xpathevaluatorbase-evaluate |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
evaluate |
1 | 12 | 1 | 9 | 3 | 18 | 4 | 10.1 | 1 | 1.0 | 3 |
См. также
© 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/evaluate