我在尝试注册和触发jQuery中的事件时遇到了一个奇怪的问题。我的示例代码存根是这样的:在jQuery触发器上调用不正确的处理程序
events = {"changeMode": ["mode1"], "changeKeymap": ["keymap1"]}
for(var event in events) {
var listeners = events[event];
for (i=0; i<listeners.length; i++)
{
var listn = listeners[i]
console.log("Activate listener", listn, " For event: ", event);
$("#testing").on(event, function(e, d) {
console.log("Event: ", event);
console.log("Listener invoked is: ", listn);
console.log("Event which is passed is: ", e);
console.log("Data is: ", d);
});
}
}
$("#testing").trigger("changeMode", "random data");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="testing"></div>
正如你所看到的,而我试图调用“changeMode”,即实际上得到调用是“changeKeymap”监听器。实际上,调用的监听器是最后一个被定义的监听器,所以我假设它以某种方式覆盖了其他监听器。 (我实际上有更大的代码,但基本上这就是我遇到的错误归结为什么)任何人都可以提出发生了什么事。
这里的jsfiddle:https://jsfiddle.net/7xyyggz8/
编辑:
事件发射是正确的乔尔的建议。然而,响应这个调用的监听器在某种程度上是不正确的。
编辑2:
更新小提琴和代码,使用瓦尔..仍然遇到了同样的问题
您有一个'
'元素并且正在重复循环该单个元素。这就是之前听众被覆盖的原因。 – grgdne@grgdne:他们不会被覆盖,他们堆叠。 –
@JoelEtherton thx! – grgdne