23

WinJS でカスタム イベントのイベント ハンドラーを作成しようとしています。これがIEでどのように機能するのかよくわかりません-カスタムイベントを作成してディスパッチしています-

var eventObject = document.createEvent("CustomEvent");
eventObject.initCustomEvent("dropbomb", true, true, null);
this._element.dispatchEvent(eventObject);

私のハンドラーは -

this._element.addEventListener("logtelemetry", function () {
                console.log("boom");
});

ハンドラーが後でではなく、同期して呼び出されることを確信できますか? もしそうなら、その証拠は何ですか。

4

2 に答える 2

38

次の理由により、同期が保証されます。

dispatchEvent の戻り値は、イベントを処理したいずれかのリスナーが preventDefault を呼び出したかどうかを示します。

戻り値は、イベントを処理したリスナーのいずれかが preventDefault を呼び出したかどうかを示すため、メソッドはすべてのリスナーの実行が完了するまでブロックする (戻らない) 必要があります。これが同期呼び出しの定義です。

上記の引用は、2000 年 11 月に「推奨」ステータス (標準) を達成した DOM Level 2 Events の dispatchEvent 仕様からの抜粋です。Internet Explorer は、少なくとも IE 9 以降、この標準に準拠しています。

console.log自分で確認するには、呼び出しの直後にステートメントを追加し、(イベント ハンドラーから) が常に最初にログに記録される.dispatchEventことに注意してください。"boom"

于 2014-04-07T23:20:40.283 に答える
1

ハンドラーは、 のデフォルトの実装を使用してすぐに呼び出されますWinJS.Utilities.eventMixin。延期はありません。

個々のハンドラーは、 // setTimeout/またはその他のカスタム ロール実装を使用して、遅延処理を実行することを選択できます。setImmediatesetIntervalrequestAnimationFrame

DOM イベントについて話している場合、それらに DOM 要素ツリーをバブルアップするように依頼することに注意してください - 私は 100% 明確ではありません (誰かがその特定をここに追加できるかもしれません)。

于 2013-03-08T03:26:59.220 に答える