こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

sendAndLoadで

多分稚拙な質問です。
phpとの連携でsendAndLoadを利用しようとしてます。

var temp_vars = new LoadVars();
temp_vars.code.text = "tekitou";
temp_vars.sendAndLoad("http://tekitou.jp/tekitou.php", temp_vars, "POST");
temp_vars.onLoad = function() {
trace(this.hogehoge);
}

とするとphpからの返り値hogehogeが取れるのですが、下三行を

temp_vars.onLoad = function() {
_root.temp_hogehoge = this.hogehoge;
}
trace(_root.temp_hogehoge);

とするとtraceがundefinedになります。単純にphpからの返り値をどこでも使えるグローバル変数に渡したいだけなんですが。

諸々試してはみたのですが、変数スコープの問題なのか、functionの使い方が間違っているのかさえ解らず悩んでいます。ご教授いただければと・・・

投稿日時 - 2009-02-15 04:28:47

QNo.4718545

困ってます

質問者が選んだベストアンサー

単純に

trace(_root.temp_hogehoge);



_root.temp_hogehoge = this.hogehoge;

より先に実行されるからだと思いますよ。



そもそもなぜ,
temp_vars.onLoad = function() {}
などを用意しているのかというと,
PHP からの値のロードを待つからでしょう?
ロード後でないと値がわからないので変数に値の代入のしようがないからですよね。

というわけで,
PHP から値がロードされたときに,
temp_vars.onLoad = function() {}
の{}内が実行されるわけです。
つまり
_root.temp_hogehoge = this.hogehoge;
が実行されます。



こう↓考えれば簡単なのでは?

 // ボタン「myButton」がクリックされたときに実行
 myButton.onRelease = function(){
   // 変数 AAA に あいうえお という値を代入
   AAA = "あいうえお";
 };
 // AAA の値を出力
 trace(AAA);

変数 AAA に値が代入されるのはボタンがクリックされたときです。
一方 trace(AAA); はボタンがクリックされてもされなくても,
それを書いたフレームで即実行されます。

したがって trace(AAA); が実行されるときに 変数 AAA は存在しないので
「undefined」になります。

これと同じです。

投稿日時 - 2009-02-15 07:58:13

補足

回答ありがとうございます。

「なるほど」と思いつつ検証してみたのですが、うまくいってません。僕自身がASの変数の取り扱いを理解できていないせいだと思うのですが。

元の下3行を

temp_vars.onLoad = function() {
_root.temp_hogehoge = this.hogehoge;
trace(_root.temp_hogehoge);
}

とtraceをfunctionの中に持ち込んでもundefinedになります。これでも読み込み前にtraceしているのかと思い。以降のフレームでloopを作りtemp_hogehogeをtraceし続けてもundefinedが続くだけでした。

お手数をおかけしますが、追加ご指導いただければありがたいです。

投稿日時 - 2009-02-15 14:55:01

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

#1です。

temp_vars.onLoad = function() {
trace(this.hogehoge);
}

これが無事に動いているのでしたら,
書かれていらっしゃる

temp_vars.onLoad = function() {
_root.temp_hogehoge = this.hogehoge;
trace(_root.temp_hogehoge);
}

でOKなはずです。
または _root をはずしてもかまいません。

temp_vars.onLoad = function() {
temp_hogehoge = this.hogehoge;
trace(temp_hogehoge);
}

これが無事に動作していないということは,
そもそもロードできていなくて変なことになっているからかもしれません。

sendAndLoad は普通「送信用LoadVarsインスタンス」と「受信用LoadVarsインスタンス」が要ります。

「loadVars.sendAndLoad()メソッド。データ送受信」
http://www.1art.jp/flash2/chapter/49/49.htm

↑サンプルのサーバサイド言語は CGI(Perl) ですが,
PHP でも ActionScript 側は基本的に同じです。

投稿日時 - 2009-02-15 16:11:46

お礼

ありがとうございます。解決しました。

BlurFiltanさんの回答を読みやはり組み方としては正しいと信じてスクリプトを念入りに見回して間違いに気が付きました。実際の動作スクリプトでは、戻り値がtextだったため

temp_hogehoge = this.hogehoge;を
temp_hogehoge.text = this.hogehoge;

としていましたが、この.textを取り除いたら正しい反応をしてくれました。前に教えていただいた、traceの実行タイミング不備と変数の指定間違いが組み合わさりはまっていたようです。

ありがとうございました。大変感謝しています。

投稿日時 - 2009-02-15 16:29:07

あなたにオススメの質問