Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Проблемы с кроссдоменной загрузкой клипа (http://www.flasher.ru/forum/showthread.php?t=139167)

ilyichzc 24.04.2010 23:34

Проблемы с кроссдоменной загрузкой клипа
 
Flash приложение содржит клип, в который грузит swf из другого домена. В обоих клипах (основном и в загружаемом) на первом кадре в руте
System.security.allowDomain("*"); Так же приложение - загрузчик открывает crossdomain.xml с сервера, на котором расположен загружаемый swf. По сути все правила доверия предусмотрены, но не работает следующее:
Загрузка производится при помощи собственного класса, основанного на movieClipLoader. Данный класс после загрузки клипа (событие onLoadComplete) программирует событие загруженного клипа onEnterFrame на инициализацию в соответствии с параметрами объекта task, который является описателем загрузки. onEnterFrame используется потому, что в момент возникновения этого события уже известны рамеры загруженного объекта и можно произвести его подгонку по размерам и установку в нужный кадр. Здесь же производится вызов пользовательской функции onLoad.
Проблема: При кроссдоменной загрузке клип загружается но не вызывает пользовательскую функцию. Так же не вызывается пользовательская функция onProgress. При этом объект task существует (проверено дебагом). Тоесть секьюрность не позволяет вызвать пользовательскую функцию.

При загрузке из того же домена, что и родительский клип все работает нормально.

Вот часть исходника загрузчика:

Код AS1/AS2:

 
// ==== ON LOAD PROGRESS ==========================================
 
private function onLoadProgress (target_mc :MovieClip, loaded_bytes :Number, total_bytes :Number)
{
        if (total_bytes < 1) total_bytes = 1;
 
        var task :Object = this.getTask({target : target_mc});
        task.progress = loaded_bytes/total_bytes;
 
        var percents = task.progress * this.progressStep;
        this.progress += percents;
 
        if (this.progress > this.progressEnd)
                        this.progress = this.progressEnd;
 
        if (task.onProgress != null)
                task.onProgress(Math.round(task.progress * 100), task);
}       
 
// ==== ON LOAD TASK COMPLETE ===================================
 
private function onLoadComplete (target_mc :MovieClip, http_status :Number)
{
        var task :Object = this.getTask({target : target_mc});
 
        target_mc.task = task;
 
        target_mc.onEnterFrame =
 
                function()
                {
                        this.task.stack.finalize(this.task);
                        if (this.task.onComplete != null)
                                this.task.onComplete(task);
                        this.onEnterFrame = this.task.onEnterFrame;       
                }
 
 
        this.currTaskId ++;
 
        if (this.currTaskId < this.tasks.length)
        {
                var found = false;
                var task = this.tasks[this.currTaskId];
 
                this.loadClip(task.url, task.target);
        }
        else
        {
                if (this.progress < this.progressEnd)
                                this.progress = this.progressEnd;
 
                this.progressStart = this.progress;
 
                for (var i = 0; i < this.currTaskId; i ++)
                {
                        this.tasks.shift();
                }
 
                this.currTaskId = 0;
        }
}
 
// ==== Finalize load task ===========================
 
private function finalize (task :Object)
{
        if (task.frame != null)
        {
                task.target.gotoAndStop(task.frame);
        }
 
        if (task.width != null ||
                task.height != null)
        {
                var w = task.width;
                var h = task.height;
 
                if (w == null) w = task.target._width;
                if (h == null) h = task.target._height;
 
                if (task.target._width > task.target._height)
                {
                        if (h > w) w = h;
                        h = w * task.target._height/task.target._width;
                }       
                else
                {
                        if (w > h) h = w;
                        w = h * task.target._width/task.target._height;
                }
 
                task.target._width = w;
                task.target._height = h;
        }


ilyichzc 30.04.2010 08:45

Все, разобрался. Онициировать объект нужно на событии onLoadInit. А я почему то решил, что это начало загрузки.


Часовой пояс GMT +4, время: 10:22.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.