Crear filtro de búsqueda con jQuery

producto

Crear filtro de búsqueda con jQuery

Después de mucho tiempo vuelvo con una nueva entrada en el blog. Como la gran mayoría de mis posts, este también fué una necesidad de un proyecto que estaba creando.

En este caso lo que vamos a hacer es crear un filtro de búsqueda con jQuery muy sencillo.

Puedes descargarte el archivo al final de la entrada 😉

Demo

¡Vamos a empezar!

Para éste tutorial sería conveniente que tuvieras conocimientos básicos de HTML y jQuery.

Primero de todo creamos un archivo html5 llamado index.html con un link css de fontawesome, otro de main.css y un script de jquery antes del final del cierre de la etiqueta </body>:

<!DOCTYPE html>
<html lang="es">
<head>
 <meta charset="UTF-8">
 <title>filtro jQuery</title>
 <!-- FONTAWESOME STYLES-->
 <link href="css/font-awesome.css" rel="stylesheet" />
 <link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
</body>
</html>

Dentro del body creamos un div contenedor con un identificador «container«. Dentro del contenedor añadimos un título «h1«, un div con una clase llamada contenido y dentro de este div creamos dos divisiones:

la primera con una clase «search» donde añadiremos nuestro campo de búsqueda:

<div class="search">
 <input type="text" id="busqueda" placeholder="Buscar ...">
 <i class="fa fa-search"></i>
 </div>

Y la otra una lista desordenada con distintos campos dentro de un título «h3«:

<ul>
 <li>
 <h3>lorem ipsum</h3>
 </li>
 <li>
 <h3>non ultrices</h3>
 </li>
 <li>
 <h3>In augue lacus</h3>
 </li>
 <li>
 <h3>Maecenas semper</h3>
 </li>
 <li>
 <h3>ridiculus mus</h3>
 </li>
 <li>
 <h3>Vivamus sapien</h3>
 </li>
 <li>
 <h3>augue massa</h3>
 </li>
 <li>
 <h3>Nulla faucibus</h3>
 </li>
 <li>
 <h3>Sed non libero</h3>
 </li>
 </ul>

*El texto es un lorem ipsum 😉

Aquí tienes el código completo:

<!DOCTYPE html>
<html lang="es">
<head>
 <meta charset="UTF-8">
 <title>filtro jQuery</title>
 <!-- FONTAWESOME STYLES-->
 <link href="css/font-awesome.css" rel="stylesheet" />
 <link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
 
 <div id="container">
 <h1>Filtro <span>jQ</span>uery <img src="img/logo.png"></h1>
 <div class="content">
 <div class="search">
 <input type="text" id="busqueda" placeholder="Buscar ...">
 <i class="fa fa-search"></i>
 </div>
 <ul>
 <li>
 <h3>lorem ipsum</h3>
 </li>
 <li>
 <h3>non ultrices</h3>
 </li>
 <li>
 <h3>In augue lacus</h3>
 </li>
 <li>
 <h3>Maecenas semper</h3>
 </li>
 <li>
 <h3>ridiculus mus</h3>
 </li>
 <li>
 <h3>Vivamus sapien</h3>
 </li>
 <li>
 <h3>augue massa</h3>
 </li>
 <li>
 <h3>Nulla faucibus</h3>
 </li>
 <li>
 <h3>Sed non libero</h3>
 </li>
 </ul>
 </div>
 </div><!-- /container -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
</body>
</html>

Una vez creado nuestro index.html, vamos a añadir un poco de estilo a nuestro documento. Para ello creamos un archivo main.css dentro de una carpeta css donde añadiremos el siguiente contenido:

* {
font-family: Arial;
}
#container {
text-align: center;
max-width: 1170px;
margin: 0 auto;
}
h1 span {
color: red;
}
h1 img {
max-width: 200px;
}
.content {
margin-top: 60px;
}
.search {
max-width: 300px;
margin: 0 auto;
position: relative;
}
.search input {
width: 300px;
padding: 10px;
border: 1px solid #cecece;
border-radius: 3px;
}
.search i {
position: absolute;
cursor: pointer;
right: -12px;
top: 9px;
}
ul {
padding: 0px;
margin-top: 40px;
}
ul li {
list-style-type: none;
float: left;
border: 1px solid #cecece;
padding: 10px;
margin: 10px;
width: 347px;
}

No comento el código porque entiendo que tienes conocimientos mínimos de css.

El resultado sería el siguiente:

ejemplo filtro jquery

Ahora le toca a lo bueno, el jQuery. ya hemos añadido el script que llama a jQuery antes del cierre de la etiqueta </body>, ahora solo nos queda crear un script (puedes crearlo a parte y llamarlo desde index.html) justo debajo de del anterior script e inicializamos jQuery:

$(document).ready(function(){
//código jQuery
});

vamos a empezar con el código y la funcionalidad del script. Primero de todo creamos 2 variables, una para el campo de texto y otra para el título que contiene cada lista:

$(document).ready(function(){
var busqueda = $('#busqueda'),
titulo = $('ul li h3');
});

A continuación añadimos la siguiente sintaxis:

$(titulo).each(function(){
var li = $(this);
//si presionamos la tecla
$(busqueda).keyup(function(){
//cambiamos a minusculas
this.value = this.value.toLowerCase();
//
var clase = $('.search i');
if($(busqueda).val() != ''){
$(clase).attr('class', 'fa fa-times');
}else{
$(clase).attr('class', 'fa fa-search');
}
if($(clase).hasClass('fa fa-times')){
$(clase).click(function(){
//borramos el contenido del input
$(busqueda).val('');
//mostramos todas las listas
$(li).parent().show();
//volvemos a añadir la clase para mostrar la lupa
$(clase).attr('class', 'fa fa-search');
});
}
//ocultamos toda la lista
$(li).parent().hide();
//valor del h3
var txt = $(this).val();
//si hay coincidencias en la búsqueda cambiando a minusculas
if($(li).text().toLowerCase().indexOf(txt) > -1){
//mostramos las listas que coincidan
$(li).parent().show();
}
});
});

