자바 스크립트 : 이벤트 리스너 제거


136

리스너 정의 내에서 이벤트 리스너를 제거하려고합니다.

canvas.addEventListener('click', function(event) {
    click++;
    if(click == 50) {
        // remove this event listener here!
    }
// More code here ...

내가 어떻게 할 수 있습니까? 이 = 이벤트 ... 감사합니다.


8
사소하지만 미래의 참고 문헌 if(click == 50) {if( click === 50 )또는 if( click >= 50 )- 참조 해야합니다 . 출력을 변경하지 않지만 온전한 이유로 이러한 검사가 더 합리적입니다.
rlemon

좋은 질문입니다 ... 콘텐츠에 액세스 할 수없는 경우 어떻게 제거합니까? 다른 사이트에 greasemonkey를 사용하여 onclick 버튼의 팝업을 제거하고 싶지만 이름으로 기능을 참조 할 수 없으면 제거 방법을 찾지 못하는 것 같습니다.
JasonXA 2016 년

답변:


122

명명 된 함수를 사용해야합니다.

또한 click변수는 증분 처리기 외부에 있어야합니다.

var click_count = 0;

function myClick(event) {
    click_count++;
    if(click_count == 50) {
       // to remove
       canvas.removeEventListener('click', myClick);
    }
}

// to add
canvas.addEventListener('click', myClick);

편집 : 다음click_counter 과 같이 변수 주위를 닫을 수 있습니다 .

var myClick = (function( click_count ) {
    var handler = function(event) {
        click_count++;
        if(click_count == 50) {
           // to remove
           canvas.removeEventListener('click', handler);
        }
    };
    return handler;
})( 0 );

// to add
canvas.addEventListener('click', myClick);

이 방법으로 여러 요소에서 카운터를 증가시킬 수 있습니다.


그것을 원하지 않고 각 카운터에 자체 카운터를 갖기를 원하면 다음과 같이하십시오.

var myClick = function( click_count ) {
    var handler = function(event) {
        click_count++;
        if(click_count == 50) {
           // to remove
           canvas.removeEventListener('click', handler);
        }
    };
    return handler;
};

// to add
canvas.addEventListener('click', myClick( 0 ));

편집 : 지난 두 버전에서 반환되는 핸들러의 이름을 잊어 버렸습니다. 결정된.


14
+1-이것을 바이올린으로 만들었고 작동하지 않았습니다. 그러나 그것은 50 번 클릭해야했기 때문입니다. :) 나는 바보입니다. 여기에 간단한 예 : jsfiddle.net/karim79/aZNqA
karim79

4
@ karim79 : 나는 전에 그런 짓을 한 적이 없다고 말할 수 있기를 바랍니다. : o) jsFiddle에 감사드립니다.
user113716

+1 세 번째 옵션이 저에게 효과적이었습니다. 유효성 검사를 지우려면 키 필드를 입력 필드에 지정하십시오. 좋은 하나의 감사
Gurnard

여기에서 공감, 세 번째 옵션은 JS 바인딩 / 바인딩 이해의 중요한 부분입니다
SW4

것이 myClick = function(event){...}너무라는 이름의 함수를 고려?
Daniel Möller

80
   canvas.addEventListener('click', function(event) {
      click++;
      if(click == 50) {
          this.removeEventListener('click',arguments.callee,false);
      }

해야합니다.


14
이것은 멋지다! arguments.callee이해 관계자 를 위한 문서 : developer.mozilla.org/en/JavaScript/Reference/…
Ender

고마워, 이것은 많은 도움이되었습니다.
John O

2
불행히도 MDN 링크의 ECMAScript 5 (2009) 이상에서는 작동하지 않습니다. "ECMAScript (ES5)의 제 5 판은 arguments.callee()엄격 모드에서의 사용을 금지 합니다. arguments.callee()함수 표현식에 이름을 지정하거나 함수 선언을 사용 하여 사용하지 마십시오. "함수 자체를 호출해야합니다." (이 callee()대신 사용하고 있지만 callee여전히 제거됩니다. boo!)
Dai

59

다음과 같이 명명 된 함수 표현식 (이 경우 함수의 이름은 abc)을 사용할 수 있습니다.

let click = 0;
canvas.addEventListener('click', function abc(event) {
    click++;
    if (click >= 50) {
        // remove event listener function `abc`
        canvas.removeEventListener('click', abc);
    }
    // More code here ...
}

빠르고 더러운 작동 예 : http://jsfiddle.net/8qvdmLz5/2/ .

라는 이름의 함수 표현식에 대한 자세한 정보 : http://kangax.github.io/nfe/ .


영리한. NFE가 유용한 드문 경우 중 하나입니다. 감사.
DanMan

7
element.querySelector('.addDoor').onEvent('click', function (e) { });
element.querySelector('.addDoor').removeListeners();


HTMLElement.prototype.onEvent = function (eventType, callBack, useCapture) {
this.addEventListener(eventType, callBack, useCapture);
if (!this.myListeners) {
    this.myListeners = [];
};
this.myListeners.push({ eType: eventType, callBack: callBack });
return this;
};


HTMLElement.prototype.removeListeners = function () {
if (this.myListeners) {
    for (var i = 0; i < this.myListeners.length; i++) {
        this.removeEventListener(this.myListeners[i].eType, this.myListeners[i].callBack);
    };
   delete this.myListeners;
};
};

6

@Cybernate의 솔루션이 작동하지 않으면 트리거를 자체 기능으로 분리하여 참조 할 수 있도록하십시오.

clickHandler = function(event){
  if (click++ == 49)
    canvas.removeEventListener('click',clickHandler);
}
canvas.addEventListener('click',clickHandler);

4

누군가 jquery를 사용하면 다음과 같이 할 수 있습니다.

var click_count = 0;
$( "canvas" ).bind( "click", function( event ) {
    //do whatever you want
    click_count++;
    if ( click_count == 50 ) {
        //remove the event
        $( this ).unbind( event );
    }
});

그것이 누군가를 도울 수 있기를 바랍니다. @ user113716의 답변은 훌륭하게 작동합니다. :)


2

핸들러 함수를 미리 정의해야 할 수도 있습니다.

var myHandler = function(event) {
    click++; 
    if(click == 50) { 
        this.removeEventListener('click', myHandler);
    } 
}
canvas.addEventListener('click', myHandler);

이를 통해 처리기 자체에서 이름으로 핸들러를 제거 할 수 있습니다.


-4

이것을 시도하십시오, 그것은 나를 위해 일했습니다.

<button id="btn">Click</button>
<script>
 console.log(btn)
 let f;
 btn.addEventListener('click', f=function(event) {
 console.log('Click')
 console.log(f)
 this.removeEventListener('click',f)
 console.log('Event removed')
})  
</script>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.