【问题标题】:eventlistener function definition事件监听函数定义
【发布时间】:2019-09-15 03:29:56
【问题描述】:

我有以下代码来设置我的事件监听器(是的,我知道我应该使用委托)。函数处理程序通常是匿名的,但我后来命名了它以便我可以删除它,但问题就从这里开始了。代码如下:

for (var i=0;i<karten.length;i++) {
  setupeventlistener(karten[i]);
}

function setupeventlistener (obj){
obj.addEventListener("click",function handler(e){output(obj,e);});
}

现在,如果我想删除输出函数中的监听器(使用removeeventlistener("click",handler),我无法访问处理函数,因为它在setupeventlistener 范围内(这就是我猜的?),但如果我将它移动到全局范围并通过 var 定义它,它无法访问传递给输出的参数 obj(来自setuplistener)。

简而言之,我想删除监听器并保持我的所有功能原样,因为我的小任务除了无法删除监听器来完成项目之外还有效。

【问题讨论】:

  • 您应该能够将函数 handler() 移动到更高的范围。你能用access the handler arguments of output (obj) 说明你的意思吗?
  • 如果您无权访问原始绑定函数,则无法删除事件侦听器。
  • @shilly,是的,我可以将它移动到全局范围,但我不知道如何将传递给 setupeventlistener 的参数 (obj) 传递给我的处理程序。 (当我把他放到全球范围内时)。问题是函数处理程序不能被任何其他函数访问,除非我把它放到全局范围内,我对吗?
  • obj,将是单击的按钮/元素吗?如果是这样:e.target 也会给你点击的元素,你实际上不必将 obj 传递给处理程序。
  • 好吧,这很容易哈哈,谢谢 :D,不知道为什么我认为我必须将 obj 放在顶部,因为无论如何我在大多数东西上都使用 e.target。

标签: javascript function dom-events


【解决方案1】:

这会有帮助吗?

var list = {};

function set( obj, key )
{
    list[ key ] = Object.create(null);
    list[ key ].listener = function(e) { output( obj, e ) };
    list[ key ].target = obj;
    obj.addEventListener( 'click', list[ key ].listener );
}

function reset( key )
{
    list[ key ].target.removeEventListener('click', list[ key ].listener );
    delete list[ key ]
};

for (var i=0; i < karten.length; i++)
{
    set(karten[i], i );
}

【讨论】:

  • 我通过消除 obj 参数并按照 shilly 的建议使用 e.target 解决了这个问题,但我想如果我出于某些特定原因必须保留 obj 参数,你的答案就是我的想法。 (我现在无法测试代码,但它是有道理的,所以我认为它应该可以工作)
猜你喜欢
  • 2022-01-11
  • 2023-03-07
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多