Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Problema con filtros

Estas en el tema de Problema con filtros en el foro de Frameworks JS en Foros del Web. Hola foreros tengo hoy esta duda con jquery, Miren este código lo que pretende es ocultar aquellas filas que en la columna N no contengan ...
  #1 (permalink)  
Antiguo 10/04/2012, 09:47
 
Fecha de Ingreso: noviembre-2010
Mensajes: 95
Antigüedad: 13 años, 5 meses
Puntos: 5
Problema con filtros

Hola foreros tengo hoy esta duda con jquery,

Miren este código lo que pretende es ocultar aquellas filas que en la columna N no contengan un valor especifico, para ser más claro quiero hacer filtros en una tabla y este es la función que lo hace

Donde ind es la variable de índice de la colimna y o es el objeto que contiene el valor a buscar o mejor dicho filtrar.

Código Javascript:
Ver original
  1. $.filterUp = function(ind,o){
  2.     var a = $('#content_table > table tr:gt(0):not(.optionfilter)'),
  3.     b = o.html(),
  4.     c = a.length,
  5.     d = '';
  6.     if(b=='...'){
  7.         $('#content_table > table tr').removeClass('optionfilter')
  8.         $('#toolbar-left').positionToolBar();
  9.         return false;
  10.     }
  11.    
  12.     for(i=1;i<=$('#content_table > table tr:gt(0)').length;i++){
  13.         d = $('#content_table > table tr:eq('+i+') > td:eq('+ind+')').html();
  14.         if(d!=b){
  15.             $('#content_table > table tr:eq('+i+')').addClass('optionfilter');
  16.         }
  17.     }
  18.     $('#toolbar-left').positionToolBar();
  19. };

Bueno si hace el procesos y si filtra pero hay un problema que alenta mucho la maquina puesto que hay un ciclo for, que si hay 1500 registros va a cada registro a hacer la comparación.

Entonces lo que eh trato de hacer es con los selectores de jquery pero aun asi no me queda y es la ayuda que ando buscando, como puedo hacer mas rápido el filtrado si tuviese +1000 de registros.

creo que el selector deberia de ser algo asi

Código Javascript:
Ver original
  1. $('#content_table > table tr:gt(0):not(\':contains("'+b+'")\')').addClass('optionfilter');

gracias
  #2 (permalink)  
Antiguo 10/04/2012, 11:00
Avatar de Naahuel  
Fecha de Ingreso: marzo-2011
Ubicación: localhost
Mensajes: 796
Antigüedad: 13 años, 1 mes
Puntos: 192
Respuesta: Problema con filtros

1ro: Existe ya un plugin que hace eso. Lo he usado muchas veces y es rápido:
http://www.picnet.com.au/picnet-table-filter.html

2do: Relativo a tu problema. Tu error es un grave error de absolutamente el 100% de las personas que inician en jQuery sin saber JavaScript (me incluyo). Uno se cansa de ver códigos así:

Código Javascript:
Ver original
  1. $('#selector').metodo_1();
  2. $('#selector').metodo_3();
  3. $('#selector').metodo_4();
  4. $('#selector').metodo_5();
  5. $('#selector').metodo_6();

O en tu caso:

Código Javascript:
Ver original
  1. for (..){
  2.     $('#selector').metodo();
  3. }

La función $() recibe un selector CSS como parámetro. jQuery usa un parser especial para recorrer el DOM buscando y recolectando los elementos que coinciden con el selector. Si llamás a la función $() en cada ciclo, pues claro que te va a andar lento. Más todavía con selectores tan complejos.

Solución:

Código Javascript:
Ver original
  1. var elemento = $('#selector');
  2. for (..){
  3.     elemento.metodo();
  4. }

Hay muchas formas de hacer tu código funcionar con jQuery y que sea eficiente. La regla 1 es no obtener los elementos que necesitamos 1000000 veces.

-edit-

