Ver Mensaje Individual
  #3 (permalink)  
Antiguo 07/03/2014, 11:59
Avatar de Alexis88
Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años, 1 mes
Puntos: 977
Respuesta: Mostrando y ocultando capas con text input

Creo que buscas hacer algo como esto. Sería más sencillo si lo hicieras filtrando los datos con una consulta a una base de datos pues ahí existe el operador de comparación LIKE, el cual permite hacer búsquedas entre los datos almacenados en la base de datos con cualquier caracter escrito en una caja de texto. Sin embargo, he realizado en JavaScript algo que emula dicho comportamiento.

Código HTML:
Ver original
  1. <label for = "buscar">Escribe el nombre del plato:</label>
  2. <input type = "text" id = "buscar" placeholder = "Nombre del plato" autofocus />
  3.     <div>
  4.         <img src = "lentejas.jpg" />
  5.         <span>Lentejas con arroz</span>
  6.     </div>
  7.     <div>
  8.         <img src = "espinacas.jpg" />
  9.         <span>Ensalada de espinacas</span>
  10.     </div>
  11.     <div>
  12.         <img src = "frutas.jpg" />
  13.         <span>Ensalada de frutas</span>
  14.     </div>
  15.     <div>
  16.         <img src = "trigo.jpg" />
  17.         <span>Guiso de trigo</span>
  18.     </div>
  19.     <div>
  20.         <img src = "tomate.jpg" />
  21.         <span>Encebollado con tomate</span>
  22.     </div>

Código Javascript:
Ver original
  1. var buscar = document.getElementById("buscar"),
  2.     platos = document.getElementsByTagName("span"),
  3.     forEach = Array.prototype.forEach;
  4.  
  5. buscar.addEventListener("keyup", function(e){
  6.     var texto = this.value;
  7.  
  8.     forEach.call(platos, function(p){
  9.         if (p.innerHTML.toLowerCase().search(texto.toLowerCase()) == -1)
  10.             p.parentNode.style.display = "none";        
  11.         else
  12.             p.parentNode.style.display = "block";        
  13.     });
  14. }, false);

El procedimiento es sencillo. Cada vez que el usuario suelte una tecla luego de pulsarla (evento keyup), se buscará por cada elemento <span> (que son los que contienen los nombres de cada plato), la coincidencia entre su contenido y el del texto escrito en la caja de texto, para lo cual, primero convertimos a minúsculas a ambos valores (método toLowerCase) para evitar diferencias con mayúsculas y luego, utilizando el método search, obtenemos la posición del texto escrito en el contenido de cada <span>. Para que se entienda mejor esto, el contenido de cada <span> equivale a un array de caracteres, en donde cada caracter es un elemento del array, por lo que la primera letra está ubicada en la posición cero. Por ejemplo, si escribo la palabra ensalada y el contenido del <span> es Ensalada de frutas, obtendremos la posición cero pues es en la que se ubica la palabra que escribimos con respecto al contenido del <span>, recordando siempre que la primera posición es cero.

Este método (search), devuelve -1 cuando no se encuentran coincidencias, por lo que si esto es así, ocultamos el nodo padre del <span> que viene siendo el <div>, caso contrario, lo mostramos.

Te dejo el código completo: http://jsfiddle.net/Alexis88/rEdSk/

Saludos

EDITO: Había olvidado que estamos en el sub-foro de jQuery.

Aquí tienes este mismo ejemplo pero implementado con la librería jQuery:

Código Javascript:
Ver original
  1. var platos = $("span");
  2.  
  3. $("#buscar").keyup(function(e){
  4.     var texto = $(this).val();
  5.  
  6.     platos.each(function(){
  7.         if ($(this).html().toLowerCase().search(texto.toLowerCase()) == -1)
  8.             $(this).parent().hide();
  9.         else
  10.             $(this).parent().show();
  11.     });
  12. });

El resultado es exactamente el mismo que con el código nativo de JS: http://jsfiddle.net/Alexis88/rY4HX/
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 07/03/2014 a las 13:39