Найти все текстовые узлы - PullRequest
13 голосов
/ 07 февраля 2012

Я пытаюсь написать букмарклет, который вызывает функцию doSomething(textNode) для всех экземпляров видимого текста в документе.

doSomething(), просто для удовольствия, заменяет каждое слово на «сумасшедший», заменяя textContent переданного в него textNode. Тем не менее, это делает некоторые текстовые узлы пустыми, чтобы в них были слова, поэтому он разрывает веб-страницу.

Можно ли вызвать doSomething() только для каждого текстового узла, в котором есть слова?

function recurse(element)
{
    if (element.childNodes.length > 0) 
        for (var i = 0; i < element.childNodes.length; i++) 
            recurse(element.childNodes[i]);

    if (element.nodeType == Node.TEXT_NODE && element.nodeValue != '') 
        doSomething(element);
}
var html = document.getElementsByTagName('html')[0];
recurse(html);

1 Ответ

10 голосов
/ 07 февраля 2012

Измените это ...

element.nodeValue != ''

на это ...

/\S/.test(element.nodeValue)

При этом используется регулярное выражение /\S/, которое ищет хотя бы один непробельный символ.

Возможно, вам понадобится определить, что вы подразумеваете под «словами».Я понял, что это означает, что вы исключаете только узлы только для пробелов.


В браузерах, которые поддерживают String.prototype.trim, это будет альтернативой ...

element.nodeValue.trim() != ''
...