2012-02-07 21 views
13

Próbuję napisać skryptozakładkę, która wywołuje funkcję doSomething(textNode) we wszystkich wystąpieniach widocznego tekstu na dokumencie.Znajdź wszystkie węzły tekstowe

doSomething(), dla zabawy, zamienia każde słowo na "derp", zastępując textContent z przekazywanego w nim elementu tekstowego. Jednak powoduje to, że niektóre textNodes, które są puste, aby mieć w nich słowa, więc łamie strony internetowej.

Czy istnieje sposób wywoływania doSomething() tylko na każdym węźle tekstowym zawierającym wyrazy?

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

Odpowiedz

10

Zmiana ta ...

element.nodeValue != '' 

do tego ...

/\S/.test(element.nodeValue) 

używa /\S/ regex, który wyszukuje przynajmniej jeden znak zakaz kosmicznej.

Może być konieczne dalsze zdefiniowanie słów "słowa". Zrobiłem to, żeby powiedzieć, że wyłączasz tylko te węzły.


W przeglądarkach obsługujących String.prototype.trim, byłaby to alternatywa ...

element.nodeValue.trim() != '' 
Powiązane problemy