From within a function like:
function eventHandler(e) { // ... } is there a reliable and efficient way to determine whether e is a DOM event?
I don't believe there is a reliable way to determine if a given object is NOT a DOM event.
typeof e will always return 'object' for genuine Event objects, which is not helpful.contructor property might seem promising, but one could do this:function DummyEvent(){ this.constructor.toString = function(){ return "function MouseEvent() { [native code] }"; } } This ends up making console.log(e.constructor) print "function MouseEvent() { [native code] }"
So, is there a "reliable" way to tell if an object is an event? No.
Edit — Note that all of this is irrelevant if you want to prevent event spoofing as you can create real events easily.
var evt = new Event('click'); var evt2 = document.createEvent('MouseEvents'); evt2.initMouseEvent('click', ...); //etc Edit2 — I've created a test jsFiddle trying to find some way to distinguish objects, but I haven't found anything definite yet. Note that I didn't bother to specify properties on the DummyEvent because those can obviously easily be spoofed.
Perhaps if the event bubbles event.bubbles up through the DOM it's DOM event. But even if that statement is true its propagation might be stopped.
UPDATED :
OK the property you are looking for is e.target and for IE e.srcElement. Both properties return the HTML element the event took place on which defines it as DOM event.
However perhaps you should specify what you interpret as DOM event. Do you mean browser's native events, because this is DOM event too:
var zoo = jQuery('#zoo'); zoo.bind('moo'); zoo.trigger('moo'); It is binded to a DOM node
var spoof = { target: someDOMNode, srcElement: someDOMNode }; is not an Event object.In jquery I created a testing function, something like this:
function isEvent(e) { try { e.PreventDefault(); return true; } catch (err) { return false; } }
and testing code:
var o = new Object(); var e = $.Event('click'); alert(isEvent(o)); alert(isEvent(e)); the former alert shows false, while the latter shows true. See fiddle.
UPDATE: It's safer to call something like preventDefault instead of trigger.
e.type = 'click'; jsfiddle.net/eh6W7/1PreventDefault method to the object and you won't get a reference error.
eventHandlerbeing called?eis a DOM event.