AS2: كيف يمكنني استخدام AddeventListener على SWF / Movieclip تحميلها عبر Moviecliploader
-
11-09-2019 - |
سؤال
أحاول تحميل 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");
أتمنى أن يساعدك هذا...