Blogs Media: CSS Mania | VivirLatino | Sentido Web | Apps Mania

Publicidad

Mar19Sep2006

Laboratorio: borrar filas de una tabla en Javascript

16:00 H (CET)| Temas: Javascript · Laboratorio

Viendo el otro día la entrada de aNieto2K, recordé el efecto que usa Wordpress para resaltar que se ha borrado una fila de una tabla en las herramientas de administración. Se trata de pintar progresivamente la fila en rojo y luego borrarla, consiguiendo así que el usuario se percate de qué ha pasado.

borrar-fila.png

Vamos a explicar cómo conseguir este efecto, para ello antes vamos a indicar que para que sea más genérico, los colores de las filas (que son distintos para las filas alternas) van a venir por estilos de clase, no en la propia definición de la etiqueta.

Lo primero que tenemos que hacer es ver los estilos que vamos a usar:

tr {
  background: #FFFFFF;
}
/* Para las filas alternas */
tr.par {
  background: #9BCFCF;
}

Después tendremos que modificar las filas, primero cambiando el estilos de las filas alternas y luego añadiendo un id y el evento onclick.

// Modifica la tabla para diferenciar las filas
function transformar(ok) {
  // Obtengo la tabla
  var tabla = document.getElementById("tabla");
  
  // Guardo los datos de la tabla y marco filas alternas
  for (var i=1; i<tabla.rows.length; i++) {
    if (i%2 == 0) {
      tabla.rows[i].className = "par";
    } else {
      // Se tiene que borrar para cuando se redibuja
      tabla.rows[i].className = ""; 
    }
    // La primera vez se llama a la función con ok=true
    // para crear los id y asignar el evento onclick
    if (ok) {
      var id = "TR"+Math.random();
      tabla.rows[i].id = id;
      // Se pone en la variable "concurrencia" el id
      // para que no se pueda ejecutar la función "borrarFila"
      // con otra fila
      tabla.rows[i].onclick = function() {concurrencia=id; borrarFila(this.id, 100);}
    }
  }
}

Después viene la parte que se encarga de borrar las filas, se irá haciendo una llamada sucesiva con un contador que decrementa. El contador llevará el valor del porcentaje de degradado que se está mostrando. Cuando acabe el degradado, se eliminará la fila y se redibujarán las filas alternas.

// Color final que se quiere mostrar
var Rfinal = 255;
var Gfinal = 0;
var Bfinal = 0;
// Incremento en el degradado
var inc = 10;
// Para evitar que se pulsen dos filas a la vez y pueda dar problemas
var concurrencia = "";

