Hace varios años atrás escribí un post acerca de cómo realizar una búsqueda de texto en JavaScript, modificando el DOM para resaltar los resultados.
Dicho post ha quedado desfasado y hay mejores maneras de hacer una búsqueda de texto en JavaScript, sin tener para ello que hacer uso de complejas expresiones regulares, ni tener que reescribir todo el HTML del contenedor para lograr este objetivo.
Mejor solución para hacer una búsqueda de texto en JavaScript
Podríamos simplemente hacer una búsqueda recursiva de todos los elementos dentro del contenedor deseado, centrándonos solo en nodos de tipo Element y los nodos de tipo Text. Si el nodo es de tipo Element, repetimos la búsqueda dentro del mismo, si el nodo es de tipo Text chequeamos si contiene algún resultado de la búsqueda, si es así lo remplazamos por un elemento con los resultados resaltados y si no contiene resultados simplemente lo ignoramos.
Utilidad forEach
Antes que nada, vamos a crear una pequeña utilidad para iterar en los childNodes de un nodo de tipo Element, para ello nos valdremos del método Array.prototype.forEach:
De esta manera solo tendremos que hacer lo siguiente para iterar en los nodos hijos de un elemento:
Función recursiva de búsqueda de texto en JavaScript
Después crearemos una función que recursivamente busque elementos de tipo Text y si estos contienen algún resultado dentro, entonces remplace el elemento por un span que contenga el texto original con los resultados envueltos cada uno por un span con una clase específica.
Con la anterior función, si buscamos la palabra «cuesta» en el siguiente código HTML, obtendremos el resultado a continuación:
Función recursiva de limpieza
Ya solo nos quedaría tener una función para deshacer las búsquedas y dejar todo en el estado inicial.
Código final para búsqueda de texto en JavaScript
Con estas dos funciones ya podríamos crear una función que primeramente se encargara de limpiar cualquier búsqueda anterior, después realizara una nueva búsqueda y nos retornara la cantidad de veces que se encontró (usando la misma expresión regular):
Demostración de la función de búsqueda de texto en JavaScript (parte II)
Descarga de ficheros
Descarga los ficheros de ejemplo
Excelente Script. Estoy buscando algo parecido, pero cuando el texto es muy largo sería necesario incluir el poder navegar entre los resultados, con enlaces de «Anterior» y «Siguiente»
Hola Anton, tendrías que modificar el código para hacer lo que estás buscando. En este caso los resultados se buscan recursivamente y se les aplica el cambio a todos.
Para hacer lo que deseas, primeramente guardaría en un array la referencia de cada elemento a cambiar ya envuelto en un `span` pero sin la clase aplicada, y después, en la función de anterior y siguiente, solo le cambiaría la clase a cada uno de los `span` para señalar el resultado.