更改GWT中事件处理的顺序

时间:2011-12-30 12:14:19

标签: gwt

我有一个建议框,其中包含2个使用者SelectionHandler,用于选择SuggestionList中的keyDownHandlerTextBox SuggestBox上的项目。当建议列表当前显示时,我想阻止对事件的默认操作(例如,按Enter键)。问题是SelectionEvent始终在KeyDownEvent之前触发,而建议列表在SuggestionEvent触发后关闭,因此在KeyDownEventHandler建议列表已经关闭。并且我无法在Enter上使用防止默认操作,并检查建议列表是否显示如下:

if ((nativeCode == KeyCodes.KEY_TAB || nativeCode == KeyCodes.KEY_ENTER) && display.isSuggestionListShowing()) {
     event.preventDefault();
}

其中display.isSuggestionListShowing()是在isShowing上调用SuggestBox的方法。 那么在这种情况下,如何更改事件处理的顺序(Selection之前的KeyDownkeyDown之前的Selection)?

1 个答案:

答案 0 :(得分:2)

我假设您的意思是SuggestBox而不是SuggestionList,因为gwt-user jar中没有该名称的类。

SuggestBox使用keydown事件来提供SelectEvent - 如果它无法看到密钥更改(从浏览器实际获取用户的操作),则无法提供逻辑选择事件

这意味着重新排序事件并没有多大意义 - 你无法在原因之前产生影响。在许多情况下,浏览器按特定顺序发出事件,并且无法更改此事件,因此您必须对问题进行不同的思考。

(另外值得指出的是,preventDefault()只会阻止浏览器执行其默认行为 - 其他处理程序仍将正常启动。)

一个选项是在所有事件到达SuggestBox之前预览,并在某些情况下取消事件 - 查看com.google.gwt.user.client.Event.addNativePreviewHandler(NativePreviewHandler)如何做到这一点。

我没有立即看到任何其他选项 - 处理keydown的所有实际逻辑都包含在com.google.gwt.user.client.ui.SuggestBox.addEventsToTextBox()的私有方法的内部类中,没有任何选项可以覆盖它。