AS2: Как использовать addEventListener для SWF / MovieClip, загруженного через MovieClipLoader - PullRequest
1 голос
/ 06 августа 2009

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

Вот код

Parent.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")});
}

Child.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», но это не так.

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

1 Ответ

2 голосов
/ 07 августа 2009

Первое, что я заметил, было то, что в родительском элементе вы указываете событие с именем 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");

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

...