2013-01-18 10 views
6

तरहपरीक्षण करें कि एक वस्तु एक डोम घटना

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

एक समारोह के भीतर से है यह तय करने के लिए कि क्या e एक डोम घटना है एक विश्वसनीय और कारगर तरीका है?

+0

'eventHandler' कैसे कहा जा रहा है? –

+0

@TravisJ जो वास्तव में प्रासंगिक नहीं है? प्रश्न यह है कि हम कैसे जांच कर सकते हैं कि 'e' एक डोम घटना है या नहीं। – Shmiddty

+0

@Shmiddty - मुझे लगता है, मुझे लगता है कि मैंने इस सवाल को गलत समझा था। –

उत्तर

3

मुझे विश्वास नहीं है कि यह निर्धारित करने का एक विश्वसनीय तरीका है कि कोई दिया गया ऑब्जेक्ट कोई DOM ईवेंट नहीं है।

  1. typeof e हमेशा वास्तविक घटना वस्तुओं, जो उपयोगी नहीं है के लिए 'object' वापस आ जाएगी।
  2. किसी भी संपत्ति जिसे आप ऑब्जेक्ट पर जांच सकते हैं, एक वास्तविक ईवेंट ऑब्जेक्ट या किसी भी गैर-ईवेंट ऑब्जेक्ट में मौजूद हो सकता है।
  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

शायद अगर घटना डीओएम के माध्यम से event.bubbles बुलबुले हो तो यह डोम घटना है। लेकिन अगर यह कथन सत्य है तो भी इसका प्रचार बंद हो सकता है।

UPDATED:

ठीक संपत्ति आप देख रहे हैं e.target है और IE e.srcElement के लिए। दोनों गुण एचटीएमएल तत्व को वापस करते हैं जिस पर घटना होती है जिस पर इसे डीओएम ईवेंट के रूप में परिभाषित किया जाता है।

हालांकि शायद आपको यह निर्दिष्ट करना चाहिए कि आप डीओएम घटना के रूप में क्या व्याख्या करते हैं। आप ब्राउज़र की देशी घटनाओं मतलब है, क्योंकि यह भी डोम घटना है:

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

यह एक डोम नोड

+0

'var spoof = {target: someDOMNode, srcElement: someDOMNode}; 'कोई ईवेंट ऑब्जेक्ट नहीं है। – Shmiddty

+0

फिर फ़ंक्शन एक ईवेंट हैंडलर नहीं है – kidwon

+0

एक फ़ंक्शन एक फ़ंक्शन है। आप कहीं से भी एक समारोह को कॉल कर सकते हैं (जहां यह दायरे में है)। – Shmiddty

-1

jQuery में मैं एक परीक्षण समारोह, कुछ इस तरह बनाया से आबद्ध है:

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

संबंधित मुद्दे