2015-09-11 23 views
1

我在尝试注册和触发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:

更新小提琴和代码,使用瓦尔..仍然遇到了同样的问题

+0

您有一个'

'元素并且正在重复循环该单个元素。这就是之前听众被覆盖的原因。 – grgdne

+0

@grgdne:他们不会被覆盖,他们堆叠。 –

+0

@JoelEtherton thx! – grgdne

回答

1

如果你仔细观察,你会发现changeMode确实解雇。深入研究jQuery对象,你会看到它被识别出来。它看起来不像被解雇的原因是你使用外部变量来标识名字。

这条线:

console.log("Listener invoked is: ", listn); 

使用listn变量,其最后一个值是changeKeymap。如果您将功能更改为:

var eventName = listn; 
console.log("Listener invoked is: ", eventName); 

它应按照您的预期报告。

注意:实际jQuery事件向下钻取的屏幕粘贴。

enter image description here

+0

我在这个小提琴https://jsfiddle.net/7xyyggz8/上试过了你的建议,但显然仍然是changeKeyMap正在发射。您可以从开发者控制台中查看。你能再详细一点吗 – Vedanshu

+0

@Vedanshu:你用'event'变量犯了同样的错误。使用chrome,深入jQuery对象。我会尽快在我的答案中发布一个更新,从我的小提琴中看到。 –

+0

我需要在我的问题语言中减少混淆。我现在编辑它。我知道被触发的事件是changeMode,但是我的问题是为什么响应该事件而调用的侦听器不正确。 AFAIK我正在用正确的听众注册正确的事件。在我的实际代码中,散列不是字符串,而是函数对象,我在这里调用而不是做console.logs。这是否有帮助 – Vedanshu

相关问题