Codiguillos de JavierB

Filtrar filas en una tabla

Vamos a ver un ejemplo en el que los datos de una tabla se filtran según lo que se vaya escribiendo en un cuadro de texto. Pulsando en la celda del encabezado se puede seleccionar la columna que se va a filtar.

 

García LópezJosé55123678
Benito del RíoPedro43198265
Gomez PozoJosua55512905
Benitez SánchezAndrés44592718
Rosales RosalesAntonio4318742

El código del formulario y de la tabla es el que os pongo a continuación. He utilizado botones en los encabezados para que se puedan pulsar también con el teclado, así son accesibles a los que no dispongan de ratón

<form class="formu" action=''>
<p><label for="fil1">Principio:<input type="radio" name="rad" id="fil1" checked="checked" /></label>
<label for="fil2">Final:<input type="radio" name="rad" id="fil2" /></label>
<label for="fil3">Contiene:<input type="radio" name="rad" id="fil3" /></label>
</p>
</form>
<p> </p>
<table class="tabla" id="tab">
<tr class="encabezado">
<th>
<input type="button" value="Apellidos" onclick="selecciona(this,0)" onkeypress="selecciona(this,0)" />
</th>
<th>
<input type="button" value="Nombre" onclick="selecciona(this,1)" onkeypress="selecciona(this,1)" />
</th>
<th>
<input type="button" value="D.N.I." onclick="selecciona(this,2)" onkeypress="selecciona(this,2)" />
</th>
</tr>
<tr>
<td class="celdasel">García López</td><td>José</td><td>55123678</td>
</tr>
<tr>
<td class="celdasel">Benito del Río</td><td>Pedro</td><td>43198265</td>
</tr>

También podeis ver el código JavaScript para seleccionar la columna y filtrar las filas:

var colum=0; // columna por la que se filtrará
var valor; // value del botón que se ha pulsado

function selecciona(obj,num) {
  t = document.getElementById('tab');
  filas = t.getElementsByTagName('tr');
  // Deseleccionar columna anterior
  for (i=1; ele=filas[i]; i++) 
    ele.getElementsByTagName('td')[colum].className='';
  // Seleccionar columna actual
  colum=num;
  for (i=1; ele=filas[i]; i++)
    ele.getElementsByTagName('td')[colum].className='celdasel';
  // Cambiar botón por cuadro de texto
  valor = obj.value;
  celda = obj.parentNode;
  celda.removeChild(obj);
  txt = document.createElement('input');
  celda.appendChild(txt);
  txt.focus();
  txt.onblur = function() {ponerBoton(this,num)};
  txt.onkeyup = function() {filtra(this.value)};
  // Desactivar los demás botones
  for (i=0; ele=t.getElementsByTagName('input')[i]; i++)
    if (ele.type == 'button') ele.disabled=true;
}

function ponerBoton(obj,num) {
  celda = obj.parentNode;
  celda.removeChild(obj);
  boton = document.createElement('input');
  boton.type = 'button';
  boton.value = valor;
  boton.onclick = function() {selecciona(this,num)}
  boton.onkeypress = function() {selecciona(this,num)}
  celda.appendChild(boton);
  // Activar botones
  for (i=0; ele=t.getElementsByTagName('input')[i]; i++)
    ele.disabled=false;
}

function filtra(txt) {
  t = document.getElementById('tab');
  filas = t.getElementsByTagName('tr');
  for (i=1; ele=filas[i]; i++) {
    texto = ele.getElementsByTagName('td')[colum].innerHTML.toUpperCase();
    for (j=0; ra=document.forms[0].rad[j]; j++) // Comprobar radio seleccionado
      if (ra.checked) num = j;
      
    if (num==0) posi = (texto.indexOf(txt.toUpperCase()) == 0);
    else if (num==1) posi = (texto.lastIndexOf(txt.toUpperCase()) == texto.length-txt.length);
    else posi = (texto.indexOf(txt.toUpperCase()) != -1);
    ele.style.display = (posi) ? '' : 'none';
  } 
}

Subir Subir

 
  • Validar XHTML 1.0
  • Validar Css