2011-04-14 129 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. '); 

回答

92

你不能。您必须使用命名函数或以某种方式存储参考。

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

DEMO

+0

你能解释一下结构化的方式是什么?我的英语技能不足以理解......谢谢。 – Japboy 2011-04-14 08:10:59

+1

@Japboy:请参阅我的更新。 – 2011-04-14 08:24:02

+0

感谢您的更新。这将有所帮助! – Japboy 2011-04-14 08:41:07

8

你不能,你需要一个参考功能:

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

你怎么传递事件对象? – slier 2014-03-16 02:11:03

+0

@slier'var fn = function(event){document.write(param); };' – cychoi 2014-10-31 11:19:12

2

你也可以做到这一点像:

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

是否有可能确定哪些事件已被绑定在对象上? – frumbert 2017-11-07 05:36:52

+0

你可以在函数中添加一些属性,比如类型,范围等等 'const disposerFn =()=> {scope.removeEventListener(type,handler,capture); }' 'disposerFn.type = type;' 'return disposerFn;'' – 2017-11-13 13:25:32

相关问题