関数名に変数を使いたい場合

このQ&Aのポイント
  • 関数名に変数を使いたい場合、for文を使って処理する方法があります。
  • for文を使うと、同じ処理を繰り返すことができます。
  • 関数名に変数を使う場合、for文の中でイベントリスナーを追加することができます。
回答を見る
  • ベストアンサー

関数名に変数を使いたい場合

下のように多くのaddEventListener関数を作りたいので arr[0].addEventListener(MouseEvent.CLICK, onClick0); arr[1].addEventListener(MouseEvent.CLICK, onClick1); arr[2].addEventListener(MouseEvent.CLICK, onClick2); arr[3].addEventListener(MouseEvent.CLICK, onClick3); arr[4].addEventListener(MouseEvent.CLICK, onClick4); arr[5].addEventListener(MouseEvent.CLICK, onClick5); for文にいれて下のように処理したいのですが、 関数名に変数を使えず、困っています。 for(var i:int=0; i<6; i++){ arr[i].addEventListener(MouseEvent.CLICK, onClick i ); } 「 onClick i 」この部分は、どうやって記述すればよいのでしょうか? ご存知の方いらっしゃいましたら、どうかよろしくお願いします。

noname#179453
noname#179453
  • Flash
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

関数の名前も参照の一種です。 ですから、文字列を [ ] でムービークリップなどの参照に変換する要領で  this[ "onClick" + i ] という書き方が通用します。 ちなみに、参照に変換したものの後ろに ( ) を付けて  this[ "onClick" + i ](); このように書くと、関数を”呼び出す”ことができます。 引数を必要とする関数の場合は ( ) の中に引数を記述します。 addEventListener の第2引数には関数の”参照”を渡すことになっているので、今回の件では ( ) は不要です。

noname#179453
質問者

お礼

大変遅くなり申しわけありません。 とても役に立ち、解決しました! ありがとうございました!

