0

マルチレベル配列 (オブジェクト?) に 2 つのデータがあり、2 つの for ループで設定されたコールバック関数で参照しています。ただし、現在のループ値をコールバックに取得する方法がわかりません。すべてのコールバックに最後の値が使用されます。

for (k in myobj.myarr) {
    for (m in myobj.myarr[k]){
        document.addEventListener(
            k,
            function(event){
                myobj.myfn(event, myobj['myarr'][k][m][0], myobj['myarr'][k][m][1]);
            },
            true
        );
    }
}

myobj['myarr'][k][m][0]文字列と関数はどこにありますかmyobj['myarr'][k][m][1]。関数にaconsole.logがあり、同じ関数が常に呼び出されます (最後の関数)。

はい、これはおそらく奇妙な実装です。いいえ、ライブラリを使用できません。配列から正しい値を取得してコールバック関数に渡すにはどうすればよいですか?

4

2 に答える 2

3

本当に必要なのは、m が 1 つのリスナーだけが知っているコンテキストにバインドされることです。わかりやすくするために、次のような関数を定義できます。

function doEvent(k, myobj, m) {
  document.addEventListener(
    k,
    function(event){
      myobj.myfn(event, myobj['myarr'][k][m][0], myobj['myarr'][k][m][1]);
    },
    true
  );
}

...そして、配列内の各オブジェクトに対して呼び出します。

for (k in myobj.myarr) {
  for (m in myobj.myarr[k]){
      doEvent(k, myobj, m);  
  }
}

mこれで、イベントはループ内のそれぞれの に固有になります。

于 2012-10-26T15:04:42.910 に答える
1

次のようにイテレータの値を「ロック」できます。

for( k in myobj.myarr) {
    for( m in myobj.myarr[k]) {
        (function(m,k) {
            // code that depends on m and k here
        })(m,k);
    }
}

ただし、非常に多数のイベント リスナーを作成しているようで、パフォーマンスが低下しているようです。イベント ハンドラーを親要素に委任しevent.target、実際の要素を見つけるために使用する方法はありませんか?

于 2012-10-26T15:03:02.447 に答える