• ベストアンサー

as3 変数のスコープについて

xmlの読み込みをしていますが、 最後のtraceで内容が表示されません。nullになります。 var myXML:XML; var imgSrc:String ; var url:URLRequest = new URLRequest("test.xml"); var xmlLoader:URLLoader = new URLLoader(); xmlLoader.dataFormat = URLLoaderDataFormat.TEXT; xmlLoader.load(url); xmlLoader.addEventListener(Event.COMPLETE, comp); function comp(event:Event):void { myXML = XML(xmlLoader.data); imgSrc = myXML.img[0]; } trace(imgSrc);←ここがnullです。 function内でtraceすると問題なく表示されるのですが、 一体どうしてでしょうか。 ご教授お願いいたします。

  • Flash
  • 回答数2
  • ありがとう数6

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

  • ベストアンサー
回答No.1

ActionScriptってのはオブジェクト指向で 順次実行型のスクリプトではないですからね xmlのロードが実行されてはじめて imgSrcに値が入るので compの実行を待たずにimgSrcの 中身をみてもnullなのは当然です

trfnc223
質問者

お礼

ご回答ありがとうございます。 すいません、あんま理解していないのですが、 上記の書き方だと、functionが実行される前に traceが実行されているということですよね。。。 もしよろしければ、具体的にどうしたらよいか お聞かせいただけると幸いです。 それとも、function外でimgSrcの値を とる方法はないということでしょうか。。。

その他の回答 (1)

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

> 上記の書き方だと、functionが実行される前に > traceが実行されているということですよね。。。 そうですよ。 xmlLoader.addEventListener(Event.COMPLETE, comp); によってXMLのロード完了時に関数compが実行されます。 当たり前ですが, XMLのロードが完了しないとXMLの内容などわかりません。 XMLのロードが完了して中身を閲覧や操作できるような状態になって 関数compが実行されるということです。 というか, そのために(関数compを即実行させないために) xmlLoader.addEventListener(Event.COMPLETE, comp); を用意しているはずです。 >それとも、function外でimgSrcの値を >とる方法はないということでしょうか。。。 関数comp内で別の関数を実行させて, その別関数の中に trace(imgSrc); を書いておくのも1つの方法です。 また,書かれていらっしゃるスクリプトを書いたフレームで, そのフレームの再生を停止させておいて( stop() させておいて) 関数compの中で次のフレームに進むなどのスクリプトを書いて 次のフレームに trace(imgSrc); を書いておくのも1つの方法です。 例:フレーム1 で XMLをロードし   ロード完了次第 フレーム2 に進めて   フレーム2 以降で本体のスクリプトを動作させる。

trfnc223
質問者

お礼

ご回答ありがとうございました!!!! 大変助かりました! 今回はcomp内に引数を持たせて別のfunctionを呼ぶ 方法で対処いたしました!!! ありがとうございます!

