2016-12-30 7 views
0

div内のすべてのボタンに「クリック」イベントを添付します。この除き:一度に複数の要素にイベントハンドルをアタッチする

var div1 = document.getElementById("div1"); 
var elements = div1.getElementsByTagName('button'); 
for(var i = 0, len = elements.length; i < len; i++) { 
    elements[i].onclick = function() { 
     // stuff 
    } 
} 

は純粋なJSに一度にすべてのボタンに「onclickの」関数ハンドラをアタッチする良い方法はありますか?

+1

[イベント委任](http://stackoverflow.com/questions/1687296/what-is-dom-event-delegation)を使用できます。 –

+0

あなたはいつでも 'elements [i] .addEventListener(" click "、functionName、false);' 'for'ループを'(var i = 0; i NewToJS

+0

1つのハンドラを親要素にバインドします。 Muhammadsのリンクを参照してください。 – Shilly

答えて

0

コードを減らすために、clickHandler関数を定義してこの関数をすべてのボタンに割り当てることができます。

HTMLCollectionとしない配列でdiv1.getElementsByTagName( 'ボタン')の結果。 Array.forEach構文を利用するには、callを使用できます。

例:

var clickHandler = function (e) { 
 
    console.log(this.textContent); 
 
}; 
 

 
var div1 = document.getElementById("div1"); 
 
var elements = div1.getElementsByTagName('button'); 
 
Array.prototype.forEach.call(elements, (ele) => {ele.onclick = clickHandler;});
<div id="div1"> 
 
    <button type="button">Button 1</button> 
 
    <button type="button">Button 2</button> 
 
    <button type="button">Button 3</button> 
 
    <button type="button">Button 4</button> 
 
</div>
:あなたはArrow Functionsを使用できる場合

var clickHandler = function (e) { 
 
    console.log(this.textContent); 
 
}; 
 

 
var div1 = document.getElementById("div1"); 
 
var elements = div1.getElementsByTagName('button'); 
 
Array.prototype.forEach.call(elements, function(ele) { 
 
    ele.onclick = clickHandler 
 
});
<div id="div1"> 
 
    <button type="button">Button 1</button> 
 
    <button type="button">Button 2</button> 
 
    <button type="button">Button 3</button> 
 
    <button type="button">Button 4</button> 
 
</div>

は、彼らだけES6でサポートされている、あなたはもっと自分のコードを圧縮することができます

+0

あなたの答えは、ここで矢印機能を使用することが何らかの重要性を持っているという印象を与えます。そうではないので、矢印の機能部分を破ることができますか?また、 '.map'の代わりに' forEach'をもっと呼び出すこともできます。 –

2

コメントに記載されているとおり、event delegationを使用できます。その場合、単一のイベントハンドラが、処理したい要素の共通の祖先に追加されます。ハンドラの内部では、イベントの発生元の要素が検査され、処理対象の要素の1つであれば、実際のイベントハンドラロジックが実行されます。ブラウザ、特に古いIEのバージョン間のイベントシステムであっ違いという

var div1 = document.getElementById('div1'); 
div1.onclick = function(event) { 
    if (event.target.nodeName.toLowerCase() !== 'button') { 
    return; 
    } 
    // stuff 
}; 

注:お使いの場合には、それは次のように可能性があり

。それらのバージョンをサポートしたい場合は、それに対処する必要があります。 onclickの代わりにaddEventListenerを使用することもできます。

+0

OPを[Event.targetのMDNページ](https://developer.mozilla.org/en-US/docs/Web/API/Event/target)にポイントすると、イベントの委任について説明し、互換性(IE 6-8など) –

関連する問題