サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

MovieClip.onLoadイベントハンドラメソッド

ID: FN0503003 Product: Flash

Platform: All
Version: MX and above

シンタックス[*1]
my_mc.onLoad = function() {
   //  ステートメントをここに記述
}

[訳者注*1] 定義したfunctionの参照を、代入することも可能です。

my_mc.onLoad = myFunction;
function myFunction () {
   //  ステートメントをここに記述
}

説明
イベントハンドラ(訳者注: メソッド); MovieClipがインスタンス化され、(訳者注: その配置された)タイムラインに表示されるときに呼出されます。本イベントハンドラが呼出されたときに実行すべきfunctionを、定義する必要があります。functionは、タイムラインに定義することができます[*2]。あるいは、MovieClipクラスを継承するクラスや、[ライブラリ]内のシンボルにリンケージ設定したクラス中に定義することも可能です。詳しくは、「ActionScriptユーザーガイド」の(訳者注:「ムービークリップの操作」の)「ムービークリップシンボルへのクラスの割り当て」をご参照ください。

このハンドラは、[ライブラリ]内にあるシンボルがクラスと関連づけられているMovieClipに対してのみ使用することができます。イベントハンドラを呼出すのが特定のMovieClipをロードしたとき、たとえばMovieClip.loadMovie()を使ってSWFファイルを動的にロードした場合であれば、このハンドラでなくonClipEvent (load)を使用する必要があります。後者は、MovieClipがロードされると呼出されます。

[訳者注*2] MovieClipインスタンスを配置したタイムラインに、このイベントハンドラメソッドを定義して動作する場合は、かなり限定されます。実際上は、タイムラインに定義することはまれで、またその定義も適切とはいえない場合が少なくないでしょう。

たとえば、タイムラインにつぎのフレームアクションを設定しても、通常は動作しません。ところが、そのインスタンスにMovieClipアクションを何かしら設定(最低限半角スペースひとつでも可)すると、MoiveClip.onLoadイベントハンドラメソッドが呼出されるようになります。

スクリプト001■MovieClipを配置したタイムラインのフレームアクションでMovieClip.onLoadメソッドを設定

// フレームアクション
// MovieClipインスタンスmy_mcを配置
var my_mc:MovieClip;
my_mc.onLoad = function() {   // 呼出されない
   trace(this);
};

メインタイムラインの第1フレームで_level0(_root)に設定したMovieClip.onLoadイベントハンドラメソッドは、呼出されるようです。しかし、ブラウザで確認すると、MozillaベースのブラウザSafariでは呼出されないという報告がされています(Flash Player 7)。

スクリプト002■第1フレームアクションでメインタイムライン自身にMovieClip.onLoadメソッドを設定

// メインタイムライン: _level0
// 第1フレームアクション
this.createTextField("my_txt", 1, 10, 10, 100, 20);
var my_txt:TextField;
this.onLoad = function() {
   my_txt.text = this;
};

上記ふたつのサンプル(スクリプト001および002)では、MovieClip.onLoadイベントハンドラメソッドの呼出しが確実でなく、正規にサポートされる動作であるかも疑問です。イベントハンドラを設定するには、インスタンス(タイムライン)が存在しなければならず、すでに存在するということはロードが済んでいると考えられるからです。


つぎの例では、MovieClip.onLoadsetInterval()と組合わせて使う方法をご紹介します[*3][*4]。setInterval()関数は、ランタイム時に(訳者注 動的に)作成したMovieClipにファイルがロードされたかどうかを確認しています。

this.createEmptyMovieClip("tester_mc", 1);
tester_mc.loadMovie("http://www.yourserver.com/your_movie.swf");
function checkLoaded(target_mc:MovieClip) {
   var pctLoaded:Number = target_mc.getBytesLoaded()/target_mc.getBytesTotal()*100;
   if (!isNaN(pctLoaded) && (pctLoaded>0)) {
     target_mc.onLoad = doOnLoad;
     trace("clearing interval");
     clearInterval(myInterval);
   }
}
var myInterval:Number = setInterval(checkLoaded, 100, tester_mc);
function doOnLoad() {
   trace("movie loaded");
}


[訳者注*3] このサンプルにおいてMovieClip.loadMovie()メソッドの引数として渡すURLには、サーバー上の外部ファイルを指定します。ローカルファイルのURLを指定すると、MovieClip.onLoadイベントハンドラメソッドは呼出されません。また、サーバー上にアップした場合、指定したURLがロード元コンテンツと同一ドメインになければ、セキュリティ上の制限が適用されます。

なお、setInterval()関数でデータのロードが確認されてから、MovieClip.onLoadイベントが発生するまでの時間は、通常きわめて短いものと考えられます。したがって、setInterval()関数でロード状況を確認しながら、あえてMovieClip.onLoadイベントハンドラメソッドを設定して別途ロード時の処理を定義する必要が生じる場合はごくまれでしょう。

[訳者注*4] MovieClip.onLoadイベントハンドラメソッドが確実に呼出され、設定する実際上の意味もあるのは、クラス定義で使用される場合でしょう。つぎのサンプル(スクリプト003)は、ActionScript 2.0クラス定義ファイルに記述するスクリプトで、MovieClipシンボルの[AS 2.0クラス]に設定します。

スクリプト003■ActionScript 2.0クラス定義内でMovieClip.onLoadメソッドを設定

// ActionScript 2.0クラス定義ファイル: MyClass.as
class MyClass extends MovieClip {
   var onLoad:Function;
   // コンストラクタ関数
   function MyClass() {
     init(); // 初期設定呼出し
   }
   // 初期設定メソッド
   private function init():Void {
     trace("initializing...: "+this);
     this.onLoad = function() {
       trace("loaded!: "+this);
     };
   }
}

コンストラクタ関数で初期設定を行ったうえで、MovieClip.onLoadイベントハンドラメソッドを定義してロード時の処理を加えることは、そのインスタンス単独で動作させる場合には必要ないでしょう。しかし、他のインスタンスと連携して動作する仕組みを考えたとき、他のインスタンスの初期設定はすべて済んでから行うべき処理が発生するかもしれません。その場合、MovieClip.onLoadイベントでその処理を行うことができます。上記クラス定義(スクリプト003)を_level0(_root)上のふたつのインスタンス(my0_mcおよびmy1_mc)に設定した場合、[出力]パネルにはつぎのように表示されます。

// [出力]パネルの表示
initializing...: _level0.my0_mc
initializing...: _level0.my1_mc
loaded!: _level0.my0_mc
loaded!: _level0.my1_mc

つぎの例は、上記ActionScriptサンプルと同様の処理を示します[*5]。

this.createEmptyMovieClip("tester_mc", 1);
var mclListener:Object = new Object();
mclListener.onLoadInit = function(target_mc:MovieClip) {
   trace("movie loaded");
};
var image_mcl:MovieClipLoader = new MovieClipLoader();
image_mcl.addListener(mclListener);
image_mcl.loadClip("http://www.yourserver.com/your_movie.swf", tester_mc);


[訳者注*5] 上記サンプルと異なり、ローカルの外部ファイルを指定しても、MovieClipLoader.onLoadInitイベントハンドラメソッドは呼出されます(前述[訳者注*3]参照)。MovieClipLoaderクラスは、Flash Player 7からの実装です。

Player
Flash Player 6.0以降。

出典
Flash MX 2004 ActionScript Language Reference: MovieClip.onLoad より邦訳。

_____

作成者: 野中文雄
更新日: 2006年4月6日 全面改訂のうえFN0604002として新規作成
作成日: 2005年3月31日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.