のような関数内から
function eventHandler(e) {
// ...
}
e
DOM イベントかどうかを判断する信頼できる効率的な方法はありますか?
のような関数内から
function eventHandler(e) {
// ...
}
e
DOM イベントかどうかを判断する信頼できる効率的な方法はありますか?
特定のオブジェクトがDOM イベント でないかどうかを判断する信頼できる方法があるとは思えません。
typeof e
は常に'object'
本物の Event オブジェクトを返しますが、これは役に立ちません。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
。これらは明らかに簡単にスプーフィングされる可能性があるためです。
おそらく、イベントがevent.bubbles
DOM を介してバブルアップする場合、それは DOM イベントです。しかし、そのステートメントが真実であっても、その伝播は停止する可能性があります.
更新:
OK、探しているプロパティはe.target
IEe.srcElement
です。どちらのプロパティも、イベントが発生した HTML 要素を返します。HTML 要素は、それを DOM イベントとして定義します。
ただし、DOM イベントとして解釈するものを指定する必要があるかもしれません。これはDOMイベントでもあるため、ブラウザーのネイティブイベントを意味しますか?
var zoo = jQuery('#zoo');
zoo.bind('moo');
zoo.trigger('moo');
DOM ノードにバインドされている
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));
前者のアラートは false を示し、後者は true を示します。フィドルを参照してください。
更新: トリガーの代わりに preventDefault のようなものを呼び出す方が安全です。