我想在我的HTML + GWT应用程序中添加键盘快捷键,但我不想让他们在文本区域输入或使用键盘操作选择菜单时触发操作。
有没有办法检查元素是否主动消耗键盘事件,以便我可以避免这样做? Gmail很好地完成了这项工作,但可能没有使用GWT。
一个解决方案可能是为我的应用上的每个控件添加一个事件处理程序,并在那里生成的按键事件上调用stopPropogation,但这会危及我 想要的任何其他事件处理程序在用户输入时触发。
更新:重述问题:
答案 0 :(得分:0)
我找到了一个有点笨拙的解决方案:
Event.addNativePreviewHandler(new NativePreviewHandler()
{
@Override
public void onPreviewNativeEvent(NativePreviewEvent event)
{
if (event.getTypeInt() == Event.ONKEYPRESS && (event.getNativeEvent().getCharCode() == 'h' || event.getNativeEvent().getCharCode() == 'H'))
{
String targetType = event.getNativeEvent().getEventTarget().toString();
if (targetType.contains("HTMLHtmlElement"))
{
helpTab.simulateClick();
}
}
}
});
这看起来很糟糕,因为:
target instanceof HtmlElement
的内容?我现在会使用这个答案,但我很乐意将复选标记授予更好的解决方案。
答案 1 :(得分:0)
AFAIK没有直接的方法来检查元素是否具有焦点。但您可以安装在元素获得焦点时触发的FocusHandler:
textBox.addFocusHandler(new FocusHandler() {
@Override
public void onFocus(FocusEvent event) {
// your element is now focused
}
});
答案 2 :(得分:0)
这是另一种选择。它检查初始目标元素是textarea
还是input
,在这种情况下,它不会触发帮助。对于任何其他元素,它将触发帮助并取消事件。
Event.addNativePreviewHandler(new NativePreviewHandler() {
@Override
public void onPreviewNativeEvent(NativePreviewEvent event) {
if (event.getTypeInt() == Event.ONKEYPRESS) {
final String tn = Element.as(event.getNativeEvent().getEventTarget()).getTagName();
if (!"textarea".equalsIgnoreCase(tn) && !"input".equalsIgnoreCase(tn)) {
event.cancel(); // this will prevent the event from being fired.
// add your help handling here
if (event.getNativeEvent().getCharCode() == 'h' || event.getNativeEvent().getCharCode() == 'H')
Window.alert("help");
}
}
}
});
答案 3 :(得分:0)
只需为onFocus上的文本输入禁用keypresshandler即可。重新启用布鲁尔。请参阅FocusHandler和BlurHandler的文档。