2011-01-30 25 views
16

Tengo una aplicación web que no se ejecuta correctamente en cromo. Funciona perfectamente en Firefox. Tengo una página con un gran número de elementos de la lista, 316 para ser exactos. Cada elemento de la lista contiene una gran cantidad de HTML. Mi problema es cuando quiero ocultar o mostrar estos elementos de la lista.Jquery hide() y show() se ejecuta demasiado lento en google chrome

Tengo una página de prueba en jsFiddle para mostrar el problema que estoy teniendo. Reduje la página HTML a una lista desordenada para contener todos los 316 elementos de la lista. Tengo dos botones que simplemente llaman a jQuery ocultar o mostrar cuando se hace clic. De nuevo, esto funciona rápido en Firefox, Opera, incluso IE, bastante bien en Safari, pero en Google Chrome puede demorar más de 30 segundos, lo que hace que aparezca la ventana de diálogo preguntándote si deseas eliminar la página porque el script se está ejecutando demasiado.

Aquí está el enlace a jsFiddle

http://jsfiddle.net/oumichaelm/UZCZc/3/embedded/result/

gracias por cualquier entrada. jmm

+0

Bueno, eso es inusual. Chrome es más lento con una operación dinámica. ¿Has intentado perfilarlo, ver con qué operaciones está siendo lento? – Orbling

+0

Es extraño, si usas Web Inspector para ocultarlo a través de CSS, también lleva mucho tiempo, así que el problema no es el Javascript. Visibilidad: oculto es rápido, pero supongo que esto no resuelve tu problema. – Duopixel

Respuesta

11

Parece que esto no tiene nada que ver con jQuery y simplemente es un problema con Chrome ocultando un elemento padre que tiene una gran cantidad de elementos secundarios.

Esto sólo utiliza JavaScript básica para ocultar el elemento en el documento listo:

document.getElementById('sortable-lines').style.display="none"; 

Y todavía lleva siempre según el documento está listo.

http://jsfiddle.net/petersendidit/UZCZc/10/embedded/result/

abierto un bug de Chrome para esto: http://code.google.com/p/chromium/issues/detail?id=71305

+0

¿Puede presentar un error en Chrome con respecto a esto? http://crbug.com/new y déjame saber el # que archivas. Lo mencionaré con el equipo adecuado. El rendimiento debería ser mejor. No es aceptable que esto suceda, rompe una de las tres s en Chrome, que es "velocidad" –

+0

@Mohamed http://code.google.com/p/chromium/issues/detail?id=71305 – PetersenDidIt

+1

Tu javascript ciertamente demuestra que no es un problema jquery. Gracias por tomarse el tiempo para mirar esto. – jmm

9

Cuando ocultar, eliminar el elemento del DOM es más rápido que usar hide().

var sortableLines = $('#sortable-lines'); 
$('#hide').click(function() { 
    $('#timer').text("Hiding");   
    sortableLines.remove(); 
}); 

Todavía es lento cuando append() de nuevo a la DOM.

Una posible solución consiste en mostrar los primeros 10 o más elementos cuando se hace clic en el botón Mostrar, y luego setInterval para mostrarlos progresivamente.


Editar: encontrado otro truco:

Usted tiene que fijar el contenedor a overflow: hidden:

#linecontainer { overflow: hidden; } 

Cuando ocultar, mover ese elemento hasta la parte superior ahora, mediante el establecimiento de margin-top a un gran número negativo

$('#hide').click(function() { 
    $('#timer').text("Hiding"); 
    sortableLines.css('margin-top', '-1000000px'); 
}); 

Al mostrar, restablecer su margin-top.

$('#show').click(function() { 
    $('#timer').text("Showing"); 
    sortableLines.css('margin-top', '0'); 
}); 

Y it shows and hides instantly.

+0

Tailandés - Gracias por trabajar en esto. Mi mayor pregunta fue por qué la diferencia de velocidad en cromo. Pero definitivamente voy a explorar la configuración de la propiedad margen superior. – jmm

+0

Gracias por el truco 'margin-top', funciona maravillosamente. Estaba corriendo en el mismo problema en cromo – MikeM

+1

Algo más que agregar, tuve una segunda situación en la que el margen superior no funcionaba, estaba cambiando toda la lista de elementos debido a algunos de mis requisitos de diseño. Sin embargo, 'position: absolute' y' top: -10000px' funcionaron como una segunda opción – MikeM

0

Gracias por la respuesta anterior, funciona muy bien y acelera el proceso.

Sin embargo, no siempre funciona - Funciona bien cuando los elementos que necesito están en la parte superior de la lista. Sin embargo, no los muestra a todos si selecciono algo del medio de la lista.

Creo que sé por qué se comporta mal.

Cuando el valor de una larga lista de elementos está configurado para ocultar/mostrar los elementos ocultos se eliminan del flujo y se colocan en la parte inferior de la página en el orden en que se eliminaron.
Esto hace que eliminar los elementos sea notablemente rápido.

Sin embargo, tratar de volver a hacerlos visibles es una molestia para el renderizado, ya que Chrome tiene que recordar el orden en el que estos elementos pertenecían y aparentemente volver a calcular los valores asociados.

Aparte de la mayoría de los otros navegadores, no se pierde la mancha del componente, por lo que no se desperdicia tiempo en esta clasificación innecesaria. La respuesta anterior funciona notablemente bien ya que esto evita el problema de desorden de Chrome.