どのタイムラインからでもメインタイムラインは DisplayObject.root プロパティで参照することができます。 DisplayObject.root プロパティを使うと loader インスタンスによって読み込まれた swf のタイムラインからでもメインタイムラインを参照できます。
読み込まれる側の swf にはボタンとなるオブジェクト(インスタンス名「button」)が配置されています。 タイムラインに次のようなコードを記述します。
button.addEventListener(MouseEvent.CLICK, onClick);
function onClick(event:MouseEvent):void {
var _loader:Loader = loaderInfo.loader;
trace(_loader.root);
}
読み込まれる側の swf をファイル名「test.swf」としてパブリッシュしておきます。 では、呼び出し元のムービーに次のコードを記述して「test.swf」を読み込ませてみましょう。
var url:String = "test.swf";
var _loader:Loader = new Loader();
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onCompleted);
_loader.load(new URLRequest(url));
function onCompleted(event:Event):void {
event.target.removeEventListener(Event.COMPLETE,onCompleted);
addChild(event.target.loader);
}
ムービーには「test.swf」が読み込まれます。 「button」インスタンスをクリックすると、[出力パネル]には次のように出力されます。
[object MainTimeline]
一見問題がないように見えますが、呼び出し元のメインタイムラインに定義している関数を、DisplayObject.rootを参照で呼出してみるとエラーが起こります。
呼び出し元のムービーに次のコードを追加しておきます。
function testFunc():void {
trace(this);
}
では、読み込まれる側の swf からこの testFunc() を呼び出してみましょう。onClick 関数を変更します。
function onClick(event:MouseEvent):void {
var _loader:Loader = loaderInfo.loader;
_loader.root.testFunc();
}
[ムービープレビュー]を行うと、次のようなエラーが出力されます。
1061: 未定義である可能性のあるメソッド testFunc を、静的型 flash.display:DisplayObject の参照を使用して呼び出しました。
これは、root が DisplayObject クラスのプロパティのためです。 DisplayObject クラスはユーザーはフレームアクションで自由に変数(プロパティ)や関数(メソッド)を定義することができません。ですので、 DisplayObject クラス定義されていないメソッドを呼び出した段階でエラーになってしまいます。 メインタイムラインは実際にはMovieClipクラスで、そこに追加した関数を呼び出すためには DisplayObject.root プロパティ値の型を、MovieClip型にキャスト(変換)しなければなりません。
※ データ型を明示的に変換することを、「キャスト」と呼びます。
onClick 関数を次のように変更します。
function onClick(event:MouseEvent):void {
var _loader:Loader = loaderInfo.loader;
var mainRoot:MovieClip = MovieClip(_loader.root);
mainRoot.testFunc();
}
これで呼び出し元のメインタイムラインにある testFunc() を呼び出す事ができます。
Post your comment