javascript - 事件触发后removeEventListener

标签 javascript

我有一个脚本,可以向 div 添加单击事件以添加新元素。然后该函数创建并添加元素,然后甚至应该从 Div 中删除单击,以便无法添加更多元素。我明白为什么removeEventListener 不起作用,但我不知道如何修复它。以下是给我带来问题的代码行:

function enable_add(tag, type){return function(e){add_element(e, tag, type);};} //Function call for adding new elements  
document.getElementById("body_visual_editor").addEventListener("click", enable_add(tag, type));  
document.getElementById("body_visual_editor").removeEventListener("click", enable_add());  

Fire bug 表示 function(e) 被指定为事件,而不是enable_add,因此删除事件找不到正确的事件。我该如何编写这三行以便它们都能正常工作?
请不要使用 JavaScript 库。

更新:所以我通过像这样重写来解决了原始问题:

var handler;
function enable_add(tag, type) //Function call for adding new elements
{
    handler= function handler(e){add_element(e, tag, type);};
    return handler
}
document.getElementById("body_visual_editor").addEventListener("click", enable_add(tag, type));  
document.getElementById("body_visual_editor").removeEventListener("click", handler);   

但现在它在 add_element 调用上创建一个元素以设置处理程序,并在单击时创建一个元素。我该如何解决这个问题?

最佳答案

问题是这样的:

您已经获得了一个部分应用的函数,您将其直接传递到 addEventListener 中。

removeEventListener 仅适用于与传递给 addEventListener 的函数实例完全相同的函数实例。

function makeFunction () {
  return function () { };
}

var func1 = makeFunction();
var func2 = makeFunction();

func1 === func2; // false

因此,您的解决方案是将创建的函数缓存为引用,然后将其传递给 addEventListener,记住它,然后将其传递给removeEventListener。

var myHandler = makeFunction();
el.addEventListener("click", myHandler);
el.removeEventListener("click", myHandler);

...当然,您可能不打算立即删除它。 这意味着您需要发挥更多创意。

function handleEventOnce (evt, el, action) {
  function doSomething (e) {
    action(e);
    el.removeEventListener(evt, doSomething);
  }
  el.addEventListener(evt, doSomething);
}

handleEventOnce("click", button, somePartialFunction(a, b));

关于javascript - 事件触发后removeEventListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33294111/

相关文章:

javascript - 为什么<变成了<?

javascript - 如何基于一些 ruby​​ 条件添加 JavaScript?

javascript - Webpack/Babel es2015错误:未捕获语法错误:意外的 token 导入

javascript - 调整 Canvas 大小而不减少其宽度和高度(坐标)

javascript - emberJS : Is it possible to use helpers in Component/controller Javascript?

javascript - 如何在 PHP 中使用 Ajax 从网站(例如 IMDB )获取数据

javascript - 多个不可用日期的范围未在 react 日期范围选择器中正确显示

javascript - 我可以在我的扩展程序的 JavaScript 文件中访问我的 manifest.json 中的属性吗?

javascript - 允许用户在谷歌地图上放置标记

javascript - Chrome 扩展 : "Error handling response: TypeError: Cannot set property ' value' of null"