我正在使用GWT。我开始通过添加事件处理程序向我的小部件添加事件。
事件处理程序示例代码:
widget.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
// do something
}
});
然后我发现还有另一种使用 sinkEvents() 处理事件的方法。
接收器事件示例代码(来自此网站):
{
...
sinkEvents(Event.ONMOUSEDOWN | Event.ONMOUSEUP | Event.ONMOUSEOVER |Event.ONMOUSEOUT)
...
}
public void onBrowserEvent(Event event) {
Element td = getEventTargetCell(event);
if (td == null) return;
Element tr = DOM.getParent(td);
switch (DOM.eventGetType(event)) {
case Event.ONMOUSEDOWN: {
// do something
break;
}
case Event.ONMOUSEUP: {
// do something
break;
}
case Event.ONMOUSEOVER: {
// do something
break;
}
case Event.ONMOUSEOUT: {
// do something
break;
}
}
}
- EventHandlers 和 SinkEvents 是否执行相同的功能工作?
- 如果是,权衡什么?(你会在哪里使用一个而不是另一个)
- 如果不是,它们有何不同?
我不是 GWT 专家,但这是我从查看 GWT 来源中收集到的:
-
所有事件处理程序(最终)调用
addDomHandler(..)
,后者调用sinkEvents()
。sinkEvents()
是较低级别的,是本机JavaScript事件处理的浏览器抽象包装器。事件处理程序构建在 sinkEvents 之上,因此它们提供 sinkEvents 执行的所有功能。
但在用法方面它们是不同的:使用 EventHandler,您可以使用可以驻留在不同类中的不同事件处理程序注册不同的事件类型。事件将自动路由到相应的处理程序。使用 sinkEvents,您可以注册不同的事件类型(通过 int,而不是类型安全),但始终会调用此小部件的
onBrowserEvent(event)
。 -
事件处理程序会增加一定的开销。这是否重要是值得商榷的。
事件处理程序 是添加和删除事件处理程序的类型安全方法,也是将事件路由到所选已注册处理程序的自动方法。如果使用 GWT 小部件,则应使用事件处理程序。