2017-02-15 102 views
1

我遇到了调试某人代码的奇怪情况。下面的代码是该问题的演示。jQuery事件处理程序和未声明的事件对象

我的印象是当进入事件处理程序时,event应该是undefined。这就像在Firefox中,但在Chrome和IE11 event不是undefined,而是包含事件对象。我的猜测是闭包有效,但在Firefox中不起作用。

它应该使用哪种方式?不一致的原因在哪里(jQuery?Firefox?Chrome/IE11?)?

$('button').on('click',function(){ 
 
    var color = '#'+(Math.random()*0xFFFFFF<<0).toString(16); 
 
    $(event.target).css({backgroundColor:color}); 
 
    $('body').css({backgroundColor:color}); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button type="button">Click me!</button>

+0

是否存在某种使用它的事件的父事件?该事件是否与按钮点击相关联? iirc'event'应该是未定义的,因为它并不隐式传递给回调函数 –

+0

现在我知道我在找什么,MDN的文章[window.event](https://developer.mozilla.org/en- US/docs/Web/API/Window/event)给出了详细信息。 – Ouroborus

回答

1

在某些浏览器实际上是全局定义的情况下,window.event,刚刚指的是最后一个事件。在其他情况下,需要明确通过。你可以总是通过它作为第一个参数,我相信(我知道我不久前碰到这个,认为这是我使用的解决方案)。

如果你想要非常安全,你可以随时通过它,然后在函数内部做event = event || window.event

1

这似乎是这个问题的一个副本:ReferenceError: event is not defined error in Firefox

基本上浏览器,IE和Safari对事件的全局符号,Firefox没有。根据最佳实践,您应该始终提供参数eventewhatever以规范化浏览器之间的行为