A la hora de mostrar tablas, el orden por el cual está ordenada puede ayudarnos a ver con mayor facilidad la información que contiene, ordenada por distintas columnas pueder revelar diferentes aspectos sobre los datos que almacena.
En el caso de que la tabla se genere dinámicamente (consulta a una BD y mostrándola mediante una JSP o una página PHP), cuando se quiere volver a ordenar la tabla por otra columna, se vuelve a cargar la página para que la tabla se actualice. Cuando se trata de una página estática se debería cargar otra página distinta. Todo esto no es necesario si se realiza la ordenación mediante Javascript.
<< Ocultar resto
Antes de nada, hay que tener en cuenta que este tipo de ordenación de tablas solo se debe hacer cuando se muestran todos los registros, cuando no hay
paginación de resultados, ya que cuando se reordena una tabla paginada, los datos que actualmente se muestran, pueden estar en páginas posteriores una vez se ha aplicado el orden.
El método que vamos a usar es sencillo, los datos de la tabla los vamos a meter en un array de arrays, luego dibujaremos la tabla dinámicamente (usando un DIV y el innerHTML) y luego mediante la capacidad que ofrece Javascript para
ordenar arrays, mostraremos la tabla según el criterio que queramos.
Necesitamos tres variables globales: una de ella contendrá los datos de la tabla, otra el índice de la columna por la que se ordena y la última si el orden es ascendente o descendente:
var orden = 0;
var ascendente = true;
var datos = new Array();
datos[0] = new Array('Andalucía ', 7340052, 7849799);
datos[1] = new Array('Aragón ', 1189909, 1269027);
Pasemos ahora a las funciones, la primera de ellas es la que se encarga de cmabiar el criterio de orden, según el índice que se pasa por parámetro, si es el mismo que el que ya estaba, se cambia el sentido (ascendente/descendente) y si no es así, se cambia el indice y se pone el sentido como ascendente.
function cambiar(ind) {
if (ind == orden) {
ascendente = !ascendente;
} else {
orden = ind;
ascendente = true;
}
dibujarTabla();
}
La siguiente función es la que se usa en el método de ordenación, se pasa como parámetro a la función sort y tiene como parámetros dos elementos del array que se ordena. Devuelve 1 para el elemento mayor y -1 para el menor.
function organizar(a, b) {
var signo = ascendente? 1:-1;
return (a[orden] > b[orden]) ? signo : -signo;
}
Por último la función que dibuja la tabla, simplemente crea el código HTML necesario y lo inserta usando innerHTML en un div que tiene el id=tabla.
function dibujarTabla() {
var html = "<table>";
html += '<tr><th onclick="cambiar(0)">';
html += 'Comunidad/Ciudad Autónoma <img src="';
html += ((orden == 0)?
(ascendente? 'ord-asc.gif':'ord-des.gif'):
'ord-no.gif');
html += '"></th>';
html += '<th onclick="cambiar(1)">';
html += 'Habitantes (2000) <img src="';
html += ((orden == 1)?
(ascendente? 'ord-asc.gif':'ord-des.gif'):
'ord-no.gif');
html += '"></th>';
html += '<th onclick="cambiar(2)">';
html += 'Habitantes (2005) <img src="';
html += ((orden == 2)?
(ascendente? 'ord-asc.gif':'ord-des.gif'):
'ord-no.gif');
html += '"></th></tr>';
datos.sort(organizar);
for (var i=0; i<datos.length; i++) {
html += '<tr><td>'+datos[i][0]+
'</td><td>'+datos[i][1]+
'</td><td>'+datos[i][2]+
'</td></tr>';
}
html += '</table>';
document.getElementById("tabla").innerHTML = html;
}
Podéis bajaros un ejemplo aquí:
ARCHIVO
10 Comentarios:
¡Un código genial! Fácil de entender, aplicar y con unos resultados increibles.
Enhorabuena por el blog y gracias por compartir cosas como esta.
Por Anónimo, a las 10/26/2006 01:43:00 a. m.
De nada, me alegro de que te haya gustado.
Saludos
Por Anónimo, a las 10/26/2006 08:37:00 a. m.
El código está muy bien explicado pero al ordenar numéricamente no funciona... Estoy intentando solucionarlo.
Gracias por todo.
Por Anónimo, a las 12/11/2006 05:11:00 p. m.
¿Por que dices que no funciona?, no llego a ver el fallo.
Por Anónimo, a las 12/11/2006 11:44:00 p. m.
no funciona con numeros porque a la hora de ordenar los toma a estos como cadenas, es decir, la secuencia de numeros siguiente 0, 1, 2, ..., 10; la ordena 0,1,10,2,... Esto se soluciona sabiendo de antemano que la columna a ordenar es un numero, entonces se invocaria otro metodo de ordenamiento como:
function organizarNumero(a,b){
var parseA=parseFloat(a[orden]);
var parseB=parseFloat(b[orden]);
return ascendente? (parseA - parseB):(parseB - parseA);
};
En este caso se parsea a float por que los valores que se ordenan son muy grandes.
Muchas gracias por su codigo, me sirvio de mucho, ya que yo casi no sabia javascript cuando lo utilice.
Por Anónimo, a las 2/22/2007 04:00:00 p. m.
Gracias Neto por aportar parte de tu código.
Saludos
Por Anónimo, a las 2/22/2007 06:15:00 p. m.
cuando hay paginacion,tendria que volver a hacer la consulta en la base de datos....o volver a cargar el arreglo en tu casa
muy bueno el articulo
saludos
Por Anónimo, a las 9/11/2007 08:39:00 p. m.
Este comentario ha sido eliminado por el autor.
Por Unknown, a las 9/11/2007 08:40:00 p. m.
Lo siento, este ejemplo no vale con paginación.
Por Anónimo, a las 9/11/2007 11:45:00 p. m.
Hola..estoy intentando bajar el ejemplo pero no consigo hacerlo, el link está roto ... dónde más puedo conseguirlo?
Gracias
Por Unknown, a las 2/13/2009 04:45:00 p. m.
Publicar un comentario
<< Inicio