8

ブラウザイベントとは正確には何ですか?たとえば、onBrowserEvent をオーバーライドする単一のボタンを含むカスタム ウィジェットがあるとします。onBrowserEvent メソッドは、ボタンをクリックしたときにのみ呼び出されます。このイベントは、onMouseOver、onMouseOut、KeyPressed などのすべてのイベントに対して呼び出されると思いました...

また、デフォルトではサポートされていないイベントをウィジェットにリッスンさせるために DomHandler を追加する場合。ドキュメントでは、「ネイティブ イベント ハンドラーをウィジェットに追加し、対応するネイティブ イベントをシンクします」と記載されていますが、このコンテキストでのネイティブ イベントとはどういう意味ですか?

ありがとう

4

1 に答える 1

15

GWT にはサンクイベントという概念があります。沈められたすべてのイベントが に渡されますが、それらのイベントのみが に渡されEventListenerますonBrowserEvent

最下位レベルでは、 を using にアタッチEventListenerElement、イベントをDOM.setEventListenerシンクDOM.sinkEventsます(または最近ではDOM.setBitlessEvents)。メモリ リークを回避するには (特に、古い IE だけでなくても)、ページをアンロードする前に を必ず設定する必要Elementがあります。EventListenernull

AWidgetは でありEventListener、これらのいくつかを処理します。自動的DOM.setEventListenerにそのonAttachおよび を呼び出し、沈没イベントonDetachを追跡します。これは、作業を容易にするために追加されているため、対応するものがあります。sinkEventsunsinkEvents

その後、GWT 1.6 でイベント ハンドラーが追加され、addDomHandler(最近では)適切な値 (引数として渡されたものから取得addBitlessDomHandler) で自動的に呼び出さ れます。そして、このすべてを機能させるために、ウィジェット内のデフォルトの動作は、登録されたハンドラーにイベントをディスパッチすることです。sinkEventsDomEvent.TypeonBrowserEvent

これらのビットレスバリアントの理由は、イベントがもともとintビットフィールドの定数として参照されていたからですが、ブラウザーにはますます多くのイベントが含まれるため、GWT でビットが不足し始めました。ビットベースのイベントとは対照的に、ウィジェットはどのイベントがそのように登録されているかを追跡せず、.onDetach

GWT 1.6 以降のこれらすべての新しいDomEvent(ハンドラーを含む) は、 a のラッパーNativeEventです。2 種類の があります。ブラウザによってディスパッチされるGwtEventネイティブのもの ( ) と、GWT 自体によってディスパッチされ、DOM レベルでイベントにマップされない論理的なものです。s 、別名ネイティブ イベントのみに関心があります。DomEventaddDomHandlerDomEvent

まとめ: 変更したばかりのテキスト フィールドを終了すると、ブラウザーはchangeイベントを送出します。TextBoxウィジェットがそのイベントを沈めた場合、そのイベントを表すonBrowserEventで呼び出されますEvent(これは の単なるレガシー サブクラスですNativeEvent)。thenのデフォルトの実装はonBrowserEvent、 を作成し、ChangeEventそれを登録済みの にディスパッチしChangeHandlerます。

于 2013-04-14T21:48:11.360 に答える