関連するQ&A

  • ActionScript3.0によるPHPへの変数の送信について

    はじめまして。 現在、FlashとPHPを用いたシステムを制作中なのですが、FlashからPHPへの変数の送信でつまづきました。 ネット上で調べてみてもAS3で解説しているサイトはほとんど見つからず、見つかっても自分の理解が悪いのかうまく行かない状況です。 状況としては下記のようなAS3とPHPを実行しています。 AS3から値をPOSTしてPHPで表示、それを読み取ってFlashでtraceしています。traceで1234は返ってきているのですが、PHP側ではcomp=しか表示されません。初歩的なミスだと思いますが、どこが悪いのかアドバイスいただければ幸いです。 よろしくお願いします。 環境 Flash CS3 Apache2.2 PHP5.2.6 ソース AS3 System.useCodePage = true; var request:URLRequest = new URLRequest ( "http://localhost/sample/FlashToPHP.php" ); //PHPへPOST送信 request.method = URLRequestMethod.POST; var variables:URLVariables = new URLVariables(); //送る変数 variables.num = "1234"; request.data = variables; var loader:URLLoader = new URLLoader (request); loader.dataFormat = URLLoaderDataFormat.VARIABLES; loader.addEventListener(Event.COMPLETE, onComplete); loader.load(request); function onComplete (event:Event):void{ var vars:URLVariables = new URLVariables( event.target.data ); trace( vars.comp ); } PHP <?php //変数を受け取る $comment = $_POST['num']; $comp = $comment; echo "comp=".$comp; ?>

    • ベストアンサー
    • Flash
  • actionscript3.0、XMLのリンク集

    actionscript3.0、XMLのリンク集 Flash、XMLともに初心者です。 Flashに外部XMLを読み込んで、更新のしやすいリンク集を制作したいと思います。 調べながら作っているのですが行き詰っております。。 やりたい事としては、 「swf内のテキストエリアに外部から読み込んだXMLを表示させリンクを張る」です。 例として ■A社 http://www.○○○.com ■B社 http://www.△△△.com ■C社 http://www.□□□.com のようなものです。 「■A社」の部分までは表示させることができたのですが、 その後URLを表示させリンクを張るという処理のしかたが分かりません。 あとなぜかXMLには複数行入っているのですがswfには1行目しか表示されません。。 制作したXMLとactionscriptは下記のようなものです。 <?xml version="1.0" encoding="utf-8"?> <data> <list name="■A社" /><url>http://www.○○○.com</url> <list name="■B社" /><url>http://www.△△△.com</url> <list name="■C社" /><url>http://www.□□□.com</url> </data> var xmlURL:URLRequest = new URLRequest("link.xml"); var xmlLoader:URLLoader = new URLLoader(); xmlLoader.load(xmlURL); var myXML:XML = new XML(); xmlLoader.addEventListener(Event.COMPLETE, xmlLoadStart); function xmlLoadStart(e:Event):void { myXML = XML(xmlLoader.data); trace(); link_txt.text = myXML.list[0].@name; } 環境はWin XP、Flash CS3、as3、flash player9です。 何卒お願い致します。

    • ベストアンサー
    • Flash
  • AS3 asファイルでイベントリスナが登録できない

    外部(as)ファイルに以下のようなメソッドを記述していたんですが // ***** エラー行 ***** とコメントアウトしている場所で、『型が見つからないか、コンパイル時定数ではありません。:Event。』というエラーが出てしまいます。 外部ファイルではイベントリスナは登録できないのでしょうか? 良かったら回答の方、よろしくお願いします。 public function jsonRead(){ var urlLoader:URLLoader = new URLLoader(); urlLoader.dataFormat = URLLoaderDataFormat.TEXT; urlLoader.addEventListener(Event.COMPLETE, jsonReadHandler); urlLoader.load(new URLRequest("json_text.json") ); function jsonReadHandler(e:Event):void{ // ***** エラー行 ***** var json_data:String = URLLoader(e.currentTarget).data; // ターゲットからテキストデータを取得して変数に代入 var json_decode_data:Object = JSON.parse(json_data); // 読み込んだテキストをjsonオブジェクトにデコード this.pages_of_book = Number(json_decode_data[0].number); trace(this.pages_of_book); } // jsonReadHandler() } // jsonRead()

    • ベストアンサー
    • Flash
  • 外部テキストから変数の取得(読み込みは成功)

    外部テキストから変数の取得(読み込みは成功) Flash CS5Proの体験版を使っています。 外部テキストから変数を取得したいのですが、呼び出すことが出来ずに困っています。 このように書いたのですが・・・ var varLoader:URLLoader = new URLLoader(); varLoader.dataFormat = URLLoaderDataFormat.VARIABLES; var url:URLRequest=new URLRequest("num.txt");//テキストにはm=50とだけ書いてあります varLoader.addEventListener(Event.COMPLETE, var_loadcomp); varLoader.load(url); // 外部テキストのロード完了 function var_loadcomp(e:Event) { var img_n:URLVariables = e.target.data; trace(img_n.m);//結果:40 } trace(img_n.m);//結果:未定義のプロパティ img_n へのアクセスです。 ここで取得するにはどのようにすればよいのでしょうか・・・。 未定義のプロパティという事なので、一度flash側で変数fを用意して、そこに代入してみましたが、その結果はNaN、代入できていませんでした。 初歩的なことですみませんが、回答よろしくお願い致します。

    • ベストアンサー
    • Flash
  • データバインディングで代入を検出できません。

    var RssXML:XML; private var RssxmlLoader:URLLoader; private function init():void { var RssUrl:String ="http://example.com/ex.xml"; RssxmlLoader = new URLLoader(); RssxmlLoader.dataFormat = URLLoaderDataFormat.TEXT; RssxmlLoader.addEventListener(Event.COMPLETE, RssxmlComplete); var RssurlReq:URLRequest = new URLRequest(RssUrl); RssxmlLoader.load(RssurlReq); }; private function RssxmlComplete(e:Event):void { RssXML =new XML(RssxmlLoader.data); trace(RssXML); }; <mx:VBox label="一般" width="100%" height="100%"> <mx:DataGrid width="777" height="339" dataProvider="{RssXML}"> <mx:columns> <mx:DataGridColumn dataField="title" headerText="名前"/> <mx:DataGridColumn dataField="link" headerText="値"/> </mx:columns> </mx:DataGrid> これでデータバインディングでは"RssXML"への代入を検出できません。となってしまうのですが、どうしたらよいでしょうか?

  • 下記のような関数から外部からの戻り値を返したいのですが

    下記のような関数から外部からの戻り値を返したいのですが 良い方法はございませんでしょうか? 例えば trace( test( "test" ) ); このように戻り値を返す関数にしたいです。 function test( strData:String ):String { var variables:URLVariables = new URLVariables(); variables.data = strData; var request:URLRequest = new URLRequest(); request.url = "http://test.asp"; request.data = variables; request.method = URLRequestMethod.POST; var loader = new URLLoader(); loader.addEventListener(Event.COMPLETE , function(event) { var retValue:String = new String(event.target.data); }); loader.load(request); //return ???? }

    • ベストアンサー
    • Flash
  • AS3.0で取得した外部XMLの文字の一部に色付け

    Flash professional CS5を使用してAS3.0で記述しています。 外部XMLに文章が入っており,それを作成したテキストフィールドに入れます。 そして,その文章の一部の必要なところだけ文字の色を変えたいと考えています。 テキストボックスや文章を細切れにするのは大変だと思うのですがなにかやり方があるのでしょうか? プロパティインスペクタで細かい設定もできないですし; 例文として ・彼は何万人もの参加者から選ばれた というものを使うとします。 ここで 彼は何万人もの<sentence style="color:#0000FF;">参加者</sentence>から選ばれた のようにしてもflash(AS3.0)ではこの色のタグなどは識別不可能なのでしょうか? (stringなので単に文字列として認識されないとか。。) XML用のスクリプトはこのように記述しました。 var loader:URLLoader = new URLLoader(); var urlReq:URLRequest = new URLRequest("sample.xml"); loader.load(urlReq); loader.addEventListener(Event.COMPLETE, onLoaded); function onLoaded(eventObj:Event):void{ var item:XML; var xmlObj:XML = new XML(loader.data); var wordList:XMLList = xmlObj.sentence; item = wordList[0]; test_txt.text = item.text(); } よろしくお願いいたします。

  • 【AS3.0 変数をPHPにPOSTする方法】

    【AS3.0 変数をPHPにPOSTする方法】 開発環境:WinXP ADOBE CS4 ActionScript3.0 すいません。教えてください。 Flashで得た複数の値を外部ファイルに出力したいと考えています。 例えば、btnA・btnB・btnCという3つのボタンがあり、 ボタンをクリックすると、クリック数がカウンターになり、 その値をPHPファイルにPostしたいと考えています。 現在のソース(btnAのみ) ---------------------------------------------------------------- var req:URLRequest = new URLRequest ("http:++++++.php"); req.method = URLRequestMethod.POST; var variables:URLVariables = new URLVariables(); //送信パラメータ variables.num01 = 0; req.data = variables; var loader:URLLoader = new URLLoader (req); var are01=0 var num01=0 a_btn.addEventListener(MouseEvent.CLICK,aClick); function aClick(event:MouseEvent):void{ var num01=are01++ trace(num01) var printdata:URLVariables = new URLVariables(event.target.data); loader.load(req); } -------------------------------------------------------------- num01の数値がトレースはされているのですが、 phpの値に代入されません。 --------------------------------------------------------------- phpソース $comment = $_POST['num01']; print "rData=" . $comment;</body> ---------------------------------------------------------------- 同時に複数の値・仮にnum02・num03も同様にPHPにPOSTしたいと考えているのですが、 その際の方法がわかりません。 恐れ入りますが、ヒントだけでもよいので教えていただけないでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • AS3 Flash 外部テキストの取得

    いつもお世話になっております。 AS3で外部テキストの取得をしてるのですが、どうもうまくいきません。 以下コードです --------------------------------------------------------------- function init02(event:Event):void { var urlReq02:URLRequest=new URLRequest("C:/swf_xsplit/twitter.txt"); var txtloader02:URLLoader = new URLLoader(); txtloader02.load(urlReq02); if (txtloader02.data!=null) { var twitterStr02:String=txtloader02.data; var lines:String=twitterStr02; lines=lines.replace("\r\n"," ").replace("\n"," ").replace("\r"," ").replace("<br>"," ").replace("< /br>"," "); subStrNew=lines; trace("timer = " + lines); if (subStrOld!=subStrNew) { myTimer.stop(); subStrOld = subStrNew; if (mc_1.x >= stage.stageWidth) { this.mc_1.addEventListener(Event.ENTER_FRAME,move_hidari); } } } } ---------------------------------------------------- このinit02()は2秒おきにタイマーで呼び出しております、 処理としては、テキストの値が変わったらイベントを投げる処理です。 URLLoaderをメソッドの外に(メンバ変数)にするとテキストを取得出来ますが、 毎回、同じ内容になってしまいます。 URLLoaderをメソッドの中(上記のコード)に入れると dataがUndifineで帰ってきてしまいます。 お忙しいとは存じますが、有識者の方、何卒、ご指導お願いいたします。

    • ベストアンサー
    • Flash
  • Flash as3.0版ソース  ボタンで内容遷移、うまくいかない…

    こんにちは。 Flash as3.0勉強始めてばかりです。 下記のソースのエラーはボタンを押したたびに、表示した内容はどんどん重ねています。たとえば、(1)ボタンを押した場合、(1)の内容を表示されまして。(2)ボタンを押したとき、画面には(1)+(2)の内容を表示されています。 いろいろ調べましたんですが、なかなかうまくいかないです。 ご解答をよろしくお願い致します。 詳細ソース ーーーーーーーーーーーーーーーーーーーーーー // イベントを設定 Button_tsr.addEventListener ( MouseEvent.CLICK , onClick1 ); Button_gaiyou.addEventListener ( MouseEvent.CLICK , onClick2 ); Button_message.addEventListener ( MouseEvent.CLICK , onClick3 ); Button_jigyou.addEventListener ( MouseEvent.CLICK , onClick4 ); Button_saiyou.addEventListener ( MouseEvent.CLICK , onClick5 ); Button_toiawase.addEventListener ( MouseEvent.CLICK , onClick6 ); // ローダーオブジェクトを作成し配置 var loader_obj : Loader = new Loader(); stage.addChild (loader_obj); loader_obj.x = 85; loader_obj.y =97; // 画面クリックをするとonClickが動作するイベント function onClick1 ( event:MouseEvent ) { // URLRequestを設定 var url0:URLRequest = new URLRequest( "Top.swf" ); // 実際にページに飛ぶ loader_obj.load ( url0 ); } function onClick2 ( event:MouseEvent ) { // URLRequestを設定 var url1:URLRequest = new URLRequest( "概要.swf" ); // 実際にページに飛ぶ loader_obj.load ( url1 ); } function onClick3 ( event:MouseEvent ) { // URLRequestを設定 var url2:URLRequest = new URLRequest( "Message.swf" ); // 実際にページに飛ぶ loader_obj.load ( url2); } function onClick4 ( event:MouseEvent ) { // URLRequestを設定 var url3:URLRequest = new URLRequest( "サービス.swf" ); // 実際にページに飛ぶ loader_obj.load ( url3); } function onClick5 ( event:MouseEvent ) { // URLRequestを設定 var url4:URLRequest = new URLRequest( "情報.swf" ); // 実際にページに飛ぶ loader_obj.load ( url4); } function onClick6 ( event:MouseEvent ) { // URLRequestを設定 var url5:URLRequest = new URLRequest( "問合せ.swf" ); // 実際にページに飛ぶ loader_obj.load ( url5); }

専門家に質問してみよう