有没有办法确定用户是否使用文本输入控件?

时间:2011-01-11 16:42:36

标签: javascript html gwt focus

我想在我的HTML + GWT应用程序中添加键盘快捷键,但我不想让他们在文本区域输入或使用键盘操作选择菜单时触发操作。

有没有办法检查元素是否主动消耗键盘事件,以便我可以避免这样做? Gmail很好地完成了这项工作,但可能没有使用GWT。

一个解决方案可能是为我的应用上的每个控件添加一个事件处理程序,并在那里生成的按键事件上调用stopPropogation,但这会危及我 想要的任何其他事件处理程序在用户输入时触发。

更新:重述问题:

  • 我想将一个KeyPressHandler附加到响应按键以在网站上导航的dom。 “点击h打开帮助”或“按m进入菜单”,那种事情。但是,如果用户只是在文本框中输入,我想要激活此KeyPressHandler,对吧?我不想离开他们正在打字的东西。因此,我需要从我的应用中用户可能正在键入的任何位置过滤掉这些事件。

4 个答案:

答案 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的文档。