AS2: كيف يمكنني استخدام AddeventListener على SWF / Movieclip تحميلها عبر Moviecliploader

StackOverflow https://stackoverflow.com/questions/1240103

سؤال

أحاول تحميل 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});

الآن كنت آمل أن يعمل هذا، وكان الوالد من شأنه أن يكون "anndloaded اشتعلت 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");

أتمنى أن يساعدك هذا...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top