1
anItem.addEventListener("click", iRespond, false);

問題は、iRespond が多数のアイテムのクリックを処理することになっているため、iRespond に引数を渡す必要があり、アイテムを区別する方法が必要なことです。

どのようにできるのか?

4

3 に答える 3

3

シンプルな閉鎖:

var foo = "bar";
e.addEventListener('whee',function(evt){
  iRespond(evt,foo);
},false);

単純なクロージャーではうまくいかない場合 (ループ内などで変化する変数をラッチしているために)、その値に対して新しいクロージャーを作成する必要があります。

foo.addEventListener('bar',(function(jim){
  return function(evt){
    iRespond(evt,jim); // Surprise surprise, jim is available here!
  }
})(someValueToBeNamedJim), false);

例えば:

var buttons = document.querySelectorAll('button');
for (var i=buttons.length;i--;)}
  buttons[i].addEventListener('click',(function(j){
    return function(){ alert("You clicked on button #"+j); };
  })(i),false);
}

関数の内外で変数に同じ名前を付けても問題ありません (たとえば、上記のi代わりに使用するなどj)。ただし、混乱する可能性があります。

于 2012-04-24T22:55:51.290 に答える
2

誰も最も簡単な解決策を提供していないようです。次のように、他の関数呼び出しを無名関数に入れます。

anItem.addEventListener("click", function() {
    iRespond(your arg here);
}, false);

または、多くの場合、thisイベント リスナーでポインターを参照するだけで、どのオブジェクトから呼び出されたかを確認できます。

anItem.addEventListener("click", iRespond, false);

次に、でiRespond

function iRespond() {
    // this points to the item that caused the event so you can 
    // determine which one you are processing and then act accordingly
    // For example, this.id is the id of the object
}
于 2012-04-24T23:02:26.240 に答える
1

多くの可能性があります。No1 は、そのための閉鎖を作成します。も使用できますbind()

targetより良い解決策は、リスナーにも渡されるイベントのプロパティによって (アイテムごとに) オプションを区別することです。<ul>これは、要素ごとにハンドラーを追加するなど、多くのアイテムに対してハンドラーを 1 つだけ使用している場合に非常に洗練されたものになります<li>。次に、ターゲット要素の ID またはデータ属性などによって、何をするかを選択します。

于 2012-04-24T22:58:42.267 に答える