How do I add and remove an event listener using a function with parameters?

45,478

Solution 1

Have you tried maintaining a reference to the anonymous function (like you suggested)?

So:

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

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

Mozilla's docs suggest the same thing.

Solution 2

var listener;

listener = function(){

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

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

};

window.addEventListener('click', listener ,false);
Share:
45,478
Bungle
Author by

Bungle

Front-End Developer. #SOreadytohelp

Updated on July 16, 2022

Comments

  • Bungle
    Bungle almost 2 years

    Sorry if this is a common question, but I couldn't find any answers that seemed pertinent through searching.

    If I attach an event listener like this:

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

    it doesn't seem to work to try to remove it later, like this:

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

    I assume this is because the addEventListener and removeEventListener methods want a reference to the same function, while I've provided them with anonymous functions, which, while identical in code, are not literally the same.

    How can I change my code to get the call to removeEventListener to work? The "box" argument refers to the name of an <iframe> that I'm tracking on the screen; that is, I want to be able to subscribe to the scroll event once for each <iframe> that I have (the quantity varies), and once the check_pos() function measures a certain position, it will call another function and also remove the event listener to free up system resources.

    My hunch is that the solution will involve a closure and/or naming the anonymous function, but I'm not sure exactly what that looks like, and would appreciate a concrete example.

    Hope that makes sense.

  • Bungle
    Bungle almost 14 years
    Thanks, Vivin - correct me if I'm wrong, but I don't think this would allow me to set up multiple event listeners with different values for "box," which is what I need to do. The argument "box" isn't a global variable. For example, just using literal values, I might call window.addEventListener('scroll', function() { do_something('string1'); }, false); and later window.removeEventListener('scroll', function() { do_something('string1'); }, false); and later window.addEventListener('scroll', function() { do_something('string2'); }, false);, etc.
  • Vivin Paliath
    Vivin Paliath almost 14 years
    There is a way to add multiple event listeners by using closures (See stackoverflow.com/questions/2276961/…). However I'd suggest using jQuery if you want to do some serious event-handling. It makes it much easier.
  • Ambuj Khanna
    Ambuj Khanna about 6 years
    If remove it by using < window.removeEventListener('scroll', listener, false); > and check again by using < "listener" in window" > so it is still giving me back "true". Any help?