anItem.addEventListener("click", iRespond, false);
問題は、iRespond が多数のアイテムのクリックを処理することになっているため、iRespond に引数を渡す必要があり、アイテムを区別する方法が必要なことです。
どのようにできるのか?
anItem.addEventListener("click", iRespond, false);
問題は、iRespond が多数のアイテムのクリックを処理することになっているため、iRespond に引数を渡す必要があり、アイテムを区別する方法が必要なことです。
どのようにできるのか?
シンプルな閉鎖:
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
)。ただし、混乱する可能性があります。
誰も最も簡単な解決策を提供していないようです。次のように、他の関数呼び出しを無名関数に入れます。
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
}
多くの可能性があります。No1 は、そのための閉鎖を作成します。も使用できますbind()
。
target
より良い解決策は、リスナーにも渡されるイベントのプロパティによって (アイテムごとに) オプションを区別することです。<ul>
これは、要素ごとにハンドラーを追加するなど、多くのアイテムに対してハンドラーを 1 つだけ使用している場合に非常に洗練されたものになります<li>
。次に、ターゲット要素の ID またはデータ属性などによって、何をするかを選択します。