// Borra la fila: primero cambiar de color y luego borra la fila
function borrarFila(id, porc) {
  if (concurrencia != id) {
    var obj = document.getElementById(id);
    // Obtengo el color de fondo
    var estilo = obj.tagName + (obj.className == ""? "":"."+obj.className);
    
    // Si el objeto no tiene color de fondo
    // lo buscamos dentro de los estilos
    // y si no se le asigna el blanco
    if (obj.style.backgroundColor == "") {
      var estilos = document.styleSheets;
      for (var i=0; i<estilos.length; i++) {
        var rules = (estilos[i].cssRules)?estilos[i].cssRules:estilos[i].rules;
        for (j=0; j<rules.length; j++) {
          if (rules[j].selectorText.toLowerCase() == estilo.toLowerCase()) {
            obj.style.backgroundColor = rules[j].style.backgroundColor;
          }   
        }
      }
      if (obj.style.backgroundColor == "") {
        obj.style.backgroundColor = "#FFFFFF";
      }
    }
    if (obj.style.backgroundColor.charAt(0) == "#") {
      obj.style.backgroundColor = cambiaEstiloHex2Dec(obj.style.backgroundColor);
    }
    
    // Si se está efectuando el degradado de colores
    if (porc >= 0) {
      // Se calcula el nuevo color, se trata de
      // el incremento o decremento de color
      // del color inicial (o actual) hacia el final
      var colores = obj.style.backgroundColor.match(/rgb\((\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\)/);
      var RGB = "rgb(";
      RGB += (porc==0? Rfinal:parseInt(parseInt(colores[1])-(colores[1]-Rfinal)/(porc/inc)))+",";
      RGB += (porc==0? Gfinal:parseInt(parseInt(colores[2])-(colores[2]-Gfinal)/(porc/inc)))+",";
      RGB += (porc==0? Bfinal:parseInt(parseInt(colores[3])-(colores[3]-Bfinal)/(porc/inc)))+")";
      obj.style.backgroundColor = RGB;
      // Seguimos con el degradado
      setTimeout(function() {borrarFila(id, porc-inc);}, 30);
    } else {
      // Se ha acabado con el degradado
      // por lo que se borra
      obj.parentNode.removeChild(obj);
      // Se redibujan las filas alternas
      transformar();
      // Se libera el proceso
      concurrencia = "";
    }
  }
}

// Cambiar un color del estilo #RRGGBB por uno del tipo rgb(r, g, b)
function cambiaEstiloHex2Dec(valor) {
  var colores = valor.match(/\#([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})/i);
  return "rgb("+hex2dec(colores[1])+","+hex2dec(colores[2])+","+hex2dec(colores[3])+")";
}

// Transforma un numero hexadecimal de dos 
// en uno decimal
function hex2dec(num) {
  var _hex = new Array();
  _hex["0"]=0; _hex["1"]=1; _hex["2"]=2; _hex["3"]=3; 
  _hex["4"]=4; _hex["5"]=5; _hex["6"]=6; _hex["7"]=7; 
  _hex["8"]=8; _hex["9"]=9; _hex["A"]=10; _hex["B"]=11; 
  _hex["C"]=12; _hex["D"]=13; _hex["E"]=14; _hex["F"]=15; 
  
  if (num.match(/([0-9A-F]){2}/i)) {
    return _hex[(num.charAt(0)+"").toUpperCase()]+_hex[(num.charAt(1)+"").toUpperCase()]*16;
  }
  
  return 0;
}

Ejemplo

Relacionados

Feedback (10) » Formulario

1. escael ~ Miércoles, 20 Sep 2006 | 04:29H:

muy interesante el ejemplo pero si la tabla se genera a partir de unos registros de una base de datos, como se podría hacer para que a su vez se eliminen dichos registros?

2. Luis ~ Miércoles, 20 Sep 2006 | 08:25H:

Hola Escael.

Ahora hago una entrada explicándo como se podría hacer usando AJAX (que queda más "bonito").

Saludos

3. Visitante ~ Miércoles, 20 Sep 2006 | 11:24H:

No me gusta la parte que mete el color de fondo de las filas alternas, eso debería ir en el propio html. Rompería todo el sistema MVC.

4. Luis ~ Miércoles, 20 Sep 2006 | 13:02H:

Eso va en gustos, porque hay gente que prefiere no ponerlo en el HTML por el tema de que si cambia en diseño tiene que quitar el estilo de la fila alterna.

De todas formas, yo lo he hecho para ver el efecto sobre distintos colores.

Un saludo.

5. Daniel Pazos ~ Jueves, 16 Nov 2006 | 14:30H:

Está muy bien la propuesta pero creo que se podrían pulir un par de detalles como por ejemplo que no se puede borrar la ultima fila de la lista.

Si descubro por qué espero poder publicarlo para ayudar a los demas ;)

6. Luis ~ Jueves, 16 Nov 2006 | 15:34H:

Hola Daniel.

La verdad es que sí se pueden pulir muchas cosas, y si mejoras el ejemplo te agradecería que nos lo comentaras.

Saludos

7. gmoreno ~ Miércoles, 20 Jun 2007 | 20:33H:

saludos, buen ejemplo para eliminar filas, como han comentado antes, la ultima fila no se puede eliminar, he visto tu codigo y he agregado algunos detalles a la funcion transformar, entonces la funcion quedaria de la siguiente manera:
function transformar(ok) {
// Obtengo la tabla
var tabla = document.getElementById("tabla");
var i=0;
var id=0;
// Guardo los datos de la tabla y marco filas alternas
for ( i=1; i if (i%2 == 0) {
tabla.rows[i].className = "par";
} else {
// Se tiene que borrar para cuando se redibuja
tabla.rows[i].className = "";
}
// La primera vez se llama a la función con ok=true
// para crear los id y asignar el evento onclick
if (ok) {
id = "TR"+Math.random();
tabla.rows[i].id = id;
// Se pone en la variable "concurrencia" el id
// para que no se pueda ejecutar la función "borrarFila"
// con otra fila
tabla.rows[i].onclick = function() {concurrencia=id; borrarFila(this.id, 100);}
}
}
if (ok) {
id = "TR"+Math.random();
tabla.rows[i-1].onclick = function() {concurrencia=id; borrarFila(this.id, 100);}
}
}

ahora si se puede eliminar la ultima fila..
saludos a todos.

8. Luis ~ Jueves, 21 Jun 2007 | 09:48H:

Gracias por aportarnos tu código.

Saludos

9. BiTsHoOt ~ Miércoles, 31 Oct 2007 | 18:33H:

Hola, tu funcion tiene un pequeño error en el for, reemplanzando esa linea la funcion quedaria de la siguiente manera...

function transformar(ok) {
// Obtengo la tabla
var tabla = document.getElementById("tabla");
var i=0;
var id=0;
// Guardo los datos de la tabla y marco filas alternas
for (var i=1; i if (i%2 == 0) {
tabla.rows[i].className = "par";
} else {
// Se tiene que borrar para cuando se redibuja
tabla.rows[i].className = "";
}
// La primera vez se llama a la función con ok=true
// para crear los id y asignar el evento onclick
if (ok) {
id = "TR"+Math.random();
tabla.rows[i].id = id;
// Se pone en la variable "concurrencia" el id
// para que no se pueda ejecutar la función "borrarFila"
// con otra fila
tabla.rows[i].onclick = function() {concurrencia=id; borrarFila(this.id, 100);}
}
}
if (ok) {
id = "TR"+Math.random();
tabla.rows[i-1].onclick = function() {concurrencia=id; borrarFila(this.id, 100);}
}
}


ahora si que esta funcionando perfecto.

10. BiTsHoOt ~ Miércoles, 31 Oct 2007 | 18:45H:


ahhhhhh... salio igual... tienen que cambiar la linea donde esta el for...if en la misma linea por el for de Luis que es la primera funcion, por el de gmoreno.

esta un poco enrredado, pero bueno todos sabemos que esa linea esta mala, funciona solo con reemplazarla...

by.

Conversación

Nombre:

Email:

(no aparecerá)

URL:

(opcional)
¿Recordar datos?

↓ Comentarios (XHTML permitido)