2016-03-10 4 views
0

Я пытаюсь использовать document.evaluate, чтобы найти текстовые узлы, соответствующие моему запросу. Проблема, которую я обнаружил, заключается в том, что с использованием XPath, который я использую, он не находит текстовые узлы, которые следуют за другим элементом. Например, с учетом этих условий (jsFiddle):Найти текстовый узел после узла с XPath

HTML

<div><p>$100</p></div> 
<p>Test test <span>test</span> $100 test</p> 

Мусор

var item, 
    indx = 0, 
    items = document.evaluate('//*[contains(text(),"$")]', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); 

while (item = items.snapshotItem(indx++)) { 
    if (item.nodeName !== 'SCRIPT') { 
    console.log(item.textContent); 
    } 
} 

этот XPath находит только первый $, второй не найден из-за <span> в средний.

Итак, мой вопрос в том, как изменить javascript (а не HTML), чтобы найти оба совпадения?

ответ

2

Измените выражение XPath на //*[text()[contains(.,"$")]] так, чтобы он выбирал элементы с текстовым дочерним узлом, содержащим символ $.

+0

Я пробовал это изменение в скрипте, которую я поделил, и я вижу эту ошибку: 'недействительное выражение XPath' – Mottie

+0

Я пробовал' '* [содержит (.," $ ")] '' И что нашел оба элемента *, но * если вы используете 'document', он возвращает элемент' html', а переключение на 'document.body' возвращает внешнюю оболочку, что не является оптимальным. – Mottie

+0

Извините, я забыл закрытие ']', теперь отредактированное и исправленное. –

Смежные вопросы