删除 DOM 事件观察器
Removing DOM Event Observer
我正在使用一些遗留代码(不祥的音乐)的基于 javascript 的系统,这个遗留代码添加了这样的事件侦听器
foo.addEventListener("click",function(){
//do some stuff
});
有没有办法以编程方式删除像这样添加的事件侦听器? 我知道 removeEventListener,但从文档中不清楚如何(如果有的话)删除程序员通过匿名函数添加的侦听器。
据
我所知,如果你想调用removeEventListener
,你不能使用匿名函数,因为你需要引用你与addEventListener
一起使用的相同函数,唯一的方法是为函数命名(例如,不是匿名的)。
类似的问题和结论在这里:在JavaScript中的匿名函数上删除EventListener
在不更改代码结构的情况下,您可以为其命名,然后稍后使用该名称。
foo.addEventListener("click", function fooClickHandler(){
//do some stuff
});
// then later
foo.removeEventListener("click", fooClickHandler);
您可以通过传入创建它的处理程序来删除它们,就像添加它们一样。 不过,此时处理程序不再是匿名函数:
var handler = function() {
// do some stuff
};
foo.addEventListener("click", handler);
foo.removeEventListener("click", handler);
你可以做一些像这样时髦的事情来删除带有匿名函数的处理程序,虽然我不推荐它,但这是可能的,你不能在严格模式下访问callee
:
document.addEventListener('click', function(e) {
console.log('click');
if(e.unbind) {
document.removeEventListener('click', arguments.callee);
}
});
var event;
// First actual real event
event = new Event('click');
document.dispatchEvent(event);
// Unbinding event
event = new Event('click');
event.unbind = true;
document.dispatchEvent(event);
// Should not fire
event = new Event('click');
document.dispatchEvent(event);
如果你想在
添加自己的事件侦听器之前摆脱所有的事件监听器,你可以使用clonenode并删除original。该副本不会复制事件侦听器。
var fee = foo.cloneNode();
foo.parentNode.replaceChild(fee, foo);
应该看起来相同,但没有事件侦听器。
这里有一个小提琴证明了我的观点:http://jsfiddle.net/U7w7M/1/
请注意格式如何保持,位置相同,但单击操作在第一次单击后被删除
相关文章:
- 设置多个观察程序以触发动态事件的角度替代解决方案 - 优化的观察者模式
- 我们可以对可观察流使用高通滤波器来检测抖动事件吗
- knockoutjs上的绑定按键事件,可观察到未填充
- 观察其他场模糊事件
- DOM突变观察器是否比DOM突变事件慢
- 一个控制器如何在 Ember .js 中观察任意控制器/模型上的事件
- 剑道可观察在触发更改事件后不更新
- 删除 DOM 事件观察器
- KnockoutJS observable不观察jQuery的empty()事件
- 停止后观察事件观察
- 如何获取使用 .fromEvent 创建的可观察的事件名称
- 未在 Angular2 模板中呈现的可观察事件
- 观察聚合物上的“结束”媒体事件
- 在观察@each时,知道哪个项目触发了事件
- 使用ARI观察桥梁相关事件
- 角度观察程序和事件侦听程序的执行顺序
- 浏览器中的观察者模式javascript:订阅事件"添加了Dom元素“;并处理这个元素
- 观察事件'Window Onload'在刷新的DIV元素内
- DOM突变观察者:如何支持DOM3突变事件的一个重要用途
- Javascript:同步可观察事件