Analizando mejor tu código, veo que si es necesario usar un selector en cada ciclo. Sin embargo probablemente exista una forma mejor, como almacenar la tabla completa en la memoria y analizarla desde ahí usando .filter() en lugar de recorrer el DOM millones de veces.
__________________
nahueljose.com.ar
  #3 (permalink)  
Antiguo 10/04/2012, 11:21
 
Fecha de Ingreso: noviembre-2010
Mensajes: 95
Antigüedad: 13 años, 5 meses
Puntos: 5
Respuesta: Problema con filtros

Si creo que mando llamar muchas veces lo mismo y estar comparando, pero suena bien lo de almacenar en memoria pero el detalle es como y que procesos se llevaran cuando este ahi, y pues si habia visto plugins que lo hacen pero ninguno me convencio como para agregarlo en mi pagina, por eso mejor me dispuse hacer uno y creo que el que me recomiendas se acerca a lo que necesito, y pero como aria eso de almacenar en memoria y trabajr desde ahi la tabla
  #4 (permalink)  
Antiguo 10/04/2012, 12:25
Avatar de Naahuel  
Fecha de Ingreso: marzo-2011
Ubicación: localhost
Mensajes: 796
Antigüedad: 13 años, 1 mes
Puntos: 192
Respuesta: Problema con filtros

Te hice un código de ejemplo como para que estudiemos el asunto.
Probá este código:

Código HTML:
Ver original
  1. <!doctype html>
  2.     <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
  3.     <script type="text/javascript">
  4.         $(function(){
  5.             //############################################
  6.             //llenar la tabla, ignorar esta parte
  7.             //############################################
  8.             var s_html = '';
  9.             var i_num_elems = 1000;
  10.             var i_rnd;
  11.             for(i=0; i<i_num_elems; i++){
  12.                 i_rnd = Math.floor(Math.random()*1111);
  13.                 s_html += '<tr><td>'+ i_rnd  +'</td><td>'+ (i_rnd/2) +'</td><td>'+ (i_rnd/3) +'</td></tr>';
  14.             }
  15.             $('table tbody').html(s_html);
  16.            
  17.             //############################################
  18.             //Obtener la tabla y otros elementos
  19.             //############################################
  20.             var $tabla          = $('table.filtrar');
  21.             var $tabla_row  = $tabla.find('tbody tr');
  22.            
  23.             //############################################
  24.             // Filtrado
  25.             //############################################
  26.             var $inp_filtro = $('input.filtro');        //obtener el elemento que filtra
  27.             var s_val = '';
  28.             var $self, $padre;
  29.             $inp_filtro.keyup(function(){               //filtrar la tabla al escribir
  30.                 s_val = $(this).val();
  31.                 $tabla_row.show().filter(':not(:contains("'+ s_val +'"))').hide();
  32.             });
  33.         });
  34.     </script>
  35.     <title>Filtro de tabla</title>
  36. </head>
  37.     <p><label>Filtro: </label><input type="text" class="filtro" /></p>
  38.     <table class="filtrar" border="1">
  39.         <thead>
  40.             <tr>
  41.                 <th>Encabezado 1</th>
  42.                 <th>Encabezado 2</th>
  43.                 <th>Encabezado 3</th>
  44.             </tr>
  45.         </thead>
  46.         <tbody>
  47.             <!--tabla vacia, llenada con valores arbitrarios-->
  48.         </tbody>
  49.     </table>
  50. </body>
  51. </html>

Cambiá la variable i_num_elems para agregar o quitar filas. Creo que es bastante rápido. Lo probé con 2000 filas y la demora que tiene es relativamente pequeña.

Observá que no recorremos el DOM continuamente ni tampoco usamos ciclos (al menos no en nuestro código, pero los sí en los métodos de jQuery). Solamente usamos .filter() para filtrar la colección de filas que guardamos en la memoria en la variable $tabla_row.
__________________
nahueljose.com.ar

Etiquetas: filtros, html, jquery
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:21.