Resaltar texto (highlight) para html con jQuery


En este tutorial veremos como resaltar texto (highlight) de una página web (html). Comúnmente esta técnica es utilizada para mostrar las palabras o partes de ellas en los resultados de una búsqueda.
Pueden ver el ejemplo en vivo acá y descargar los archivos del tutorial acá.

  1. Creamos un archivo html.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!DOCTYPE>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Resaltar textos con jquery - bakía</title>
    </head>
    <body>
    </body>
    </html>
  2. Dentro de la etiqueta <head> insertamos la última librería de jQuery.
    1
    2
    3
    4
    5
    6
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Resaltar textos con jquery - bakía</title>
    <script src="http://code.jquery.com/jquery-latest.min.js"
           type="text/javascript"></script>
    </head>
  3. Dentro de la etiqueta <body> insertamos un <div id="texto"> en el cual estará el texto que vamos a resaltar.
    1
    2
    3
    4
    5
    6
    7
    8
    <body>
        <div id="texto">
    bakia Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
    Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
    Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
        </div>
    </body>
  4. Ahora insertamos un cuadro de texto donde pondremos la palabra a buscar y un botón que accionará una función de javascript que resalte el texto.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    .
    ..
    ...
    <body>
    <input type="text" id="cajaTexto"/>
    <input type="button" value="resaltar" onClick="resaltarTexto();"/>
    ...
    ..
    .
  5. En la etiqueta <head> creamos una función extendida de jQuery que se encarge de resaltar el texto. resaltarTexto();.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    .
    ..
    ...
    <script type="text/javascript">
    jQuery.fn.extend({
        resaltar: function(busqueda, claseCSSbusqueda){
            var regex = new RegExp("(<[^>]*>)|("+ busqueda.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1") +')', 'ig');
            var nuevoHtml=this.html(this.html().replace(regex, function(a, b, c){
                return (a.charAt(0) == "<") ? a : "<span class=\""+ claseCSSbusqueda +"\">" + c + "</span>";
            }));
            return nuevoHtml;
        }
    });

    </script>
    </head>
    ...
    ..
    .

    Está función se acciona a travez de un selector de jQuery, es decir así $("#DIV").resaltar("texto a resaltar",claseCSS);. Está función recibe dos variables.
    1) busqueda: esta es el texto a resaltar.
    2) claseCSSbusqueda: esta es la clase CSS que se insertará en los distintos resultados que encuentre la función.

    Es decir si tenemos el siguiente texto:

    1
    2
    bakia Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
    Ut enim ad minim veniam, quis....

    y buscamos la palabra bakia, debemos llamar la función de la siguiente forma:
    $("#DIV").resaltar("bakia","resaltarTexto");
    el resultado debe ser:

    1
    2
    <span class="resaltarTexto">bakia</span> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
    Ut enim ad minim veniam, quis....

    Esto nos permite crear un estilo CSS específico para estos resultados de busqueda.

  6. Ahora entonces debemos crear la función resaltarTexto(), en donde llamaremos a la función extendida de jQuery.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    .
    ..
    ...
    function resaltarTexto(){
        $("#texto").resaltar(cajaTexto.value, "resaltarTexto");
    }
    </script>
    ...
    ..
    .

    Ahora entonces la función de extendida de jQuery buscará en el <div id="texto"> todos las coincidencias del <input type="text" id="cajaTexto"/> y les pondrá la clase "resaltarTexto"

  7. Para finalizar debemos insertar los estilos para la clase CSS "resaltarTexto".
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    .
    ..
    ...
    <style>
    .resaltarTexto{
        color: #F3AA04;
        background-color: #FFFF96;
    }
    </style>

    </head>
    ...
    ..
    .
  8. El resultado final de nuestro archivo html debe ser el siguiente:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <!DOCTYPE>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Resaltar textos con jquery - bakía</title>
    <script src="http://code.jquery.com/jquery-latest.min.js"
           type="text/javascript"></script>

    <script type="text/javascript">
    jQuery.fn.extend({
        resaltar: function(busqueda, claseCSSbusqueda){
            var regex = new RegExp("(<[^>]*>)|("+ busqueda.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1") +')', 'ig');
            var nuevoHtml=this.html(this.html().replace(regex, function(a, b, c){
                return (a.charAt(0) == "<") ? a : "<span class=\""+ claseCSSbusqueda +"\">" + c + "</span>";
            }));
            return nuevoHtml;
        }
    });


    function resaltarTexto(){
        $("#texto").resaltar(cajaTexto.value, "resaltarTexto");
    }
    </script>
    <style>
    .resaltarTexto{
        color: #F3AA04;
        background-color: #FFFF96;
    }
    </style>

    </head>
    <body>
    <input type="text"  id="cajaTexto"/>
    <input type="button" value="resaltar" onClick="resaltarTexto();"/>
        <div id="texto">
    bakia Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
        </div>
    </body>
    </html>

12 comentarios en “Resaltar texto (highlight) para html con jQuery

  1. Parecerá gracioso, pero no encontraba una función que haga exactamente eso, solo buscar en la misma web! Ademas que la podemos modificar, maravilloso. Simplemente gracias al que posteó el artículo.

  2. Excelente funcion, pero se le podria agregar algo como en el navegador crome el buscador, por ejemplo pongo una palabra y me reconosca si es minuscula o mayuscula tilde sin tilde etc…

  3. despues de mucho mucho buscar, es lo mejor que encontre!!!! Excelente ayuda!!! mil felicidades!!! explicado de lujo… no falle!!! muchas gracias… muchas gracias. gracias… gracias.

  4. Para “resetear” reemplazas los span que crea la función resaltarTexto() con este código
    $(‘#texto’).find(“span”).each(function () {
    $(this).replaceWith(function () {
    return $(this).text();
    });
    });

    • Con esto consigues formatear el texto pero no puedes hacer otra busqueda, eso todavia con lo he conseguido, pero siempre puedes hacer un F5.

      Debajo de la funcion resaltarTexto:

      function resetTexto(){
      $(“#texto”).resaltar(cajaTexto.value, “resetTexto”);

      En el style

      .resetTexto{
      color: #000000;
      background-color: #FFFFFF;

      Agregar un input:

      • ESTE ES EL CORRECTO:

        Con esto consigues formatear el texto pero no puedes hacer otra busqueda, eso todavia no lo he conseguido, pero siempre puedes hacer un F5.

        Debajo de la funcion resaltarTexto:

        function resetTexto(){
        $(“#texto”).resaltar(cajaTexto.value, “resetTexto”);

        En el style

        .resetTexto{
        color: #000000;
        background-color: #FFFFFF;

        Agregar un input:

  5. Hola esta genial su tutorial, pero tengo una pregunta el buscador “busca” la palabra de forma exacta,

    me gustaría extenderlo un poco para que detecte singulares y plurales por ejemplo, si busco la palabra “mensaje de datos” para que busque también los resultados que encuentre como “mensajes de datos” o viceversa, alguna idea ?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

* *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>