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

XML.onLoadメソッドで変数の設定/参照ができない

ID: FN0109002 Product: Flash

Platform: All
Version: 5.0

1. 現象
'XML.onLoad'メソッドで定義したコールバック関数の中で、グローバル変数を設定・参照するステートメントを記述しても、正しく設定できないことがあります。コールバック関数自体は、正常に呼び出されています。

2. 原因
グローバル変数を設定・参照するステートメントの記述で、変数のターゲットパスを省略した場合に発生します。

省略時に参照されるパスは、Flash 5スタンドアローンプレーヤーあるいはFlash Player 5.0r30ではメインのタイムライン('_root')、r41およびr42ではXMLオブジェクトが生成されたタイムラインとなります。したがって、ターゲットパスを指定しないと、グローバル変数の設定・参照されるパスが、Flash 5 Playerのバージョンによって異なってしまう結果になります。

3. 対処法
'XML.onLoad'メソッドで定義したコールバック関数中では、グローバル変数に必ずターゲットパスを指定してください。たとえば、「_root.variableName」と指定すれば、グローバル変数「variableName」はメインのタイムラインに正しく設定されます。

もっと汎用性のある手法としては、コールバック関数を定義するときに、ターゲットパスと変数名をXMLオブジェクトのプロパティに設定することが考えられます。以下のサンプルスクリプトでは、XMLオブジェクトを生成したMovieClipをターゲットパスとして指定し、変数名を「sResult」としています。コールバック関数xOnLoadは、XMLデータが正しくロードされたかどうかの結果('true/false')をMovieClipの変数「sResult」に設定します。

// [テストサンプルスクリプト]
// MovieClipのフレームアクションに設定
oMyXML = new XML();   //[1]XMLオブジェクトの生成
oMyXML.onLoad = xOnLoad;   //[2]コールバック関数の定義
oMyXML.oTarget = this;   //[3]現在のタイムライン(MovieClip)のパスをプロパティ設定
oMyXML.sVariableName = "sResult";   //[4]設定するグローバル変数名をプロパティ設定
oMyXML.load("Test.xml");   //[5]XMLデータのロード
function xOnLoad (success) {   //[6]コールバック関数定義
   //[7]プロパティからターゲットパスと変数名を参照して結果を格納
   this.oTarget[this.sVariableName] = success;
}

スクリプトの処理につきましては、付記された注釈をご参照ください。若干の補足だけいたします。[3][4]では、XMLオブジェクトのプロパティとして、ターゲットパスと変数名を設定しています。ターゲットパスに設定された'this'は、スクリプトの記述されたタイムライン(MovieClip)を参照します。

[7]では、「ターゲットパス[変数名]」というブラケットアクセスで、設定する変数を参照しています。これは、変数名がストリングで指定されているためです。'eval'関数を使って「eval(ターゲットパス+"."+変数名)」とすることも可能です(Macromediaテクニカルノート「tellTargetをFlash 5のアクションに書きかえるには」参照)。また、コールバック関数xOnLoadの中で参照されている'this'は、MovieClipで生成されたXMLオブジェクトであることにご注意ください。

_____

作成者: 野中文雄
更新日: 2002年4月20日 変数を参照する場合についての字句を追加・修正
作成日: 2001年9月4日


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