2009-08-31 7 views
14

No soy en absoluto un desarrollador de JS (de hecho, apenas un desarrollador), pero quería intentar escribir un pequeño script de Greasemonkey para ocultar algunos elementos en una página web determinada. Una vez que comencé a limpiarlo, he decidido usar jQuery, solo para hacerlo más fácil. Todo fue bien, el script funciona, pero ahora que está listo, comencé a preguntarme sobre los detalles.Cómo congelar los repintados del navegador web al cambiar la visibilidad de los elementos?

Como parte de la secuencia de comandos, necesito encontrar un elemento específico y ocultarlo, junto con el anterior y el siguiente de sus hermanos. He terminado con no tan fácil de leer, pero la línea de trabajo:

$('div#some-weird-box').prev().toggle(w).next().toggle(w).next().toggle(w); 

Mi preocupación aquí es, que soy la eliminación de tres divs separados en tres etapas separadas. Esto provocaría que el navegador "vuelva a pintar" la página tres veces, ¿verdad? No es un problema con tres divs, probablemente comenzaría a importar cuando haya más elementos. Entonces, mi pregunta es: ¿hay alguna manera de decirle al navegador "dejar de actualizar/volver a dibujar la página"? Si lo hay, podría usar eso, ocultar una cantidad arbitraria de elementos y luego pedirle al navegador que actualice la pantalla.

Respuesta

18

La ejecución de Javascript bloquea el navegador y no verá un repintado hasta que la ejecución del código haya finalizado. Realmente no tienes nada de qué preocuparte con esto.

he publicado un buen ejemplo de esto en jsbin.com: http://jsbin.com/ecuku/edit

Actualización: A menudo se sugiere modificar nodos fuera del DOM debido a la modificación del DOM causa reflujos (no se vuelve a dibujar). Los reflujos se producen cuando el navegador tiene que volver a calcular las posiciones y los tamaños de los elementos en su página porque algo ha cambiado. Si bien la ejecución de su javascript puede causar múltiples reflujos, solo causará un repintado (cuando su código termine). Esos reflujos pueden ser un gran golpe de rendimiento, pero para un pequeño número de cambios DOM (por ejemplo, tu código solo tiene 3) probablemente no valga la pena realizar los cambios fuera de la página. Además, clonar un nodo y modificarlo fuera de la página antes de volver a insertarlo puede tener consecuencias inesperadas. Por ejemplo, si tuviera controladores de eventos adjuntos, sería necesario volver a conectarlos a los nuevos nodos.

+1

Interesante. ¿Hay alguna buena lectura acerca de la que me puede señalar? Si ese es el caso, ¿por qué veo todos esos consejos para eliminar elementos del árbol, aplicar cambios y luego volver a traerlos? http://www.slideshare.net/nzakas/writing-efficient-javascript - diapositiva 77 o 88 ...? – yacoob

+0

Esa es una declaración general bastante audaz, No puedes decir que será el caso el 100% del tiempo. –

+0

No hice una declaración general. Hice una declaración relacionada con el código que publicó. Él no tiene nada de qué preocuparse con esto. Solo verá un repintado en cualquier navegador, y cuando modifique 3 nodos, no debe clonar el nodo y modificarlo fuera de la página. – Prestaul

2

Puede usar cloneNode. Después de la clonación, puede hacer todas las manipulaciones sobre el clon y reemplazar el nodo original. Esto evitará que su contenido parpadee cuando se muestre: ninguno como el propuesto por J-P.

+0

cloneNode nunca es una buena idea si necesita manipular con el DOM. Los referenses al nodo anterior no se actualizarán al nodo clonado ni a ningún eventHandler en el nodo original. – Flexo

Cuestiones relacionadas