« リバーブ | Home | img8.Document »

Mar 252008

this.stage.loaderInfo.url

勘違いなのかよくわからないのだけど、
mother.swf
child.swf
という二つのSWFがあって、mother.swfがchild.swfをloadするとします。で、このときにchild.swfの方で
trace(this.stage.loaderInfo.url)を実行するとmother.swfのURLが出てくるのだと思っていたのだけど、なんかちょっと予想していない結果になってはまり中。


たとえばmother.swfに

trace(this.loaderInfo.url);
trace(this.stage.loaderInfo.url);
とすると両方とも"motehr.swf"の値が出る。これは問題なし。

続けてmother.swfからchild.swfを読み込みルートタイムラインにaddChild。
で、child.swfの中で

trace(this.loaderInfo.url);
trace(this.stage.loaderInfo.url);
を実行すると両方とも"child.swf"となる。 (期待していた値はL1="child.swf",L2="mother.swf")


ただし、読み込む前になんかしらスクリプトを実行したりすると(明確にそれが何か不明だけど、今作っているカスタムクラスを定義すると)きちんと(L1="child.swf",L2="mother.swf")の値がでる。


なんか根本的に理解が間違っているのか?


追記:2008/03/25 23:42
あ、しかも"mother.swf"のwidthを500にして、"child.swf"を100にしたとしても
"child.swf"で

this.stage.stageWidth;//500
とかでてくる・・・。 loaderInfoの使い方がまちがっとるんか?


追記:2008/03/26 0:02
ちなみに

this.stage.root.loaderInfo.url
も駄目であります。 なんじゃこりゃ?


追記:2008/03/26 0:10
graffiti-blog: AS3において、自身がルートかどうかを調べる
で用いられている

if (this.root.parent.loaderInfo.url == this.loaderInfo.url) {
  trace('stand alone mode');
}
も駄目だ・・。 なんだ?オデのFlashがおかしいのか?


追記:2008/03/26 0:49
"mother.swf"の方から、Event.COMPLETEで
trace("#4",e.target.content.stage.loaderInfo.url);
するときちんと取れる。
しかし"child.swf"の方では
trace("stage=",stage.loaderInfo.url);
は"child.swf"。
うう・・・・(汗


追記:2008/03/26 1:16
もうよく分からないのだけど、mother.swfで一度外部クラスのstatic methodを通して
trace("stage = ",_r.stage.loaderInfo.url);
をして(何も変数には格納しない)、そのあと読み込まれた"child.swf"で同じstatic methodをCALLすると
trace("stage = ",_r.stage.loaderInfo.url);
//mother.swf
を戻す。
なんで~~~?


追記:2008/03/26 1:23
あ!もしかして?!


追記:2008/03/26 1:39
ApplicationDomainの問題かと思ってときめいたけど
違った・・。


追記:2008/03/26 4:26
もうakihiro kamijo: Stage クラスに書いてあるthis.stage.rootがドキュメントルートを意味するとか嘘なんだろうな・・・。いや指し示しているのだろうけど、loaderInfoがおかしいんだろうな・・。
っつーことはあれか?外部SWFからRootは一方的に参照できないということなのか?
親の方で一度定義しろと?(別にいいけどさ)
最後にちょっと力技ためしてみようっと・・。


追記:2008/03/26 4:52
こんなん走らせて上までたどってみたけど、結局loaderInfo.urlは"child.swf"を戻してきやがった・・・。

private static function searchRoot(ref:DisplayObject) {
	while (ref.parent) ref = ref.parent;
	return ref;
}
アホか!って俺がアホなのか?ごめんなさい。


追記:2008/03/26 5:52
結局全SWFで定義する方向で。
ただ一応判定条件を入れて、自動的にrootなのかそうじゃないのかを切り分ける方向で実装。これでシングルトン系SWFも単独動作のときはrootとして動作するようにした。あとはstage系の操作もプロパティ経由で参照して出来るようにしてみた。これでとりあえずDisplayObjectでないものからもrootとstage参照できるようになった。ポコポコ。

6 Comments

こんにちわー。
もしかして取得されたいのはこれですか?

loaderInfo.loaderURL;

それと Flash IDE で設定したステージサイズを取得したい場合は stage.stageWidth ではなくて、loaderInfo.width でいけますよー。

毎度色々情報ありがとうございます。

loaderInfo.loaderURL;
はその読み込み命令を出したSWFのURLなのでこれもちょっと片手落ちな感じなんです。どんなに入れ子でloadしてもそこからas2でいう_rootを参照できないか?と・・・(最近複数人での開発が多くて、その辺クラスを共有しなくても_root参照でやり取りができる方法が欲しいんです・・。(それぞれをつなぐClassを作れば良いのですが、それすら作る時間が無かったり・・)

あとステージサイズは大丈夫であります。stage.loaderInfo.urlとstage.stageWidthがずれてるのは何でだろ?って思っただけなので・・stage.loaderInfoがrootの情報を返すと思ってなかったので・・。

やりたいのは子供SWFから親の完全なる参照であります。

こんにちわー。

同じドメイン上に存在するファイルであれば、普通に子の loaderInfo.loader.root や loaderInfo.loader.stage で取得できますよー。
ただし条件としては、親の Loader 自体が事前に addChild() されていないとダメですね。
Loader ではなくて loader.content を addChild() しているとアクセス不可になってしまうようです。

おはようございます、寝てましたw

>同じドメイン上に存在するファイルであれば、普通に子の loaderInfo.loader.root や loaderInfo.loader.stage で取得できますよー。
ほう、ちょっとやってみまっす。これ同じドメインじゃない場合はapplicationDoaminとsecurityの問題をクリアすればアクセスできるんですかね?ま、ちょっとやってみます。

>Loader ではなくて loader.content を addChild() しているとアクセス不可になってしまうようです。
うぉ・・なんだその仕様は・・・汗 んんん?
ま、ちょっとやってみますです~~。
ありがとございますー。

やってみました。
確かに
this.loaderInfo.loader.root
this.loaderInfo.loader.stage
でルートにアクセスできるようです。ただこれらのloaderInfo.urlを参照すると自分のURLが戻ってきますね。LoaderをaddChildしているので、そのloaderInfoを継承しているのでしょうけど・・。なんかこの仕様腑に落ちないw

ちなみに
>Loader ではなくて loader.content を addChild() しているとアクセス不可になってしまうようです。
に関しては
loadのタイミングで直接
this.addChild(shareLoader);
だと問題ないですが、
EVENT.COMPLETE
のタイミングで
this.addChild(event.target as Loader);
とすると駄目っぽいですね。(as MovieClipも当然駄目ですが)
contentにした時点でloaderInfoが外れてしまっているような気もするのですが、こうなってくるとloaderInfoってなんじゃらほいと・・・・・。

_rootのswfのURLって取得できないものなんですかね?
なんか他のクラスにあるのかしら?

taka:niumさん
色々ありがとうございました。
一応クラスにまとめてみましたです。http://blog.img8.com/archives/2008/03/003678.html

Leave a comment

Search and Archives