Подтвердить что ты не робот

Найти все текстовые узлы

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

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

Есть ли способ вызвать doSomething() только для каждого текстовогоNode, в котором есть слова?

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);
4b9b3361

Ответ 1

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

element.nodeValue != ''

к этому...

/\S/.test(element.nodeValue)

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

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


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

element.nodeValue.trim() != ''