2011-08-27 6 views
15

에 불법 호출 내가 EventListener를 내려 놓고이 시도의 두 버전에 대한 Uncaught TypeError: Illegal invocation 수 :catch되지 않은 형식 오류 :하여 addEventListener

(나는 청취자가 추가해야 오류를, 나는 대상을 클릭하지 않는 경우)

addEventListener.apply(ronan, ["click", alert, false]);

ronanronan.addEventListener("click", alert, false); 난 그게 문제라고 생각하지 않도록 콘솔이 성공적으로 반환되는 div 요소입니다. 왜 내가이 오류가 발생합니다 어떤 아이디어? 나는 this 실을 읽었고 나는 그것을 알아 내지 못했습니다.

+0

어쩌면 내가 제출할 아침까지 기다려야했는지 여부 –

+1

'경고'일 수 있습니다 ... 네이티브 함수. 빈'function() {}'이 대신 작동합니까? – James

+0

@ J-P 아니, 그게 도움이되지 않았다 –

답변

29

alert을 하나의 함수로 묶어야합니다. 이것은 작동합니다 :

ronan.addEventListener("click", function() { alert('Hi'); }, false); 

여기 증거에 대한 fiddle입니다. alert을 단독으로 사용해도 리스너가 실행될 때 해당 함수 내의 this 값이 수신 대기중인 객체로 설정되기 때문에 작동하지 않습니다. 예를 들어, 청취자를 ronan에 설정하면 해당 청취자 내에서 this === ronan입니다. 이것은 alert에 문제가 있습니다. 그 이유는이 함수가 thiswindow과 같을 것이기 때문입니다. 당신은 다른 함수에서 함수를 감싸서하거나 this이 될 것으로 기대하고 무엇에 바인딩하여 (웃기려는 의도 없음)이 문제를 해결 할 수 있습니다

document.body.addEventListener('click', alert.bind(window), false); 

IE < 9 당신이 attachEvent를 사용할 필요가 잊지 마세요 addEventListener 대신.


당신이 window.addEventListener에 인수를 적용하려고 노력하고 있기 때문에 다른 인 HTMLElement.prototype.addEventListener 반대로 작동하지 않습니다 addEventListener

두 번째 시도로 apply/call 사용에 대한주의 사항 기능 모두 :

// This won't work 
addEventListener.apply(ronan, ["click", alert.bind(window), false]); 

// This will work 
HTMLElement.prototype.addEventListener.apply(ronan, ['click', alert.bind(window), false]); 
+1

아, 말씀이 맞습니다. 나는 실제로 프로토 타입 객체를 사용하지 않고 기본 객체 만 사용하고 있지만 프로토 타입 부품 없이도 여전히 작동합니다. 내 JS가 DOM에 너무 집중했기 때문에 아마 bind()를 알고 있었어야합니다. 시간 내 주셔서 감사합니다. –

관련 문제