6

のような関数内から

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

eDOM イベントかどうかを判断する信頼できる効率的な方法はありますか?

4

3 に答える 3

3

特定のオブジェクトがDOM イベント でないかどうかを判断する信頼できる方法があるとは思えません。

  1. typeof eは常に'object'本物の Event オブジェクトを返しますが、これは役に立ちません。
  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。これらは明らかに簡単にスプーフィングされる可能性があるためです。

于 2013-01-18T22:13:33.897 に答える
0

おそらく、イベントがevent.bubblesDOM を介してバブルアップする場合、それは DOM イベントです。しかし、そのステートメントが真実であっても、その伝播は停止する可能性があります.

更新:

OK、探しているプロパティはe.targetIEe.srcElementです。どちらのプロパティも、イベントが発生した HTML 要素を返します。HTML 要素は、それを DOM イベントとして定義します。

ただし、DOM イベントとして解釈するものを指定する必要があるかもしれません。これはDOMイベントでもあるため、ブラウザーのネイティブイベントを意味しますか?

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

DOM ノードにバインドされている

于 2013-01-18T20:55:00.403 に答える
-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));

前者のアラートは false を示し、後者は true を示します。フィドルを参照してください。

更新: トリガーの代わりに preventDefault のようなものを呼び出す方が安全です。

于 2013-01-18T21:12:25.433 に答える