AS2: Как использовать addEventListener в SWF/MovieClip, загруженном через MovieClipLoader

Я пытаюсь загрузить локальный SWF-файл, а затем поймать несколько запущенных событий, но не понимаю, почему это не работает.

Вот код

Родитель.swf

_mcl = new MovieClipLoader();
_mcl.addListener(this);
_mcl.loadClip("Child.swf", rotator_mc);

function onLoadComplete(clip) {
    clip.addEventListener("initAsLoaded", function() {trace("childLoaded loaded 1")});
}

function onLoadInit(clip) {
    clip.addEventListener("initAsLoaded", function() {trace("childLoaded loaded 2")});
}

Ребенок.swf

import mx.events.EventDispatcher;

function dispatchEvent() {};
function addEventListener() {};
function removeEventListener() {};

EventDispatcher.initialize(this);

trace("Child dispatching: childLoaded");
dispatchEvent({type:"childLoaded", target: this});

Теперь я надеялся, что это сработает, и у Родителя в трассировке будет «childLoaded catch 2», но это не так.

Есть ли способ добиться того, что я пытаюсь сделать?


person Community    schedule 06.08.2009    source источник


Ответы (1)


Первое, что я заметил, это тот факт, что в родительском объекте вы перечисляете событие с именем initAsLoaded, а в дочернем вы отправляете событие с именем childLoaded. Прослушивание события, которое никогда не будет отправлено, может быть плохой идеей.

Однако это не фактическая проблема, поскольку исправление событий не решает проблему. Основная проблема заключается в том, что событие onLoadInit из MovieClipLoader отправляется после выполнения кода первого фрейма child.swf. Это означает, что в child.swf вы отправляете событие в первом кадре, который никто не прослушивает, потому что onLoadInit еще не было вызвано.

Чтобы исправить это, вы можете начать отправку событий в child.swf только со второго кадра и далее.

Первый родительский кадр:

var rotator_mc = _root.createEmptyMovieClip("rotator_mc", _root.getNextHighestDepth() );

_mcl = new MovieClipLoader();
_mcl.addListener(this);
_mcl.loadClip("child.swf", rotator_mc);

function onLoadComplete(clip) {
    trace("onLoadComplete " + clip + ", " + clip.addEventListener );
    clip.addEventListener("initAsLoaded", function() {trace("childLoaded loaded 1")});
}

function onLoadInit(clip) {
    trace("onLoadInit " + clip + ", " + clip.addEventListener );
    clip.addEventListener("initAsLoaded", function() {trace("childLoaded loaded 2")});
}

Это моя версия первого кадра твоего родителя. Мне пришлось создать пустой фрагмент ролика, который будет служить контейнером, и я добавил несколько трассировок в обработчики событий.

Первый дочерний кадр:

import mx.events.EventDispatcher;

EventDispatcher.initialize( this );

Второй дочерний кадр:

stop();

this.dispatchEvent({type:"initAsLoaded", target: this});

trace("Child dispatching: childLoaded");

Надеюсь это поможет...

person Luke    schedule 07.08.2009
comment
Большое спасибо, это решило мою проблему. Извиняюсь за надуманный пример :) - person ; 07.08.2009