익명 함수로 addEventListener 인 EventListener를 제거하는 방법은 무엇입니까?


88
function doSomethingWith(param)
{
    document.body.addEventListener(
        'scroll',
        function()
        {
            document.write(param);
        },
        false
    ); // An event that I want to remove later
}
setTimeout(
    function()
    {
        document.body.removeEventListener('scroll', HANDLER ,false);
            // What HANDLER should I specify to remove the anonymous handler above?
    },
    3000
);
doSomethingWith('Test. ');

답변:


111

당신은 할 수 없습니다. 명명 된 함수를 사용하거나 어떻게 든 참조를 저장해야합니다.

var handler;

function doSomethingWith(param) {
    handler = function(){
        document.write(param);
    };  
    document.body.addEventListener('scroll', handler,false);
}
setTimeout(function() {
     document.body.removeEventListener('scroll', handler ,false);
}, 3000);

가장 좋은 방법은 다른 핸들러를 식별하고 제거 할 수 있도록 구조화 된 방식으로 수행하는 것입니다. 위의 예에서 분명히 마지막 핸들러 만 제거 할 수 있습니다.

최신 정보:

고유 한 핸들러 핸들러 (:))를 만들 수 있습니다.

var Handler = (function(){
    var i = 1,
        listeners = {};

    return {
        addListener: function(element, event, handler, capture) {
            element.addEventListener(event, handler, capture);
            listeners[i] = {element: element, 
                             event: event, 
                             handler: handler, 
                             capture: capture};
            return i++;
        },
        removeListener: function(id) {
            if(id in listeners) {
                var h = listeners[id];
                h.element.removeEventListener(h.event, h.handler, h.capture);
                delete listeners[id];
            }
        }
    };
}());

그런 다음 다음과 함께 사용할 수 있습니다.

function doSomethingWith(param) {
    return Handler.addListener(document.body, 'scroll', function() {
        document.write(param);
    }, false);
}

var handler = doSomethingWith('Test. ');

setTimeout(function() {
     Handler.removeListener(handler);
}, 3000);

데모


구조화 된 방식이 무엇인지 설명해 주시겠습니까? 제 영어 실력은 그걸 이해하기에 충분하지 않습니다 ... 감사합니다.
Japboy 2011

1
@Japboy : 천만에요 :) 약간의 실수를 발견하고 고쳤습니다.
Felix Kling 2011-04-14

addListener 및 removeListener를 래핑하는 이유는 무엇입니까?
쓸모없는

@useless : 자체 호출 기능을 의미합니까? 유지 i하고 listeners"비공개"합니다.
Felix Kling 2013 년

2
@Bergi : 완료. 내가 놓친 것이 있으면 알려주세요.
Felix Kling

11

할 수 없습니다. 함수에 대한 참조가 필요합니다.

function doSomethingWith(param) {
   var fn = function(){ document.write(param); };
   document.body.addEventListener('scroll', fn, false);
   setTimeout(function(){ document.body.removeEventListener('scroll', fn, false); }, 3000);
}
doSomethingWith('Test. ');

이벤트 객체를 어떻게 전달합니까?
slier 2014 년

@sliervar fn = function(event){ document.write(param); };
cychoi

5

다음과 같이 할 수도 있습니다.

const ownAddEventListener = (scope, type, handler, capture) => {
  scope.addEventListener(type, handler, capture);
  return () => {
    scope.removeEventListener(type, handler, capture);    
  }
}

그런 다음 다음과 같이 이벤트 리스너를 제거 할 수 있습니다.

// Add event listener
const disposer = ownAddEventListener(document.body, 'scroll', () => { 
  // do something
}, false);

// Remove event listener
disposer();

이와 같이 객체에 바인딩 된 이벤트를 확인할 수 있습니까?
frumbert

당신은 등 유형, 범위와 같은 기능에 몇 가지 속성을 추가 할 수 있습니다const disposerFn = () => { scope.removeEventListener(type, handler, capture); } disposerFn.type = type; return disposerFn;
사이먼 Jentsch

1

IE를 지원할 필요가 없다면 once 옵션을 사용할 수 있습니다.

[Element].addEventListener('click', () => {...}, {
  capture: false,
  once: true
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.