JavaScript: remove event listener

I'm trying to remove an event listener inside of a listener definition:

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

How could I do that? this = event...

2

9 Answers

You need to use named functions.

Also, the click variable needs to be outside the handler to increment.

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);

EDIT: You could close around the click_counter variable like this:

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);

This way you can increment the counter across several elements.


If you don't want that, and want each one to have its own counter, then do this:

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 ));

EDIT: I had forgotten to name the handler being returned in the last two versions. Fixed.

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

Should do it.

2

You could use a named function expression (in this case the function is named abc), like so:

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 ...
}

Quick and dirty working example: .

More information about named function expressions: .

0

If @Cybernate's solution doesn't work, try breaking the trigger off in to it's own function so you can reference it.

clickHandler = function(event){ if (click++ == 49) canvas.removeEventListener('click',clickHandler);
}
canvas.addEventListener('click',clickHandler);
0
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;
};
};
0

I think you may need to define the handler function ahead of time, like so:

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

This will allow you to remove the handler by name from within itself.

0

If someone uses jquery, he can do it like this :

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 ); }
});

Hope that it can help someone. Note that the answer given by @user113716 work nicely :)

I ended up creating a helper function for that:

function addDisposableEventListener({ target, eventType, eventHandler }) { target.addEventListener(eventType, eventHandler) return { dispose: () => target.removeEventListener(eventType, eventHandler) }
}

Usage Examples:

const button = document.querySelector('#button')
const buttonClickListener = addDisposableEventListener({ target: button, eventType: 'click', eventHandler: event => { event.preventDefault() // ... code to handle the event buttonClickListener.dispose() // listener can be disposed here }
})
// ... more code
buttonClickListener.dispose() // listener can be disposed here

Try this, it worked for me.

<button>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>
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like