Aunque el código está bien comentado vamos a explicarlo por partes:

$(titulo).each() -> Lee cada uno de los títulos de cada <li> y creamos una variable general que representará cada una de ellas con var li = $(this);

$(busqueda).keyup(function() -> le decimos que al presionar una tecla dentro del campo de texto haga toda la función y creamos una variable pasándola a minuscuas -> this.value = this.value.toLowerCase();

Puedes provarlo en el ejemplo. Si escribes con mayusculas automáticamente pasa el texto a minusculas.

Le pedimos una condición con if($(busqueda).val() != ») con el que pedimos que: si el campo de texto está vacío, cambie la clase de la <i> de fontawesome a fa fa-times que es una X y sinó else, cambie la clase a fa fa-search que es el icono de la lupa.

En otra condición le pedimos que si la clase de la etiqueta <i> es fa-times (X), al hacer click, borre el contenido del campo de texto con $(busqueda).val(»);

Y por último ocultamos o mostramos según el resultado del campo de búsqueda de la siguiente forma:


//ocultamos toda la lista
$(li).parent().hide();
//valor del h3
var txt = $(this).val();
//si hay coincidencias en la búsqueda cambiando a minusculas
if($(li).text().toLowerCase().indexOf(txt) > -1){
//mostramos las listas que coincidan
$(li).parent().show();
}

Lo que hacemos es primero ocultar todos los <li> y si hay alguna coincidencia con el contenido del campo de texto lo muestre.

Bueno, espero que te hayas enterado como mínimo de la mitad…

Aún así puedes descargarte el archivo y hacer con el lo que te de la gana 😉

Si tienes alguna duda puedes dejar un comentario o enviarme un mensaje privado en contacto.

8 Comentarios
  • Luis Perez
    Publicado el 08:22h, 29 enero Responder

    Hice tu ejemplo pero en un ejemplo dentro de un li hay 2 h3 uno con dígitos y otro con letras, y con ello no me hace el filtro, me toma solo letra o solo numero.

    Como puedo cambiar eso

    • santiakus
      Publicado el 15:27h, 29 enero Responder

      Hola,

      creo que porque lo que hace es buscar el texto del título por lo que lo hace con el primer h3 que encuentra…

      Prueba en crear una variable que abarque el padre de los 2 h3:

      titulo = $('ul li');//li es donde aparecen los 2 h3

      Prueba y me comentas 😉

  • Pedro Gil Guzman
    Publicado el 10:53h, 21 enero Responder

    Hola Amigos, le di un par de vueltas al código. Generalmente, queremos filtrar por un listado que hemos sacado de una base de datos, por lo que os voy a mostrar un ejemplo que simplifica y es muy útil,

    Para empezar, cuando hagamos un listado, podemos encerrar dentro de un div o cualquier otro contenedor el contenido que vamos a filtrar, siguidamente un hidden sobre el valor que queremos filtrar

    Al contenedor padre le asignamos el comiendo de id parent_ y el id del registros. Al hidden le añadimos el tributo id_regitro que luego vamos a utilizar para identificar rápidamente al parent. Con esta prática, realmente podríamos ubicar el hidden en cualerquier parte del html y actuaría exactamente igual. Ahora viene el script :

    El input sobre el que vamos a escribir lo hemos llamado filtrar_resultado:

    $(document).on(‘keyup’, ‘[name=»filtrar_resultados»]’ , function(){
    // este es el valor del input
    var term = $(this).val();
    term = term.toLowerCase();

    $(‘[name=»campo_filtrar»]’).each(function(){
    // este es el valor del hidden
    var txt = $(this).val();
    txt = txt.toLowerCase();
    // este es el valor del id del registro el cual vamos a usar para hacer hide y show del parent
    var id_registro = $(this).attr(‘id_producto’);
    // escndemos parent
    $(‘#parent_’+id_producto).hide();

    if(txt.indexOf(term) > -1){
    // mostramos coincidencia
    $(‘#parent_’+id_producto).show();

    }
    });

    });

    Espero sirva de ayuda a alguien!! saludos

    • santiakus
      Publicado el 11:41h, 23 enero Responder

      Hola Pedro,

      ¡muchas gracias por tu aporte! ::)

  • Aurelio Mendoza
    Publicado el 00:31h, 27 abril Responder

    Voy a tratar de ponerlo a funcionar en mi pagina web, ojala me funcione, tu sabes si necesito agregar algo a un tablero de codepen?

  • abgel
    Publicado el 23:21h, 02 junio Responder

    Muchas gracias, tendras un ejemplo que incluya el html, soy novato y me cuesta mucho. gracias

  • JORGE ANDRES
    Publicado el 21:44h, 29 junio Responder

    Amigo, Que tal. Requiero un algoritmo como el que dices para implementar un filtro en una lista de base de datos. Pero lo que no le entiendo es como seria el codigo de la vista o el html. Si es posible hacerme un ejemplo mas claro del html

  • Julian Canche
    Publicado el 15:10h, 15 enero Responder

    Excelente Post. En si el código me dio una idea de como resolver este problema. Use menos líneas de código pero me sirvió demasiado!!!

Añadir Comentario