2011-04-14 11 views
67
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. '); 

Respuesta

92

No puede. Tienes que usar una función nombrada o almacenar la referencia de alguna manera.

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

Lo mejor sería hacer esto de una manera estructurada, de manera que pueda identificar diferentes manipuladores y eliminarlos. En el ejemplo anterior, obviamente solo puedes eliminar el último controlador.

Actualización:

Usted puede crear su propio controlador de controlador (:)):

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

Entonces se puede usar con:

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

var handler = doSomethingWith('Test. '); 

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

DEMO

+0

Podría explicar cuál es la forma estructurada es? Mi habilidad en inglés no es lo suficientemente buena como para entender eso ... Gracias. – Japboy

+1

@Japboy: Por favor, mira mi actualización. –

+0

Gracias por su actualización. Esto sería útil! – Japboy

8

No puedes, necesitas una referencia a la función:

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. '); 
+0

¿cómo se pasa objeto de evento? – slier

+0

@slier 'var fn = function (event) {document.write (param); }; ' – cychoi

2

También podría hacerlo así:

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

Entonces se puede quitar el detector de eventos como éste:

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

// Remove event listener 
disposer(); 
+0

¿Es posible determinar qué eventos se han vinculado al objeto de esta manera? – frumbert

+0

Puede agregar algunas propiedades a la función, como el tipo, alcance, etc. 'const disposerFn =() => {scope.removeEventListener (type, handler, capture); } ' ' disposerFn.type = tipo; ' ' return disposerFn; ' –

Cuestiones relacionadas