関連するQ&A

  • 【AS3】ループ処理で関数名を作成するには?

    ActionScript3.0についてご教授ください。 forなどを使い、ループ処理を使って変数名を作成する要領で 関数名を作ることは可能なのでしょうか? やりたい処理を記述させて頂きますと次の通りです。 ステージにある3つのボタン「btn0」「btn1」「btn2」に対して マウスクリック時の処理を書こうとしている例文です。 もちろん、これではエラーになります。 for( var i:int; i<3; i++ ){   this["btn"+i].addEventListener( MouseEvent.MOUSE_DOWN,"on"+i );   function "on"+i( e:MouseEvent ):void{     trace( e.target.name );   } } こうした処理を実現したい場合、"on"+i 部分をどのように記述すると良いのでしょうか? もしご存知でしたらお知恵をいただけないでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • Flash
  • 関数内での繰り返し処理の結果を配列で受け取りたい

    関数内でfor文で繰り返し処理を行い、 結果を配列として返すような関数を書きたいと思っています。 function hoge(){ var a = [1,2,3,4]; for (var i=0; i < a.length; i++){ a1 = "a" + i; var arr = new Array(); arr.push(a1); } return arr; } しかし、以下のように 関数hogeの結果を変数bで受け取ってみると、 配列の最後のデータしか表示されません。 var b = hoge(); alert(b); //a3のみが表示される a0, a1, a2, a3と表示されるようにするには、 どうしたらよいでしょうか。

  • AS3の配列の中にアクセス

    FlashCS3でas3を使っています。 配列についての質問なのですが、 下記のコードがあるとします。 var btn_arr:Array=[aboutA_mc,aboutB_mc,aboutC_mc,aboutD_mc]; 配列に格納したボタン全てに、同じマウスアクションをつけたい場合など、 for (var i:int = 0; i<btn_arr.length; i++) { btn_arr[i].addEventListener(MouseEvent.Roll_Over,abcdOver); } function abcdOver(e:MouseEvent):void { btn_arr[i].textColor = #FFFFF; とかで、出来るかなと思ったのですが、上手くいきません。 何か良い方法があれば、ご教授よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 【AS3】配列を使って複数のボタンに別々のリンク先を指定するスクリプト

    【AS3】配列を使って複数のボタンに別々のリンク先を指定するスクリプトを教えてください。 配列を使って、btn1、btn2、btn3というインスタンスに それぞれ別のリンク先を設定したいと思っています。 実際には15個以上のリンクボタンを設置したいので、 配列を使ってできるだけ短いスクリプトにしたいです。 ---------------------------------------------- for (var i:int = 1; i < 4; i++) { this["btn"+i].addEventListener( MouseEvent.CLICK , onClick ); } function onClick( event:MouseEvent ) { var url:Array = new Array(); url[1]="http://www.yahoo.co.jp"; url[2]="http://www.google.co.jp"; url[3]="http://www.goo.ne.jp"; for(var i:int = 1; i < 4; i++){ if (this ["btn"+i]) { var link:URLRequest=new URLRequest(url[i]); var target:String="_self"; navigateToURL(link,target); } } } ---------------------------------------------- 上のように記述してみたのですが、全てのボタンが 配列一番最後のリンク先(url3)になってしまいます。 traceで「i」を出力してみると 1 2 3 と出るので、 for(var i:int = 1; i < 4; i++){}で 全て繰り返してしまっているらしいことはわかりますが どこをどう修正すればいいのかわかりません; 初心者で恐れ入りますが、易しくご教示いただけると幸いです。

    • ベストアンサー
    • Flash
  • AS3.0で、複数のボタンをaddChildを使って配置しマウスイベン

    AS3.0で、複数のボタンをaddChildを使って配置しマウスイベントをfor文でまとめて設定する場合で悩んでおります、現在の以下のようにコーディングしているのですが、 //ボタン数 const Btns:uint=3; //ボタン配置 for (var i:uint=1; i<Btns+1; i++) { var BtnName:String="btn0"+i; ->ボタンにつけたクラスネーム var BtnClass:Class=getDefinitionByName(BtnName) as Class; var btnMC:MovieClip = new BtnClass(); loadmc02.addChild(btnMC); (loadmc2はボタンを配置するMC) btnMC.buttonMode=true; btnMC.x=10*i+140*(i-1); btnMC.y=340; if (i==1) { btnMC.addEventListener(MouseEvent.CLICK, BtnOnClick1); btnMC.addEventListener(MouseEvent.ROLL_OVER, BtnRollOver1); btnMC.addEventListener(MouseEvent.ROLL_OUT, BtnRollOut1); } else if (i==2) { btnMC.addEventListener(MouseEvent.CLICK, BtnOnClick2); btnMC.addEventListener(MouseEvent.ROLL_OVER, BtnRollOver2); btnMC.addEventListener(MouseEvent.ROLL_OUT, BtnRollOut2); } else if (i==3) { btnMC.addEventListener(MouseEvent.CLICK, BtnOnClick3); btnMC.addEventListener(MouseEvent.ROLL_OVER, BtnRollOver3); btnMC.addEventListener(MouseEvent.ROLL_OUT, BtnRollOut3); } } です。BtnOnClick1~3は異なるURLでBtnRollOver1~3、BtnRollOut1~3は function Over(hikisu)、function Out(hikisu)という関数を作って、 function BtnRollOver1(eventObject:MouseEvent):void { Over(1); } function BtnRollOut1(eventObject:MouseEvent):void { Out(1); }てな感じで動かしたい。 2.0とかってが違うので悩んでいます。効率のよいコーディングの仕方を教えてください。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • AS3 記述方法

    ボタンが複数存在し、それぞれのボタンの処理をまとめたい時に どうするか考えています。 たとえばステージに3つのボタンインスタンス 「btn1」「btn2」「btn3」があるとします。 クリックすると、それぞれに応じた値を得るために ------------------------------------------------------------- btn1.addEventListener(MouseEvent.CLICK,syori1); function syori1(eventObject:MouseEvent):void{ trace("あんぱん"); } btn2.addEventListener(MouseEvent.CLICK,syori2); function syori2(eventObject:MouseEvent):void{ trace("しょくぱん"); } btn3.addEventListener(MouseEvent.CLICK,syori3); function syori3(eventObject:MouseEvent):void{ trace("カレーぱん"); } ------------------------------------------------------------- としているのですが、 たとえばもしこれが100個のボタンがあれば 100回同じような事を記述しないといけないので あまりよろしくないな・・・と思い、 ------------------------------------------------------------- for(var i=1; i<=3 i++){ this["btn"+i].addEventListener(MouseEvent.CLICK,syori); } function syori(eventObject:MouseEvent):void{ trace("ジャム"); } ------------------------------------------------------------- としたのですが、これではどのボタンをクリックしても"ジャム"がトレースされます。(当然ですが・・・) このような時、まとめて記述するにはどうすればよいでしょうか?

  • どのボタンがクリックされたのかを判別させたい。

    FlashのActionScript3.0を使って、システムを構築中です。 ステージには下記の処理にて9個のボタンが配置されています。 var machiBtArr:Array = new Array(); for(var b:int=1; b<10; b++) { var machiBt_str:String = "machi"+ b; var machiBtClass:Class =Class(getDefinitionByName(machiBt_str)); var machiBt:MovieClip = new machiBtClass(); addChild(machiBt); machiBtArr.push(machiBt); } ここまではうまくいったのですが、 たとえば、machiBtArr[3]のボタンがクリックされたら、 imgPhoArr[3]の画像を表示させる。。。という処理をしたいと思います。 ※配列imgPhoArrには、あらかじめムービークリックを登録済みです。 ネットでいろいろ調べ、予め識別できるidなどプロパティを 追加しておけばいいらしいということを知り、 下記のようにコードを追加しました。 for(var i:int=0; i<machiBtArr.length; i++) { // 識別id追加 machiBtArr[i]._id = i; // マウスイベント登録 machiBtArr[i].addEventListener(MouseEvent.CLICK, machiClick); } function machiClick(e:MouseEvent):void { imgPhoArr[i].visible = true; } ただ、この方法だと、どのボタンをクリックしても 必ずimgPhoArr[8]の画像が表示されてしまいます。 machiBtArr[0].addEventListener(MouseEvent.CLICK, machiClick00); machiBtArr[1].addEventListener(MouseEvent.CLICK, machiClick01);… と処理をひとつづつ記述していけばうまくゆくのですが、 それだとソースが膨大になってしまい、何とか短縮させたいと思っています。 ActionScript3.0に精通された、技術者の方々、 良い方法があればご伝授していただけないでしょうか? どうぞ、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • マウスクリックで値を送る(AS3.0)

    Flash Pro CS5 AS3.0 で記述しています。 ステージにtest_txt1とtest_txt2を配置し, クリックされたらどちらも同じ関数(testFunc)を呼び出すようになっています。 コードは stop(); test_txt1.addEventListener(MouseEvent.CLICK, testFunc); test_txt2.addEventListener(MouseEvent.CLICK, testFunc); function testFunc(evt:MouseEvent):void{ trace("呼び出された"); } ここで、どちらのテキストをクリックして呼び出されたのかを判断できるようにしたいのですが どのように記述して関数に値を渡すのでしょうか? 試しに以下のように記述したのですができませんでした。 test_txt1.addEventListener(MouseEvent.CLICK, testFunc, 1); test_txt2.addEventListener(MouseEvent.CLICK, testFunc, 2); function testFunc(evt:MouseEvent, val:int):void{ trace("val"); } よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 引数が変わってしまいます。

    AC3で開発を行っております。 複数のオブジェクト(変数の種類は同じ)を配列で確保し、 一気に処理をしようとしているのですが、引数の動作がうまくいきません。 以下が問題のソースです。 var peat:Array ; var fg1:Object = new Object(); var fg2:Object = new Object(); fg1 = { _sp:Sprite, _img:Loader , _url:String , _x:int, _y:int }; fg2 = { _sp:Sprite, _img:Loader , _url:String , _x:int, _y:int }; peat = new Array( fg1 ); peat.push( fg2 ); for(i = 0;i < 2;i++) { // 値の代入 // クリック時の処理 peat[i].sp.addEventListener( MouseEvent.CLICK , function(event:MouseEvent):void{ test(event, arguments.callee, peat[i]); } ); } クリックしたときに それぞれのオブジェクトを参照したいのですが、 どちらも peat[2] を参照しているようなのです。 (for文の後に i=0 とすると先に設定したほうは正しく動作します。) AC3での開発が初めてなので、変数の宣言から怪しいかも知れませんが ご助力お願いいたします。

    • ベストアンサー
    • Flash
  • 関数 左辺値 参照 返り値 

    こんにちは。宜しくお願い致します。 > たとえば,下のサンプルプログラムでは関数fが参照を返すようになっているため,この関数fを代入の左辺においた,f(a, n) = 10;のような式が許される. > > #include <iostream> > using namespace std; > > int& f(int* a, int n) > { (2)~ return a[n]; > } > > int main(void) > { > const int n = 5; > int arr[n] = { 1, 2, 3, 4, 5 }; (1)~ f(arr, 3) = 10; > for (int i = 0; i < n; ++i) > cout << arr[i] << endl; > return 0; > } 上のサンプルプログラムで左辺値に参照を返す関数が(1)~あるのですが 動作が分りません。 関数内部の(2)~return a[n];というところで、関数の返り値int&の参照はa[n]という変数になるので、(1)~の結果としてa[n]に10が代入されるのでしょうか?教えてください。

専門家に質問してみよう