IE8에서 작동하지 않는 addEventListener


118

동적으로 확인란을 만들었습니다. 내가 사용하고 addEventListener구글 크롬과 파이어 폭스에서 작동하지만 체크 박스의 클릭에 함수를 호출하는 인터넷 익스플로러 8에서 작동하지 않습니다 . 이것은 내 코드입니다.

var _checkbox = document.createElement("input");
_checkbox.addEventListener("click", setCheckedValues, false);

setCheckedValues 내 이벤트 핸들러입니다.

답변:


215

시험:

if (_checkbox.addEventListener) {
    _checkbox.addEventListener("click", setCheckedValues, false);
}
else {
    _checkbox.attachEvent("onclick", setCheckedValues);
}

업데이트 :: IE9 이전의 Internet Explorer 버전의 경우, attachEvent 메소드를 사용하여 지정된 리스너를 호출 된 EventTarget 에 등록 해야하며 다른 경우에는 addEventListener를 사용해야합니다.


1
이것이 왜 사용되어야하는지에 대한 설명은 답을 개선 할 것입니다.
dkris 2015 년

해명과 같은 간단한 설명을 추가 @dkris, 나는 조금 더 명확한 것을 만드는 희망 ... :)
수 디르 Bastakoti

44

attachEventIE9 이전의 IE 버전에서 사용해야 합니다. addEventListener정의 여부를 감지 하고 attachEvent그렇지 않은 경우 사용 :

if(_checkbox.addEventListener)
    _checkbox.addEventListener("click",setCheckedValues,false);
else
    _checkbox.attachEvent("onclick",setCheckedValues);
//                         ^^ -- onclick, not click

참고 IE11이 제거됩니다attachEvent .

또한보십시오:


13

이것은 또한 간단한 크로스 브라우저 솔루션입니다.

var addEvent =  window.attachEvent||window.addEventListener;
var event = window.attachEvent ? 'onclick' : 'click';
addEvent(event, function(){
    alert('Hello!')
});

물론 '클릭'대신 모든 이벤트가 될 수 있습니다.


+1, 이것은 현명한 해결 방법이라고 생각합니다! addEventListener의 세 번째 인수는 어쨌든 선택 사항이므로 이것은 좋은 해결책이 될 수 있으며 if-else 분기보다 더 좋습니다. 그러나이 경우 _checkbox, 대상 요소하지 않습니다 window. :) 따라서 이벤트 대상이 다른 인수 인 함수를 만들 수 있습니다.
Sk8erPeter

아, 너무 일찍 upvoted ... :) 이벤트 대상 요소의 호출 에 별칭을 지정하려고하면 Chrome에서 "TypeError : Illegal invocation"addEventListener 이 발생 합니다. 이 항목을 참조하십시오. stackoverflow.com/questions/1007340/… . 따라서 window개체의 경우 올바르게 작동하지만 문서 내의 다른 노드에서는 작동하지 않습니다. 이렇게하면 제안 된 별칭이 원래 질문에 언급 된 경우에 맞지 않습니다! 해결 방법은 무엇입니까?
Sk8erPeter

3

IE는 addEventListener버전 9까지 지원하지 않으므로을 사용해야 attachEvent합니다. 예는 다음과 같습니다.

if (!someElement.addEventListener) {
    _checkbox.attachEvent("onclick", setCheckedValues);
}
else {
    _checkbox.addEventListener("click", setCheckedValues, false);
}

2

이벤트 처리를 다른 요소 (예 : 테이블)에 위임하면 더 쉬울 수도 있고 성능도 더 좋습니다.

$('idOfYourTable').on("click", "input:checkbox", function(){

});

이렇게하면 이벤트 핸들러가 하나만 생기고 새로 추가 된 요소에서도 작동합니다. 이것은 jQuery> = 1.7이 필요합니다.

그렇지 않으면 delegate () 사용

$('idOfYourTable').delegate("input:checkbox", "click", function(){

});

2

아래 addEvent () 함수를 사용하여 대부분의 이벤트를 추가 if (el.attachEvent)할 수 있지만 XMLHttpRequest의 경우 IE8에서 실패 합니다. 지원하지 않으므로 대신 XMLHttpRequest.attachEvent()사용해야 XMLHttpRequest.onload = function() {}합니다.

function addEvent(el, e, f) {
    if (el.attachEvent) {
        return el.attachEvent('on'+e, f);
    }
    else {
        return el.addEventListener(e, f, false);
    }
}

var ajax = new XMLHttpRequest();
ajax.onload = function(e) {
}

2

위의 답변을 기반으로 빠른 Polyfill을 선택했습니다.

//# Polyfill
window.addEventListener = window.addEventListener || function (e, f) { window.attachEvent('on' + e, f); };

//# Standard usage
window.addEventListener("message", function(){ /*...*/ }, false);

물론 위의 답변과 같이 문제가 window.attachEvent될 수도 있고 아닐 수도 있는 존재를 보장하지 않습니다 .


0

jQuery를 사용하는 경우 다음과 같이 작성할 수 있습니다.

$( _checkbox ).click( function( e ){ /*process event here*/ } )

0
if (document.addEventListener) {
    document.addEventListener("click", attachEvent, false);
}
else {
    document.attachEvent("onclick", attachEvent);
}
function attachEvent(ev) {
    var target = ev.target || ev.srcElement;
    // custom code
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.