0

クロージャーライブラリを使用して小さなアプリを作成しようとしています。次のコードでイベント委任を使用しようとしています:

var dom_ = goog.dom.$('targetelementid');
goog.events.listen( dom_, goog.events.EventType.CLICK, function( e ) {
  console.log( e );
}, false);

問題は、イベントがディスパッチされてハンドラー関数が実行されると、生成されたオブジェクト(goog.events.BrowserEvent)のtargetプロパティとcurrentTargetプロパティがnullに設定されることです。なぜなのかわかりません。

通常のリスナーを使用して(を使用してaddEventListener)ハンドラー関数に渡されるイベントには、ターゲットが正しく設定されています。

イベントオブジェクトにターゲットが指定されていないように見える場合に、クロージャライブラリコードでイベント委任パターンを使用する方法に関する注意事項はありますか?

4

2 に答える 2

1

これは実際には当てはまりません。イベントにはターゲットがあり、ハンドラーで使用できるときに必要な他のすべてのものがありますが、goog.eventsに登録されているすべてのハンドラーが使い果たされると、イベントオブジェクトは破棄されます(つまり、そのすべてのプロパティが削除されます/ null-ed)であり、最新のWebブラウザコンソールの実装ではオブジェクトの「ライブ」ビューが表示されるため、オブジェクトは空のように見えます。

ヒント:「デバッガ」を使用してください。JavaScriptの実行を停止し、デバッガーでスタックを開くためのドントがある場所の概念。

于 2012-10-03T12:38:16.387 に答える
0

「this」がイベントをディスパッチしたものである場合、ターゲットは無関係であるため、スコープオブジェクト(addEventListenerがバックグラウンドで実行すること)を使用してコードを拡張してみてください。

var dom_ = goog.dom.$('targetelementid');
goog.events.listen( dom_, goog.events.EventType.CLICK, function( e ) {
  console.log( e );
}, false, this);

最後に「これ」があることに注意してください。

于 2012-02-26T11:56:12.253 に答える