viernes, 8 de julio de 2011

¿Oculto suena? (Aprendiendo de los errores III)


¡Atención, pregunta! Si en una div oculto embebo (y cigala) un vídeo de Youtube... ¿sonará y no se verá? ¿se quedará sin voz hasta mostrarlo? ¿hará otra cosa totalmente distinta?

La respuesta es la de siempre: depende del navegador. Según mis pruebas, en Firefox, Safari e Internet Explorer 7 no suena y no se ve, mientras que en Chrome e Intenet Exlorer 8 suena y no se ve. Seguro que hay una respuesta en el modo en que se renderizan los elementos ocultos de una página, pero no me he molestado en buscarla la verdad.

Claro que os preguntaréis (o no) qué narices haré yo ocultando un vídeo de Youtube. Pues eso, que está bien hacerse preguntas :o)

Y este fin de semana, los Maiden en Madrid. Así que, más que nunca... ¡Salud y rocanrol!

Tell me why I had to be a Powerslave
I don't wanna die, I'm a God.
Why can't I live on?
When the Life Giver dies,
All around is laid waste.
And in my last hour, I'm a Slave to the Power of Death.

domingo, 3 de julio de 2011

¡Qué gracia tiene!

¡Qué arte! ¡Qué duende! ¡Qué tronío tiene Internet Explorer! Pero no sólo el 6, ¡todos! Y yo sin enterarme... de nuevo me caigo del guindo.

Resulta que si capturas el evento resize del objeto window del navegador, todo va bien mientras no se te ocurra recolocar y/o cambiar de tamaño cualquier elemento de la página. Es entonces cuando Internet Explorer decide que lo vuelve a lanzar y lanzar y relanzar... y termina su gran actuación con el mítico chiste Out of memory.

El bug está documentado por todas partes para IE6 e IE7 pero yo también lo he visto en plena acción en IE8. De las soluciones que he encontrado, las dos más utilizadas son: utilizar un timeout que rompa la cadena de recoloco-capturo_evento-recoloco-capturo_evento y eliminar el manejador del evento en el momento que se empiezan a recolocar elementos y reponerlo al terminar.

Yo he optado por una mezcla. Con JQuery...

function manageResize(){
 $(window).unbind('resize');

 ...haz lo que tengas que hacer...

 setTimeout('$(window).resize(function(e){manageResize();})', 25);
}

Es decir, elimino el manejador y, al terminar, lo recupero con un timeout de unos pocos milisegundos para darle tiempo a que los eventos que genera la recolocación de elementos se pierdan en el infierno de los bytes.

Y nada más. ¡Salud y rocanrol!

All aboard!

Crazy, but that's how it goes
Millions of people living as foes
Maybe it's not too late
To learn how to love
And forget how to hate

Mental wounds not healing
Life's a bitter shame
I'm going off the rails on a crazy train!

I've listened to preachers
I've listened to fools
I've watched all the dropouts
Who make their own rules
One person conditioned to rule and control
The media sells it and you live the role

Mental wounds still screaming
Driving me insane
I'm going off the rails on a crazy train!

I know that things are going wrong for me
You gotta listen to my words
Yeah!

Heirs of a cold war
That's what we've become
Inheriting troubles I'm mentally numb
Crazy, I just can not bare
I'm living with something
that just isn't fair

Mental wounds not healing
Who and what's to blame
I'm going off the rails on a crazy train!