2017-02-15 180 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以規範化瀏覽器之間的行爲