javascript - 删除具有带有另一个函数参数的回调函数的事件监听器

标签 javascript

我添加了一个事件监听器,如下所示:

 function position(key){
     canvas.addEventListener("mousemove", function(evt){
     var mousePos = getMousePos(canvas, evt);
     document.getElementById("demox["+key+"]").value =mousePos.x;
     document.getElementById("demoy["+key+"]").value =mousePos.y;
     }, true);
 }

我正在尝试删除此事件监听器,但我不能,因为我在事件监听器的回调函数中使用函数参数键,我尝试了此操作,但它不起作用:

 function myFunction(evt){
     var mousePos = getMousePos(canvas, evt);
     document.getElementById("demox["+key+"]").value =mousePos.x;
     document.getElementById("demoy["+key+"]").value =mousePos.y;
 }
 canvas.removeEventListener('mousemove', myFunction, true);

我应该如何删除“mousemove”事件监听器

最佳答案

您无法删除事件监听器的原因并不是因为 key 参数本身。这是因为 mousemove 事件处理程序是一个匿名函数。如果正在注册的函数是匿名的,则它永远无法从自身外部取消注册,因为它没有可供您引用的标识符。

您需要更改为使用命名函数声明,以便稍后可以正确引用该函数,并通过更高范围的变量使用 key 变量:

 var key = null;

 function position(val){
     key = val;
     canvas.addEventListener("mousemove", mouseHandler , true);
 }

 function mouseHandler (evt){
     var mousePos = getMousePos(canvas, evt);
     document.getElementById("demox[" + key + "]").value =mousePos.x;
     document.getElementById("demoy[" + key + "]").value =mousePos.y;
 }

关于javascript - 删除具有带有另一个函数参数的回调函数的事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43667568/

相关文章:

c# - ASP.NET javascript 未执行

javascript - 位掩码 (javascript) : how to check ALL flags

javascript - 将数据从 jQueryUI 对话框表单传递到 Controller

javascript - jQuery 是如何工作的 : I get "Cannot set property xxx of undefined" when trying a similar prototype thing?

javascript - 单击时切换 div 大小

javascript - 修复了在手机上向下滚动时显示的 div

javascript - 防止 HTML 形式的三星预测文本

Javascript:单击时更改图像,然后再次单击时返回原始图像

javascript - 在 Javascript 中调用自定义协议(protocol)

javascript - jQuery 函数中的 PHP 变量未正确传递