イベントに独自引数を渡す方法とは?

このQ&Aのポイント
  • ACTIONSCRIPT3.0で外部ファイルを読み込む処理を行い、イベント発生時に独自引数を渡すことは不可能です。
  • 配列のインデックスによって処理を分けたい場合、イベント発生時の関数であるmyfuncに独自の引数を渡すことはできません。
  • 現在の解決策として、グローバルな配列を作成して処理を行っていますが、これにはメモリ常駐やオブジェクト指向の制約があります。よりスマートな方法はないか検討中です。
回答を見る
  • ベストアンサー

イベントに独自引数を渡したい。

ACTIONSCRIPT3.0で、外部ファイルを読み込ませる処理を行っているのですが、読み込み完了時の関数に独自の引数を渡すことは不可能なのでしょうか? var j:int = 100; var myArray:Array; for(var i=0;i<j;i++){  myArray[i] = new Loader();  myArray[i].load(new URLRequest(別の配列に入っている文字列のURL))  myArray[i].contentLoaderInfo.addEventListener(Event.INIT,myfunc); } function myfunc(e){イベント発生時の処理} のように、多数のイベント処理を書くときに配列のインデックスによって処理を分けたいのですが、上の例だとイベント発生時の関数であるmyfuncの引数は規定オブジェクトなので独自のものが渡せません。 いまは別にグローバルな配列を作成して処理をしているのですが、メモリ常駐になることや、オブジェクト指向として気に入らない状態です。 イベントが発生したオブジェクトの名前をキーにすることも考えましたが、どの道スマートではない。なにか方法はないものでしょうか? また、言語仕様的にやむをえないのでしょうか?

  • Flash
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • cspl
  • ベストアンサー率83% (55/66)
回答No.1

