#012 ActionScript [Q] Tips: precargas AS3 en Internet Explorer

Imagino que unos cuantos de vosotros habéis topado previamente con el bug que se da en Internet Explorer cuando hacemos una precarga empleando los eventos Event.COMPLETE y ProgressEvent.PROGRESS de AS3. El bug en cuestión aparece cuando tenemos una película cacheada y volvemos a ella, para reproducirlo solamente tenéis que cargar la película y una vez cargada, pulsar F5 en vuestro navegador IE, o Ctrl + F5. Cabe destacar que esto solo ocurre con la película principal, y no las que se cargan internamente en ella.

Veréis como la precarga se queda en pantalla por los siglos de los siglos, y es que no se disparan correctamente los eventos antes citados. La solución más simple para el problema, es controlar este hecho, y qué mejor manera que viendo antes de preparar los eventos, si resulta que ya tenemos cargada por completo la película.

Imaginemos que tenemos la siguiente estructura clásica para el preloader:

function cargando(ev:ProgressEvent):void 
{
	var porcentaje:Number = Math.floor( (ev.bytesLoaded*100)/ev.bytesTotal );
        trace ('cargado... '+porcentaje);
}

function cargaCompleta(ev:Event):void
{
      trace('Listo!');
}

this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, cargando);
this.loaderInfo.addEventListener(Event.COMPLETE, cargaCompleta);

Muchos optan por evitar el problema haciendo un preloader convencional con un Event.ENTER_FRAME, no obstante no es necesario, y aquí os dejamos el Tip de este viernes que nos permite la limpieza y eficiencia de la aproximación por eventos en vez de un enterFrame, sin tener que asumir el malfuncionamiento en Internet Explorer 6 y 7.

Si simplemente tenemos en cuenta comprobar inicialmente si la película está cargada por completo, algo tan sencillo como esto:

if (this.loaderInfo.bytesLoaded/this.loaderInfo.bytesTotal == 1) 
{
     trace('ya está cargado por completo');
}
[/as]

Por tanto nos quedaría algo así:

[as]
function cargando(ev:ProgressEvent):void 
{
	var porcentaje:Number = Math.floor( (ev.bytesLoaded*100)/ev.bytesTotal );
        trace ('cargado... '+porcentaje);
}

function cargaCompleta(ev:Event):void
{
      trace('Listo!');
}

if (this.loaderInfo.bytesLoaded/this.loaderInfo.bytesTotal == 1) 
{
// ya está cargado
cargaCompleta(null);
}
else
{
this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, cargando);
this.loaderInfo.addEventListener(Event.COMPLETE, cargaCompleta);
}