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. ');
67
A
回答
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);
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. ');
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
相关问题
- 1. removeEventListener匿名函数的javaScript
- 2. removeEventListener for AS3中的匿名函数
- 3. removeEventListener与唯一匿名函数
- 4. 需要参数的addEventListener(和removeEventListener)函数
- 5. AddEventListener对匿名函数的动态函数引用
- 6. JavaScript:如何将匿名函数作为函数参数传递?
- 7. 通过匿名函数作为参数
- 8. 匿名函数使用#()
- 9. 如何将匿名函数提取为命名函数?
- 10. 如何执行作为参数传递的JQuery匿名函数?
- 11. addEventListener匿名函数中的Javascript变量范围
- 12. EventListener正确地启动,除非用匿名函数包装,然后阻止RemoveEventListener
- 13. 如何在匿名函数上使用bind函数
- 14. 作为参数的匿名函数的作用域
- 15. 使用匿名函数作为JavaScript对象的一部分
- 16. 使用工厂方法作为替代通过匿名函数
- 17. javascript setTimeout()不等待,即使作为匿名函数调用后
- 18. 使用匿名函数作为财产的getter/setter
- 19. Linq - 如何收集匿名类型作为函数的结果
- 20. Golang函数包含匿名作用域
- 21. 在匿名函数中调用匿名函数(初始)
- 22. 将值作为函数参数传递给匿名函数
- 23. 如何将匿名函数转换为常规函数?
- 24. 调用匿名函数定义为PHP
- 25. 如何使用用C匿名函数的参数或C++
- 26. 作为函数参数传递的匿名函数的作用域
- 27. 使用自我调用匿名函数
- 28. 如何为此使用addEventListener?
- 29. 保存一个匿名函数(lambda)作为函数型变量
- 30. Javascript addEventListener和removeEventListener与部分功能
你能解释一下结构化的方式是什么?我的英语技能不足以理解......谢谢。 – Japboy 2011-04-14 08:10:59
@Japboy:请参阅我的更新。 – 2011-04-14 08:24:02
感谢您的更新。这将有所帮助! – Japboy 2011-04-14 08:41:07