1

Я пытаюсь загрузить локальный SWF, а затем поймать несколько событий, которые уволены, но я не понимаю, почему это не работает.AS2: Как использовать addEventListener в SWF/MovieClip, загруженном через MovieClipLoader

Вот код

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 пойманы 2" в след, но это не так.

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

ответ

2

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

Надеется, что это помогает ...

+0

Большого спасибо, что решить мою проблему. Извинения за надуманный пример :) – 2009-08-07 10:55:47