26

죄송합니다. 일반적인 질문이지만 검색을 통해 적절하다고 판단되는 답변을 찾을 수 없습니다. 다음과 같이 나중에 제거하려고 작동하지 않는 것매개 변수가있는 함수를 사용하여 이벤트 수신기를 추가 및 제거하려면 어떻게합니까?

window.addEventListener('scroll', function() { check_pos(box); }, false); 

: :이 같은 이벤트 리스너를 연결하는 경우

window.removeEventListener('scroll', function() { check_pos(box); }, false); 

나는 이것이 때문에 가정 addEventListenerremoveEventListener 메서드는 동일한 함수에 대한 참조를 원하지만 익명 함수는 제공하지만 코드에서는 동일하지만 문자 그대로는 동일하지 않습니다.

removeEventListener으로 전화를 걸려면 코드를 어떻게 변경하면 되나요? "상자"인수는 화면에서 추적중인 의 이름을 나타냅니다. 즉, 내가 가지고있는 각각에 대해 scroll 이벤트를 한 번 구독 할 수 있고 (수량이 다양 함) check_pos() 함수가 특정 위치를 측정하면 다른 기능을 호출하고 이벤트 리스너를 제거하여 무료로 제공합니다. up 시스템 자원.

솔직히 말해서 해결 방법은 익명의 함수를 클로저 및/또는 명명하는 것이지만 정확히 어떻게 생겼는지 확실하지 않으며 구체적인 예를 이해할 수 있습니다.

희망이 있습니다. 어떤 도움을 주셔서 감사합니다!

답변

14

당신이 제안한 것처럼 익명 함수에 대한 참조를 유지하려고 했습니까?

그래서 :

var listener = function() { 
    check_pos(box); 
}; 

window.addEventListener('scroll', listener, false); 
... 
window.removeEventListener('scroll', listener, false); 

모질라의 문서 suggest 같은 일.

+0

내가 틀렸다면 정정 해주세요.하지만이 방법을 사용하면 "상자"에 대해 다른 값으로 여러 이벤트 수신기를 설정할 수 없다고 생각합니다. 인수 "box"는 전역 변수가 아닙니다. 예를 들어 리터럴 값만 사용하면 window.addEventListener ('scroll', function() {do_something ('string1');}, false)), 등등. – Bungle

+0

거기에 a()가 있습니다.) do {something} ('string1'); 클로저를 사용하여 여러 이벤트 리스너를 추가하는 방법 (http://stackoverflow.com/questions/2276961/is-there-for-window-onload-in-javascript/2277000#2277000 참조) 그러나 심각한 이벤트 처리를 원할 경우 jQuery를 사용하는 것이 좋습니다. 그것은 훨씬 쉽게. –

3
var listener; 

listener = function(){ 

if(window.target != anotherEvent.target) 
{ 
    ...CODE where 

    window.removeEventListener('click', listener , false); 

}; 

window.addEventListener('click', listener ,false); 
관련 문제