Eventクラスを拡張すれば柔軟にできますが、簡単に渡したい場合は、 下記のようなクロージャを使用する方法があります。 ------------------------------------------- for (var i:int=0; i<j; i++) { myArray[i] = new Loader(); myArray[i].load(new URLRequest("")) myArray[i].contentLoaderInfo.addEventListener(Event.INIT,myfunc(i)); } function myfunc(num:int):Function { return function (event:Event):void { trace(num); } ------------------------------------------- 他の方法も参考までに。 ■AS3:イベントリスナーの引数2-追加パラメータを渡す http://blogs.yahoo.co.jp/k3_labs/4399737.html ■addEventListenerで一緒に引数を渡したい http://blog.img8.com/archives/2008/04/003758.html

stonebarr6
質問者

お礼

ありがとうございます。 最初、「イベントリスナーになんで戻り値がいるのだ」と思ってしまいましたが、短い内容でくるくるまわって 大成功!! なるほど~~ 裏だ!なんと裏技っぽい裏ワザだ!と思いました。 コンパイルエラーが出ないことを確認してから書き込んでいるので遅れて申し訳ありませんが、リンクともにとても参考になりました。 ありがとうございます。

関連するQ&A

  • 【ActionScript】大量引数の効率のよい受け渡し法は?

    FLASH8(ActionScript2.0)使用者です。 ユーザー定義関数にて引数が大量にある場合、効率よく記述するにはどうすればいいのでしょうか。 現状配列で引数ひとつにまてめて処理しているのですが、関数内で展開する記述が非効率に思えます。 myArray["name"] = "taro"; myArray["age"] = 20; myArray["addr"] = "tokyo";  ・・・ function myFunc(myArray){  var name = myArray["name"];  var age = myArray["age"];  var addr = myArray["addr"];  ・・・ } この展開部分が数十に及ぶ場合、for文か何かで一発記述できればいいのに… と思うわけですがどうなんでしょうか。 「varなしにする」「配列のまま使う」 という方法もあると思いますが今回は除外させてください。 「無理」という回答でも結構です。 よろしくお願いいたします。

    • ベストアンサー
    • 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
  • prototype.jsのAjax.Requestでeventを引数にしたのですが

    prototype.jsのAjax.Requestといつ便利な関数がありますが onComplete時の引数にeventオブジェクトを設定したらIE7では eventオブジェクトが引き継げませんでした。 たとえばこのようなメソッドで function ajax_request(url, params, method, ele1, ele2){ var nt = new Date(); var pr = params + "&nt=" + nt.getTime(); var a = new Ajax.Request( url, { method: "get", parameters: pr, onComplete: function(request){ method(request, ele1, ele2); } } ) }; ele1にeventオブジェクトを設定し、methodを実行しても デバックで、ele1.typeが何も表示されませんでした。 firefox2.0だと「click」など正しく表示もされオブジェクトが引き継がれておりました。 何が問題なのでしょうか?それともIE7ではeventオブジェクトを引き継ぐことは出来ないのでしょうか?

  • JavaScriptでArrayオブジェクトもどきの独自オブジェクトを作りたい!

    お世話になります。 JavaScriptを用いて、ある条件の下でArrayオブジェクトのような独自オブジェクトを定義したいのですが、ゆっくり調べている時間がなく、こちらの方を頼らせていただくことにしました。 【やりたいこと】 Arrayオブジェクトのような独自オブジェクトを定義したい。 【やりたいことの条件】 条件1: Arrayオブジェクトが戻り値として返ってくる既存の関数があり、その戻り値であるArrayオブジェクト自身を新たなオブジェクトとして定義したい。 この関数は、 ・Arrayオブジェクトの要素とは全く無関係の引数をとる。 ・この関数の仕様を変更することはできない。 という特徴があります。 条件2: 独自オブジェクトを作る際の引数は、上述の既存の関数の引数と同じ。 【サンプル】 上記の説明では、少々わかりにくいかもしれませんので、使い方のサンプルを以下に示します。 既存の関数: function immovableFunc(param1, param2) { var myArray = new Array; … return myArray; } 今回作りたいオブジェクト: PseudoArray 今回作りたいオブジェクトの使われ方: var pa = new PseudoArray(param1, param2); そもそも、このようなオブジェクトが作れるのか?、作れるとするならばどのように記述するのか?見当も付かない状態です。 皆さんのお知恵を拝借させていただければと思います。 どうぞ、よろしくお願いいたします。

  • AS3.0でクリック数に応じて配列の値を返したい…

    こんにちは、 AS3.0のド初心者です。 タイトルの通りのことをやってみたいのですが、うまくいきません。 var myArray:Array=["一度クリックされました","二度クリックされました","三度クリックされました","四度クリックされました"]; addEventListener(MouseEvent.MOUSE_DOWN,myFunc); function myFunc(e:Event):void{ var i:int=0; if(i<=myArray.length){ myArray_txt.text=myArray[i]; i++; } else{ nextFrame(); } } これを実行すると、一度クリックされましたと表示されて以降、テキストが変化しません。 ご教授のほどよろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ActionScriptで配列をクリアする方法を教えてください。

    ActionScriptで、オブジェクトを格納した配列をクリアする正しい方法を教えてください。 具体的には、 ・new Array() で配列を生成する。 ・new Object() で生成したオブジェクトを配列に格納する。 ・配列の中身を処理したあと、配列を一度クリアする。 ・配列に別のオブジェクトを格納する。 ような処理をしたいのですが、メモリリークを起こさずに配列をクリアするにはどうしたらいいでしょうか? 例えば、イメージはこんな感じです。(意味のないコードですが) // 配列の生成 var arr = new Array(); // 配列にオブジェクトを格納 for (var i = 0; i < 5; i++) { var obj = new Object(); obj.num = i; } // 配列のクリア arr.length = 0; // クリアした配列に別のオブジェクトを格納 for (var i = 0; i < 5; i++) { var obj = new Object(); obj.num = i * 2; } 上記のコードで、arr.length = 0; で配列をクリアしていますが、これで配列に格納されたオブジェクトが確保したメモリがすべて解放されるでしょうか? あるいは、配列の内容がなくなるまで pop() 等で取り出す等の処理をする必要があるでしょうか? 以上よろしくお願いします。

    • ベストアンサー
    • Flash
  • JavaScriptでオブジェクトの配列

    function myfunc() {} で定義したようなオブジェクトを var arr = new Array(); arr.push()で配列に入れて、あとから取り出す際に arr[0]をmyfunc型として使うにはどうすればよいでしょうか? キャストのようなものも多分なさそうですし。

  • タイマー実行ごとにtraceの出力回数が増えていく

    こんばんは。 ActionScript3で以下の処理を作成しました。 XMLファイルをロード、中身を配列に入れ終わったらタイマーを起動し、 2秒間隔で配列の中身をロード、ロード完了後にtraceで読み込み完了のメッセージを出力 という内容です。 上記の処理を下記に記載して実行した所、2秒間隔で処理は実行されますが、 traceしている"画像読み込み完了"の出力がタイマーを実行するごとに数が増えて表示されます。 1回目のタイマーでは"画像読み込み完了"が一回だけ表示され、 2回目は"画像読み込み完了""画像読み込み完了"と二回表示、 以降回数の分だけ"画像読み込み完了"が出力されます。 なぜこのような動きになるのでしょうか? とても初歩的な内容だと思いますが、ご教授いただけると幸いです。 ↓以下ソース // タイマー var slideTimer:Timer=new Timer(2000,0); // 外部XMLファイルロード var sample_xml:XML=new XML(); var xmlLength_num:Number; var xmlLoader:URLLoader = new URLLoader(); var dataArr:Array = new Array(); var largeLoader:Loader = new Loader(); var count:Number = 0; xmlLoader.addEventListener(Event.COMPLETE, completeXMLHandler); xmlLoader.load(new URLRequest("xml/file.xml")); function completeXMLHandler(event:Event) { var local_xml:XML = new XML(event.target.data); sample_xml = local_xml; xmlLength_num = sample_xml.image.length(); for(var i:Number = 0; i < xmlLength_num; i++) { dataArr.push(sample_xml.data[i]); } slideTimer.start(); } // タイマー処理 slideTimer.addEventListener(TimerEvent.TIMER, slideStart); function slideStart(event:Event):void { var largeRequest:URLRequest=new URLRequest(dataArr[count]); largeLoader.load(largeRequest); largeLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, dataCompleteHandler); function dataCompleteHandler(event:Event) { trace("画像読み込み完了"); count++; } }

    • ベストアンサー
    • Flash
  • イベントハンドラの関数の引数について

    こんにちは。 Object.onmouseoverのイベントハンドラにObject.classNameとeventを引数とする関数(func1)を指定するにはどのような風にしたら良いでしょうか?以下のように 試しましたがいずれも動きません。 function func1(obj,event){・・・} (1)Object.onmouseover=function(){func1(Object.className,event)} //エラー:Object.classNameはNull (2)Object.onmouseover=function(Object.className,event){func1(Object.className,event)} //無反応 (3)Object.onmouseover="func1("+Object.className+",event)"; //onmouseoverでない時にfunc1が呼び出される。 よろしくお願いいたします。

  • 配列の中身を全て順番に別の関数へ引数として渡すには

    配列の中身を全て順番に別の関数へ引数として渡すには、どうすればよいでしょうか? このままだと、'null' は Null またはオブジェクトではありません。 となります。 function piyo(hoge){ alert(hoge); } for (var i = 0; i < hogearray.length; i ++) { piyo(hogearray[i]);//ここを通ったら、順番の関数を呼び出すようにしたい } また、グローバル変数として渡すには、どうすればよいでしょうか?

専門家に質問してみよう