通过eventlistener监听多个组件

时间:2015-01-04 18:42:59

标签: javascript events listener

我想知道你为什么不允许在一个节点上拥有多个类似的eventListener?我想象我有多个相同类型的部分使用单个节点通过CustomEvents相互通信的情况。但这似乎并没有起作用,因为它们都共享相同的EventListener,因此只有其中一个能够监听和处理事件。

为什么?

谢谢!

编辑:小代码片段:

我有

node.addEventListener("customEvent", this.func, false);

node.addEventListener("customEvent", this.func, false);

在两个不同的地方,this.func指向相同的功能,但在不同的上下文中,最终会触发不同的事情。但第二个听众永远不会被调用,因为出于某种原因,这个东西似乎假设他们的相同可能是因为签名是相似的或其他什么。

EDIT2:我基本上是指这个。 https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener#Multiple_identical_event_listeners

2 个答案:

答案 0 :(得分:0)

在Java中,您可以添加多个侦听器。但是,老实说,我不喜欢这种方法。在大多数情况下,您只需触发1个接口/对象(您正在为多个接口添加开销,逻辑,其中只使用一个接口)。

我更喜欢Android方法:setOn ....事件(看起来像JS就是这样)而不是Java的addActionListener(...)。

当您需要多个触发器时,您可以覆盖:

 obj.setOnEvent(function() {
    doTheOtherEventTrigger();
    doOneMoreEventTrigger();
    ...
 }

答案 1 :(得分:0)

您可以使用addEventListener将多个类似的事件处理程序附加到节点。

node.addEventListener("click", function(){alert(1)}, false);
node.addEventListener("click", function(){alert(2)}, false);

应该发出两次警报。 当您指定匿名函数时,这可以正常工作。

但是,您可以使用bind。

指定多个侦听器引用相同的函数和事件
var a = this.func.bind();
document.getElementById("start").addEventListener("click", a, false);   
var b = this.func.bind();
document.getElementById("start").addEventListener("click", b, false);   

这将提醒两次。由于函数包装器不同,因此它被视为一个唯一的事件。

您无法通过node.onclick两次分配事件处理程序,因为它是一个属性。当您分配两次时,它将覆盖第一个处理程序。发明事件听众是为了应对这种情况。