2013-01-18 45 views
6

從像測試對象是否是一個DOM事件

function eventHandler(e) { 
    // ... 
} 

函數內有一個可靠和有效的方式來確定是否e是DOM事件?

+0

如何調用'eventHandler'? –

+0

@TravisJ是不是真的有意義呢?問題是我們如何測試'e'是否是DOM事件。 – Shmiddty

+0

@Shmiddty - 我明白了,我想我誤解了這個問題。 –

回答

3

我不相信有一個可靠的方法來確定一個給定的對象是否是不是一個DOM事件。

  1. typeof e將始終爲真正的事件對象,這是沒有幫助的回報'object'
  2. 您可能在對象上檢查的任何屬性都可以存在於真正的Event對象或任何非Event對象中。
  3. 您可能認爲原型鏈可以用於確定此問題,但它具有與#2相同的問題(可以輕鬆複製)。
  4. contructor屬性似乎很有希望,但一個可以這樣做:
function DummyEvent(){ 
    this.constructor.toString = function(){ 
     return "function MouseEvent() { [native code] }"; 
    } 
} 

這最終使console.log(e.constructor)打印"function MouseEvent() { [native code] }"

那麼,有沒有一個「可靠」的方式告訴我們,如果一個對象是一個事件?

編輯 —請注意,如果您想防止事件欺騙,因爲您可以輕鬆創建真實事件,所有這些都無關緊要。

var evt = new Event('click'); 
var evt2 = document.createEvent('MouseEvents'); 
evt2.initMouseEvent('click', ...); 
//etc 

EDIT2 —我創建了一個測試jsFiddle試圖找到一些方式來區分對象,但我沒有發現任何明確的呢。請注意,我並不打算在DummyEvent上指定屬性,因爲這些顯然很容易被欺騙。

+0

感謝您的徹底解答。我將其標記爲已接受。 –

0

也許如果事件通過DOM起泡event.bubbles它是DOM事件。 但即使該聲明是真實的,其傳播可能會停止。

修訂

確定你正在尋找的屬性是e.target和IE e.srcElement。 這兩個屬性都返回發生事件的HTML元素,並將其定義爲 DOM事件。

但也許你應該指定你解釋爲DOM事件。 你的意思是瀏覽器的原生事件,因爲這是DOM事件太:

var zoo = jQuery('#zoo'); 
zoo.bind('moo'); 
zoo.trigger('moo'); 

它綁定到

+0

'var spoof = {target:someDOMNode,srcElement:someDOMNode};'不是一個Event對象。 – Shmiddty

+0

然後該函數不是事件處理函數 – kidwon

+0

函數是一個函數。你可以從任何地方調用一個函數(它在範圍內)。 – Shmiddty

-1

jQuery中我創建了一個測試功能,像這樣一個DOM節點:

function isEvent(e) { 
    try { 
     e.PreventDefault(); 
     return true; 
    } 
    catch (err) { 
     return false; 
    } 

}

和測試代碼:

var o = new Object(); 
var e = $.Event('click'); 
alert(isEvent(o)); 
alert(isEvent(e)); 

前警報顯示錯誤,而後者顯示正確。見fiddle

更新:調用類似preventDefault而不是觸發器更安全。

+0

如果您指定類型,則此測試失敗:'e.type ='點擊';'http://jsfiddle.net/eh6W7/1/ – Shmiddty

+0

我修改了帖子。 – AlecTMH

+0

同樣的問題...只是添加一個'PreventDefault'方法的對象,你不會得到一個參考錯誤。 – Shmiddty

相關問題