Javascript event.currentTarget问题

Javascript event.currentTarget问题,javascript,javascript-events,Javascript,Javascript Events,我正在调试javascript代码中的一个问题,变量设置不正确。经过一点研究,我发现变量没有被填充,因为它是从一个不存在的事件属性中获取它的值。在本例中,它从event.currentTarget派生其值,该值奇怪地为null 所以我现在有点困惑。我一直认为event.currentTarget总是指向触发事件的侦听器所包含的任何元素。那么在什么情况下event.currentTarget实际上是空的呢?好吧,我终于找到了答案 问题在于事件的处理方式。正如您在下面看到的,事件对象本身不仅要由其各

我正在调试javascript代码中的一个问题,变量设置不正确。经过一点研究,我发现变量没有被填充,因为它是从一个不存在的事件属性中获取它的值。在本例中,它从event.currentTarget派生其值,该值奇怪地为null


所以我现在有点困惑。我一直认为event.currentTarget总是指向触发事件的侦听器所包含的任何元素。那么在什么情况下event.currentTarget实际上是空的呢?

好吧,我终于找到了答案

问题在于事件的处理方式。正如您在下面看到的,事件对象本身不仅要由其各自的处理函数处理;它还将被另一个函数处理,该函数仅在处理程序中进行的AJAX调用成功返回时才被调用。但是,一旦成功函数在AJAX调用下执行,事件对象就会丢失一些上下文,即其currentTarget属性。我认为这是因为一旦浏览器开始在success函数中执行代码,我们就不直接在处理程序的范围内

$('#element').click(function(e) {

    // bunch of lines of code here

    $.ajax({
       type: 'POST',
       url: // url,
       ...,
       success: function(response) {

           // more lines of code here

           callAnotherFunction(e);
           // When we invoke the above function, we pass the event in as a 
           // parameter, but the event has already lost some of its context
           // due to scope change.
       }
    });

})

如果以编程方式触发事件或使用较旧的IE版本,则将是
未定义的
null
。下面是一个惊人的演示,演示如何以及何时设置所有这些事件属性:如果尚未设置,我建议使用类似jQuery的库进行事件处理,以避免在不同的浏览器设置不同的属性。@Felix Kling-我可以验证事件实际上是由用户触发的,而不是由代码触发的。我也在使用Firefox。@Joseph Silber-谢谢你的演示。我正在考虑使用event.originalTarget,但从我的印象中看,似乎event.currentTarget是确定侦听器属于哪个元素的事实上的方法。我宁愿坚持下去。我也注意到了同样的事情。我通过在使用
事件的函数完成之前不等待
调用AJAX来“修复”它,但这并不总是一个好的解决方案。我想知道为什么会发生这种情况,以防我将来遇到这种情况。对于记录而言,
event.currentTarget
在AJAX调用完成后立即为空,奇怪的是
event.target仍然使用与调用事件时相同的元素填充。我使用的是angular,所以可能是angular,在您的例子中,jQuery更改了事件?在异步操作后管理事件时也是如此。同样的问题,我尝试了各种技巧,但都没有成功-,-如果需要访问
currentTarget
,可以将其设置为Ajax调用之外的变量,并将其传递给事件本身之外的success方法。