Добрый вечер, колллеги!
Появилась тут такая проблема. Гружу совершенно обычным способом Loader'ом swf. Есть прелоадер, показывающий прогресс загруки. Все отлично в Chrome, FF, Opera, но вот в IE и standalone плеере наблюдаются странности, которым пока у меня нет объяснения, да и google ничего мне толком не сказал (не факт, что правильно спрашивал). Появилось все в рабочем проекте, но на тестовом проекте то же самое.
Standalone, локальная загрузка:
Swf грузится очень быстро, но по стрейсам видно, что не кидается событие Event.ENTER_FRAME, в то время как ProgressEvent.PROGRESS исправно кидается. В итоге загрузка идет своим ходом, но экран не обновляется и, соответственно, прелоадер никак не отображает процесс загрузки. Можно было бы подумать, что время загрузки настолько мало, что умещается в интервале между двумя обновлениями кадров, но (!) замеры этого времени говорят об обратном. До начала загрузки ENTER_FRAME есть, во время загрузки нет, после - опять есть. Все параметры прелоадера в это время так же благополучно меняются, но обновляется он только после полной загрузки файла уже на 100 процентах.
В IE такое происходит как локально, так и при выкладывании в сеть. С одной особенностью - несколько раз за все время (2-3) (а swf метров 30 специально, чтобы процесс наглядно растянуть) может изменить прелоадер (например 4, 11 и 52%), в то же время по трейсам опять видно, что ENTER_FRAME вызвался так же пару раз с огромными временными задержками, потом же просто зависает до окончания загрузки.
Тестировалось в плеерах версий 10.1.82.76 release и 10.1.85.3 debug.
В инете нагуглил, что была проблема в IE6 и 7, что не кидалось событие
ProgressEvent.PROGRESS Event.COMPLETE, но у меня IE8, и такой проблемы нет... Вот думаю, что же все это может означать.
Компилю с помощью flex SDK 3.2 или flex SDK 4.1
на всЯкий случай код тестовой загрузки:
Код AS3:
package
{
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.net.URLRequest;
import flash.utils.setTimeout;
/**
* ...
* @author Vitaly Basov
*/
public class Main extends Sprite
{
private var _loader:Loader;
private var _preloader:ContentPreloader;
private var _interval:int;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(event:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
_loader = new Loader();
_loader.contentLoaderInfo.addEventListener(Event.OPEN, loaderOpenHandler);
_loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loaderProgressHandler);
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderCompleteHandler);
_preloader = new ContentPreloader();
_preloader.x = 200;
_preloader.y = 200;
addChild(_preloader);
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
//_interval = setTimeout(_loader.load, 3000, new URLRequest("example.swf"));
_loader.load(new URLRequest("example.swf"));
}
private function enterFrameHandler(event:Event):void
{
trace("enter");
}
private function loaderOpenHandler(event:Event):void
{
trace("open");
}
private function loaderProgressHandler(event:ProgressEvent):void
{
trace("progress");
var progress:Number = Math.floor( (event.bytesLoaded / event.bytesTotal) * 100);
_preloader.progress = progress;
}
private function loaderCompleteHandler(event:Event):void
{
trace("complete");
addChildAt( event.target.content as DisplayObject, 0);
removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
}
}