正在删除事件侦听器
Removing event listeners
我有一个画布元素,在其中我使用WebGL绘制一些东西
根据绘制的内容,我将添加一个事件侦听器。
现在,当我重新绘制画布时,我想删除旧的事件侦听器并添加一个新的侦听器。
简单地这样做是行不通的:
canvas.removeEventListener("click", function(event){
colorbarClicked(event, viewdata);
}, false);
canvas.addEventListener("click", function(event){
colorbarClicked(event, viewdata);
}, false);
我认为这是因为colorbarClicked函数已经更改(可能是因为它的参数有不同的值?),并且与我想删除的旧函数不匹配。
所以我的问题是,每次我重新绘制事件时,监听器都会被添加,因此会加倍。但是colorbarClicked函数取决于画布中绘制的内容,所以我肯定需要更改它。
您需要记住添加时使用的函数,并在删除时再次使用相同的函数:
// Somewhere *outside* the code doing the adding/removing (in containing code)
var listener = null;
// In the code adding/removing
if (listener) {
canvas.removeEventListener("click", listener, false);
}
listener = function(event){ colorbarClicked(event, viewdata); };
canvas.addEventListener("click", listener, false);
旁注:每次添加和删除处理程序似乎都很尴尬。通常,您只需要添加一次处理程序,并让它对您所做的任何更改做出响应。
您可以使用命名函数。举下面的例子:
function foo(){
alert("this comes only once");
this.removeEventListener('click', foo);
}
dude.addEventListener('click', foo);
<button id="dude">Click Me</button>
这里发生的是函数foo
是在全局范围中定义的。它有自己独特的身份。该函数的基本功能是创建一个警报,然后将自己从按钮的click
事件中删除。因此,当你点击它时,监听器会被删除,因此,你再也看不到它了
您的代码无法按预期工作,因为作为回调传递给addEventListener
的函数没有唯一标识,Javascript也不知道要删除什么。
这个方法还防止回调hell:)
相关文章:
- 如何在for循环中添加事件侦听器
- 未命中服务器发送的事件侦听器
- 如何覆盖原型中的事件侦听器
- 无法将事件侦听器附加到画布
- 如何在d3.js中自定义事件侦听器
- 在es6中,将带有回调的事件侦听器设置为可迭代的
- 事件侦听器未在chrome扩展中的options.js中启动
- IE8更改文本区域上的事件侦听器不工作
- 将事件侦听器添加到文档,而不是签入元素存在,然后添加事件侦听器
- javascript删除事件侦听器
- 我应该/如何清除mousemove JQuery事件侦听器
- 在JQuery中使用谷歌地图Api事件/侦听器
- 如何使用我的Jquery代码创建委托事件侦听器
- 'mousemove'画布中的事件侦听器-指针仅在最后一个矩形中更改
- 为什么此事件侦听器不工作
- 仅当类存在于Javascript中时才允许侦听器事件运行
- 不确定Google Maps的侦听器事件中值为何未定义
- 如何向控件添加侦听器事件
- 无法在地图单击侦听器事件上显示另一个地图
- Chrome运行时OnMessage侦听器事件未启动