2016-10-03 9 views
1

私はJavascriptコードを繰り返すことなくイベントリスナを各チェックボックスに追加するためのきれいで簡潔な方法を探しています.JSに関しては、どんな援助も大歓迎です。各チェックボックスにeventListenerを追加

var checkboxes = document.querySelectorAll('input[type="checkbox"]'); 
for(var i = 0; i < checkboxes.length; i++){ 
    var checkbox = checkboxes[i]; 
    checkbox.addEventListener('click', function(){ 
     console.log(this); 
    }); 
} 

を役に立てば幸い:

は、ここで私はこれまで

function exFunction() {}; 
 

 
// on-click 
 
var x = document.getElementById("checkboxopt"); 
 
x.addEventListener("click", function(){ 
 
    console.log("Opt"); 
 
    }); 
 

 
var y = document.getElementById("checkboxopt1"); 
 
y.addEventListener("click", function(){ 
 
    console.log("Opt 1"); 
 
    }); 
 
var z = document.getElementById("checkboxopt2"); 
 
z.addEventListener("click", function(){ 
 
    console.log("Opt 2"); 
 
    });
<div id=""><input name="checkboxopt" id="checkboxopt" value="true" type="checkbox"><br/></div> 
 
<div id=""><input name="checkboxopt" id="checkboxopt1" value="true" type="checkbox"><br/></div> 
 
<div id=""><input name="checkboxopt" id="checkboxopt2" value="true" type="checkbox"><br/></div>

+1

、JavaScriptでは 'イベントdelegation'を調べ、この場合には、あなたは動作を改善するために探しているので、これはhttp://codereview.stackexchange.comに属する一つだけリスナー – pwolaq

+2

を追加する必要がありますコード。 –

+0

@pwolaqさらに勉強するためのすばらしい言葉!私はJSが大好きです。 :) – Beaniie

答えて

2

どちらのコレクションのすべてのループを選択して、コレクション内の各要素にイベントを追加します。

var cbs = document.querySelectorAll('[type="checkbox"]'); 
 
[].forEach.call(cbs, function (cb) { 
 
    cb.addEventListener("click", function(){ 
 
     console.log(this.id); 
 
    }); 
 
});
<div id="wrap"> 
 
    <div id=""> 
 
    <input name="checkboxopt" id="checkboxopt" value="true" type="checkbox"> 
 
    </div> 
 
    <div id=""> 
 
    <input name="checkboxopt" id="checkboxopt1" value="true" type="checkbox"> 
 
    </div> 
 
    <div id=""> 
 
    <input name="checkboxopt" id="checkboxopt2" value="true" type="checkbox"> 
 
    </div> 
 
</div>

やイベントの委任と要素がクリックされたかを把握するためにイベントオブジェクトを使用します。

var wrapper = document.getElementById('wrap'); 
 
wrapper.addEventListener("click", function (evt) { 
 
    var elem = evt.target; 
 
    if (elem.name==="checkboxopt") { 
 
     console.log(elem.id); 
 
    } 
 
});
<div id="wrap"> 
 
    <div id=""> 
 
    <input name="checkboxopt" id="checkboxopt" value="true" type="checkbox"> 
 
    </div> 
 
    <div id=""> 
 
    <input name="checkboxopt" id="checkboxopt1" value="true" type="checkbox"> 
 
    </div> 
 
    <div id=""> 
 
    <input name="checkboxopt" id="checkboxopt2" value="true" type="checkbox"> 
 
    </div> 
 
</div>

+0

あなたのイベントオブジェクトのアプローチは非常に魅力的ですね、私はいくつかのテストと修正を行います。あなたの例とこれに対する考えに感謝します。 – Beaniie

1

さてあなたは、それぞれのチェックボックスに繰り返すことができているものです。

乾杯

+0

このようなループで変数を作成して使用すると、可変ホイストのために最後の要素だけがイベントバインディングを取得するため、予期しない動作が発生する可能性が高くなります。 –

+2

@ErikSvedin:その変数がイベントハンドラ内で使用されている場合のみです。彼の答えは、要素を記録するために 'this'を使うので、それをしません。これは質問に表示される出力を与えるものではありませんが、他のいずれも行いません。ここの変数は、ほんの不必要なものです。 –

+0

変数のチェックボックスはうまくいき、単なるオブジェクトポインタであり、そうではありませんが、読んだ人のために読みやすく、パフォーマンスには影響しません。ガベージコレクタが別のオブジェクトへのポインタであるためです。さらに、コードを繰り返さないように頼まれていますが、これは質問の例のようにコードを繰り返すことはありません。 –

0

あなたはforループを使用し、ループの外で関数を作成することができます。

それともES6であなたがletの代わりに作成されますi新しいループの各反復におけるように、ブロックスコープを持つvar使用することができます

var c = document.querySelectorAll('input[type="checkbox"]'); 
 
for (let i = 0; i < c.length; i++) { 
 
    clickFunction(i) 
 
} 
 

 
function clickFunction(num) { 
 
    c[num].addEventListener('click', function() { 
 
    console.log('Opt ' + (num + 1)); 
 
    }) 
 
}
<div id=""><input name="checkboxopt" id="checkboxopt" value="true" type="checkbox"><br/></div> 
 
<div id=""><input name="checkboxopt" id="checkboxopt1" value="true" type="checkbox"><br/></div> 
 
<div id=""><input name="checkboxopt" id="checkboxopt2" value="true" type="checkbox"><br/></div>

var c = document.querySelectorAll('input[type="checkbox"]'); 
 
for (let i = 0; i < c.length; i++) { 
 
    c[i].addEventListener('click', function() { 
 
    console.log('Opt ' + (i + 1)); 
 
    }) 
 
}
<div id=""><input name="checkboxopt" id="checkboxopt" value="true" type="checkbox"><br/></div> 
 
<div id=""><input name="checkboxopt" id="checkboxopt1" value="true" type="checkbox"><br/></div> 
 
<div id=""><input name="checkboxopt" id="checkboxopt2" value="true" type="checkbox"><br/></div>

関連する問題