2012-07-14 60 views
2

爲了某種目的,我想將變量中的Window.Event對象緩存起來,稍後再使用它,但是MSIE一直告訴我這是'未知'。MSIE如何警惕'未知'?

只是在IE中運行下面的代碼,你會明白我的意思

我只是想問問怎麼能這樣呢? 我錯過了什麼嗎?

HTML:

<button id='btn'>Click!!!</button> 

JS:

var eventObj = null; 
    document.getElementById('btn').onclick = function() { 
     eventObj = window.event; 
     setTimeout(function() { 
      alert(typeof eventObj.srcElement); 
     }, 1000) 
    }​ 

EIDT 1:

我有搜索一些測試其他做,請參閱以下:

HTML:

<button id='btn1'>Click 1 !!</button> 
<button id="btn2">Click 2 !!</button> 

JS

var btn1EventObj = null; 
document.getElementById('btn1').onclick = function() { 
    btn1EventObj = window.event; 
    alert(btn1EventObj.srcElement.id); 
} 
document.getElementById('btn2').onclick = function() { 
    alert(btn1EventObj === window.event); // output:false; 
    alert(btn1EventObj.srcElement === window.event.srcElement); // output: true ; 
    alert(btn1EventObj.srcElement.id); // output: btn2 ; 
} 

當BTN1一直點擊我以爲我緩存在btn1EventObj的 '事件對象',然後單擊BTN2:

test:

btn1EventObj === window.event - > false; //存在MSIE不僅是一個事件對象

btn1EventObj.srcElement === window.event.srcElement - >真 //我無法理解這樣的一個下面的。

btn1EventObj.srcElement.id - > BTN2

看到fiddle

因此上述所有告訴我,也許所有在MSIE引發的事件都是共享的屬性,並且點擊時BTN2 ,之前的所有屬性都被後面的屬性覆蓋了嗎?

我有點兒沒錯?

+3

這裏是上述的小提琴:http://jsfiddle.net/jdkJT/ – F21 2012-07-14 09:46:37

+0

你真的認爲編寫IE瀏覽器的代碼是一個好主意嗎?! – ThiefMaster 2012-07-14 10:42:04

+0

@ThiefMaster不知道,作爲一個開發人員,我只是有點討厭IE,但上面應該是一個問題,我想解決和理解爲什麼。 – Lien 2012-07-14 10:45:01

回答

1

您不能複製window.event出在IE中實際事件的背景。換句話說:當您在腳本中分配處理程序時,不存在現有事件。如果你想參考window.event,處理程序必須內聯分配。

MSDN:

The event object is available only during an event—that is, 
you can use it in event handlers but not in other code. 

HTML:

<button id='btn' onclick="clicker(event);">Click!!!</button> 

和JS:

function clicker(e){ 
    setTimeout(function(){ 
     alert(e.srcElement); 
    },1000); 
    return; 
} 

在MSDN event

+0

謝謝!我明白你的意思!所以我只能緩存Event.target而不是事件本身,對吧? – Lien 2012-07-14 10:38:34

+0

@strangeline這就是我在IE中理解「事件」的方式。 – Teemu 2012-07-14 10:44:40

+0

由於這個原因,不需要傳遞事件。 – 2012-07-14 10:54:42

1

`window.event'是一個全局對象,可以在每個引發的事件上進行更改。毫秒內在瀏覽器上提出的許多事件。

注:

如果設置var y = someObject的對象不是複製到y變量,該變量y只包含對象在內存中的地址(你可以google一下:對象引用和指針)。所以你需要對象複製到y,或嘗試以下替代解決方案:

,所以你需要使用function(e){}風格的事件處理程序:

var eventObj = null; 
document.getElementById('btn').onclick = function(e) { 
    eventObj = e; 
    setTimeout(function() { 
     alert(typeof eventObj.srcElement); 
    }, 1000) 
} 

見到這對jsfiddle

編輯1:

在M $ IE中您可以使用此代碼:

function copyObject(o){ 
    return {srcElement: o.srcElement, 
      ... 
      more attributes ... 
      }; 
} 

var eventObj = null; 
document.getElementById('btn').onclick = function(e) { 
    eventObj = copyObject(window.event); 
    setTimeout(function() { 
     alert(typeof eventObj.srcElement); 
    }, 1000) 
} 

看到jsfiddle(Edited)

+1

在IE中,事件對象不會傳遞給事件偵聽器,而是全局的'window.event'。 – 2012-07-14 09:57:25

+0

好的。所以你需要複製window.event對象。 – pylover 2012-07-14 10:00:31

+0

應用該更改後,與原始代碼相比有什麼區別? – 2012-07-14 10:02:31

0
var eventObj = null; 
document.getElementById('btn').onclick = function() { 
    eventObj = window.event; 
    setTimeout((function(eventObj) { 
     alert(typeof eventObj.srcElement); 
    })(eventObj), 1000) 
} 

DEMO.

事件對象僅在一個事件是可用的情況,可以在事件處理程序,但不是在其他代碼中使用它,你正在使用setTimeout因此事件有這並沒有提供已被執行,因爲爲了避免衝突IE設置爲空,1秒後它不可用,所以你可以使用閉包。

+0

這段代碼立即在'setTimeout'裏面運行匿名函數,並且拋出'Bad argument''錯誤。 – Teemu 2012-07-14 12:01:28