2012-02-07 20 views
13

Estoy tratando de escribir un bookmarklet que llame a la función doSomething(textNode) en todas las instancias de texto visible en el documento.Buscar todos los nodos de texto

doSomething(), solo por diversión, reemplaza cada palabra con "derp" al reemplazar el textoContenido del textoNode pasado a él. Sin embargo, esto hace que algunos TextNodes que están vacíos tengan palabras en ellos, por lo que rompe la página web.

¿Hay alguna manera de llamar al doSomething() en cada textNode que tenga palabras en él?

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

Respuesta

10

Cambie este ...

element.nodeValue != '' 

a este ...

/\S/.test(element.nodeValue) 

Este utiliza la expresión regular /\S/, que busca al menos un carácter no-espacio.

Es posible que deba definir aún más lo que quiere decir con "palabras". Lo tomé como que significa que solo excluyes los nodos que solo son espacios en blanco.


En los navegadores que soportan String.prototype.trim, esto sería una alternativa ...

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