2010-05-01 9 views
13

Estoy buscando una forma de realizar búsquedas de texto completo en el árbol DOM con JS. En dos palabras, me gustaría recuperar la lista de nodos de texto que contienen una cadena dada.JS DOM: Obtener elementos por contenido de texto

He intentado mootools 'Element.getElements (':contains[string]') pero no consigo que funcione con cadenas que contengan espacios en blanco.

EDITAR: jQuery y mootools parecen tener sus operadores :contains trabajando a través del cruce de árbol. Esto significa que no hay una forma nativa para buscar en la página, ¿es correcto? Parece muy ineficiente si la página es enorme y la única información que tiene sobre su elemento es la cadena que se busca. ¿Me equivoco?

Estoy pensando en indexar todos los nodos de texto y compararlos con el índice de cada cadena que se busca, pero en mi proyecto no hay forma de saber cuándo se actualizan las DOM para mantener dicho índice arriba. hasta la fecha.

¿Alguna idea mejor?

Gracias

Respuesta

19

Si usted tiene un navegador moderno, siempre se puede utilizar XPath, ya que cuenta con la búsqueda basada en el contenido.

Este es un ejemplo:

document.evaluate('//*[text()="' + string + '"]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE).snapshotItem(0); 

Y con navegadores antiguos, puede calzar XPATH con algo así como http://llamalab.com/js/xpath/

+0

Me pareció necesario agregar un 'null' adicional después de' XPathResult.ORDERED_NODE_SNAPSHOT_TYPE'. Consulte https://developer.mozilla.org/en-US/docs/Web/API/document.evaluate?redirectlocale=en-US&redirectslug=DOM%2Fdocument.evaluate – GKFX

1

En DOM en general: Para la obtención de elemento de texto en DOM

//*[text()='anytext'] 

o

//*[.='anytext'] 
Cuestiones relacionadas