子swf のparentプロパティについて
2010.02.28
Flasherにとってかなり初歩的な内容だと思うけど、1時間半ほどはまったのでメモ。
各コンテンツ毎にswfを分割ようとして、してハマりました。
ユーザビリティ、ワークフローを考慮して、1つのFlashサイトを制作する際に
swfファイルを分割することがあるけど、AS3で僕は、ほとんどやったことがありませんでした。(AS2の制作自体ほとんどないけど)
短納期で中規模なサイトを制作することになったので、
swfを分けて作業分担しようとした矢先のハマり。
1.子swfのparentプロパティは、親swfではない
結果から言うと、
子swfのparentプロパティ = 子swf をロードしているLoaderインスタンス
親swf = Loaderインスタンスのparentプロパティで参照
※親swf のルートに 子swf をロードしている場合
子swf から親swf にアクセスする際は、以下のコードになります。
parent.parent
2.「loader.content」はキャストする
これも当たり前のことですが、loader.contentは、DisplayObjectなのでそのままでは、子swf に設定されてある、親から呼んで欲しいメソッドをコールできません。
(なぜなら、DisplayObjectのメソッドではないから、そんなメソッドはDisplayObjectにはないよって怒られます。)
以下ソースです。
親swf : Parent.as
package
{
import flash.display.*;
import flash.events.Event;
import flash.net.URLRequest;
public class Parent extends Sprite
{
public function Parent() { init(); }
private function init():void
{
var loader:Loader = new Loader;
addChild(loader);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onComplete);
loader.load(new URLRequest("child.swf"));
}
private function _onComplete(e:Event):void
{
var loaderInfo:LoaderInfo = e.target as LoaderInfo;
loaderInfo.removeEventListener(Event.COMPLETE, _onComplete);
MovieClip(loaderInfo.loader.content).init();
}
}
}
子swf : Child.as
packageparent call
{
import flash.display.*;
public class Child extends MovieClip
{
private static var _isRoot:Boolean;
public function Child() {}
public function init():void
{
_isRoot = parent is Stage?true:false;
if (!_isRoot) {
trace("parent call");
trace( "parent : " + parent );
trace( "parent.parent : " + parent.parent );
trace( "parent.parent.parent : " + parent.parent.parent );
}else {
trace("スタンドアロンで実行");
}
}
static public function get isRoot():Boolean { return _isRoot; }
}
}
[出力結果]
parent : [object Loader]
parent.parent : [object Parent]
parent.parent.parent : [object Stage]
やばく忙しかったけど、最近ちょっと落ち着いたので、ハマってきたネタを小出しにしていきます。
parent : [object Loader]
parent.parent : [object Parent]
parent.parent.parent : [object Stage]
update 2010.03.04...
[関連記事]






