2011-01-06 7 views
6

가능한 중복 제거 :
Removing an anonymous event listener자바 스크립트 : 익명 이벤트 리스너에게

나는 이벤트 리스너 추가하려면 다음 크로스 브라우저 기능이 : 나는 '

_SU3.addEventListener = function(elem, eventName, fn) { 
if(elem.addEventListener) { 
    elem.addEventListener(eventName, fn, false); 
    } else if (elem.attachEvent) { 
     elem.attachEvent('on'+eventName, fn); 
    } 
}; 

을 리스너를 다음과 같이 추가 :

_SU3.addEventListener(_show, "click", function(event) { 
          _SU3.getChildren(_show, uri, element); 
        }); 

모두 괜찮습니다. 그러나 일단 청취 한 후에 청취자를 제거하고 싶습니다. 예를 들면 다음과 같습니다.

_SU3.getChildren = function(_show, url, element) { 

... blah... 

_SU3.removeEventListener(_show, 'click', ANON_FUNCTION); 

}; 

물론 수신기 기능은 익명이므로 참조 할 함수 이름이 없습니다.

어떻게 청취자를 제거 할 수 있습니까?

감사합니다.

+0

어딘가에 참고 문헌을 보관해야합니다. 명시 적으로 함수에 대한 참조를 전달하거나 함수에 내재적으로 전달하십시오. –

답변

8

당신은 함수에 대한 참조를 유지해야합니다

var foo = function(event) { _SU3.getChildren(_show, uri, element); }; 

_SU3.addEventListener(_show, "click", foo); 

...

_SU3.getChildren = function(_show, url, element) { 

... blah... 

_SU3.removeEventListener(_show, 'click', foo); 

}; 

변수 foo 당신이 이벤트 리스너를 제거 곳의 범위에 있는지 확인하십시오.

addOneShotListener = function(elem, eventName, fn) { 
    var triggered = false, handler = function(ev) { 
    if (triggered) return; 
    fn(ev); 
    triggered = true; 
    }; 

    if(elem.addEventListener) { 
    elem.addEventListener(eventName, handler, false); 
    } else if (elem.attachEvent) { 
    elem.attachEvent('on'+eventName, handler); 
    } 
}; 

원래의 기능에 대한 그 변화가 바로 전달 된 원래의 핸들러 (이하 "FN"랩 : 그것은 호출되어 있는지 여부를 추적하는

+0

감사합니다. 하지만이 리스너는 페이지의 많은 요소에 추가되므로 전역 변수를 사용할 수 없습니다. 다른 요소에서 리스너가 호출되면이 리스너가 덮어 쓰여집니다. –

+0

@ 리차드 : 글로벌이되어야한다고 말하지는 않았지만 범위에 있어야한다고 말했습니다. – Matt

4

수 없습니다. 제거하려는 경우 참조를 저장해야합니다. 다른 사람과 어떻게 구별 할 수 있습니까?

+1

엘리먼트에 첨부 된 모든 클릭 리스너를 지우는 것이 아주 행복합니다. –

+2

아니요, 그런 기능이 없습니다. –

3

대신 는 배열, 이벤트 리스너를 제거) 처음 호출 될 때만 처리기를 호출하는 함수를 사용합니다. 그런 다음 플래그를 설정하고 원래 핸들러 함수를 다시 호출하지 않습니다.

+0

재미있는 제안입니다. 감사합니다. –

0

한 번에 하나의 클릭 이벤트 만 요소에 할당하면 왜 onclick 속성을 설정하지 않습니까? element.onclick = ''을 사용하여 언제든지 제거 할 수 있습니다.

+0

페이지가 동적으로 만들어 졌기 때문에 일부 브라우저에서는 node.setAttribute ('onclick', 'function')가 작동하지 않습니다. –

+0

그는 속성이 아니라 속성이라고 말했습니다. – Neil

+0

object.onclick = function (e) {// etc}; –