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

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

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

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

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

person Rahat Ahmed    schedule 07.02.2012    source источник


Ответы (1)


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

element.nodeValue != ''

к этому...

/\S/.test(element.nodeValue)

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

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


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

element.nodeValue.trim() != ''
person Community    schedule 07.02.2012