2016-10-03 6 views
1

자바 스크립트 코드를 반복하지 않아도 각 체크 박스에 이벤트 리스너를 추가 할 수있는 명확하고 간결한 방법을 찾고 있습니다. 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

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>
이 경우에 당신이 그것을 작업을 개선하기 위해 찾고 있기 때문에 http://codereview.stackexchange.com에 속한 하나의 리스너 – pwolaq

+2

을 추가해야합니다, 자바 스크립트'이벤트 delegation'를 검색 암호. –

+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

이와 같이 루프에서 변수를 생성하고 사용하면 변수 hoisting으로 인해 마지막 요소 만 이벤트 바인딩을 얻으므로 예기치 않은 동작이 발생할 수 있습니다. –

+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>
.

관련 문제