2009-06-12 8 views
6

Permítanme comenzar pidiendo disculpas por no dar un fragmento de código. El proyecto en el que estoy trabajando es de propiedad y me temo que no puedo mostrar exactamente en lo que estoy trabajando. Sin embargo, haré todo lo posible para ser descriptivo.Agilización de jQuery empty() o replaceWith() Funciones al tratar con elementos DOM grandes

He aquí un desglose de lo que sucede en mi solicitud:

  1. usuario hace clic en un botón de
  2. Server recupera una lista de imágenes en forma de una tabla de datos
  3. Cada fila de la tabla contiene de 8 celdas de datos que a su vez contienen cada uno hipervínculo
    • cada solicitud por parte del usuario puede contener hasta 50 filas (I puede cambiar este número si es necesario)
    • Eso significa que la tabla contiene más de 800 elementos DOM individuales
    • Mi análisis muestra que jQuery("#dataTable").empty() y jQuery("#dataTable).replaceWith(tableCloneObject) ocupan el 97% del tiempo total de proceso y tardan en promedio 4 - 6 segundos en completarse.

estoy buscando una manera de acelerar cualquiera de las funciones de jQuery antes mencionados cuando se trata de elementos masivos DOM que necesitan ser removidos/reemplazado. Espero que mi explicación ayude.

Respuesta

8

jQuery empty() tarda mucho tiempo en su mesa, ya que hace una cantidad verdaderamente monumental de trabajo con el contenido del elemento de vaciado en el interés de la prevención de pérdidas de memoria. Si se puede vivir con ese riesgo, puede omitir la lógica utilizada y sólo hacer la parte que se deshace de los contenidos de la tabla de este modo:

while (table.firstChild) 
     table.removeChild(table.firstChild); 

o

table.children().remove(); 
+0

Esto funcionó. Haré más trabajo con respecto a las posibles pérdidas de memoria, pero esto aceleró por completo las cosas. ¡Gracias a todos! –

+0

La primera manera funcionó, no la segunda, que todavía me da un desbordamiento de pila en tablas grandes (50k filas). – Nico

0

¿Tiene que volver a llenar todo de una vez, o puede hacerlo en trozos en un setTimeout()? Me doy cuenta de que probablemente llevará más tiempo en pedazos, pero vale la pena para el usuario ver que algo sucede en lugar de un aparente bloqueo.

+0

Tiene que hacerse de una vez. –

2

Recientemente tuve tablas de datos muy grandes que tardarían entre 15 segundos y un minuto de procesamiento al realizar cambios debido a toda la manipulación DOM que se realiza. Bajé a < 1 segundo en todos los navegadores pero IE (tarda 5-10 segundos en IE8).

La mayor ganancia de velocidad que encontré fue eliminar el elemento principal con el que estaba trabajando desde el DOM, realizar mis cambios y volver a insertarlo en el DOM (en mi caso, el tbody).

Aquí puede ver las dos líneas de código relevantes que me dieron incrementos de gran rendimiento (usando Mootools, pero pueden ser portados a jQuery).

update_table : function(rows) { 
    var self = this; 
    this.body = this.body.dispose(); //<------REMOVED HERE 
    rows.each(function(row) { 
     var active = row.retrieve('active'); 
     self.options.data_classes.each(function(hide, name) { 
      if (row.retrieve(name) == true && hide == true) { 
       active = false; 
      } 
     }); 
     row.setStyle('display', (active ? '' : 'none')); 
     row.store('active', active); 
     row.inject(self.body); //<--------CHANGES TO TBODY DONE HERE 
    }) 
    this.body.inject(this.table); //<-----RE-INSERTED HERE 
    this.rows = rows; 
    this.zebra(); 
    this.cells = this._update_cells(); 
    this.fireEvent('update'); 
}, 
+0

De acuerdo, puedo ver la lógica en esto. Sin embargo, en mi caso, básicamente estoy eliminando una tabla dentro de un . Uno pensaría que eso no llevaría mucho tiempo, pero la tabla dentro del es lo que tiene más de 800 elementos. Dado este escenario, ¿cree que la solución propuesta seguirá funcionando? –

+1

Lo hago. Están presentando Fragmentos DOM en HTML 5 para lidiar con este problema. Creo que si intentas sacar el , actualizándolo y volviéndolo a colocar, verás un gran aumento en el rendimiento. También es muy simple de hacer, hice el cambio con 2 líneas de código. Si tiene Firebug instalado, puede usar el botón 'Perfil' debajo de la pestaña 'Consola' para ver dónde está comiendo su desempeño. – tj111

-1

lo que funcionó para mí es $("#myTable").detach() . Tuve que limpiar una mesa que tiene miles de filas. Intenté $("#myTable").children().remove(). Fue una mejora sobre $("myTable").empty(), pero aún muy lenta. $("#myTable").detach() demora 1 segundo o menos. Funciona bien en FF y Chrome. IE todavía es lento.

Cuestiones relacionadas