2011-01-11 63 views
0

我想键盘快捷方式添加到我的HTML + GWT应用程序,但我不希望,如果他们在文本区域正在打字或使用键盘来操作一个选择菜单被触发的动作。有没有一种方法来确定用户是否使用文本输入控制?

有没有一种方法来检查元素是否是积极消费键盘事件,让我能避免这样做? Gmail很好地完成了这一点,但可能不使用GWT。

一种解决方案可能是一个事件处理程序上生成那里的按键事件添加到每个单独的控制我的应用程序,并调用stopPropogation,但是这将危及任何其他事件处理,我想火,而用户正在键入。

更新:问题重述:

  • 我想一个KeyPressHandler附加到响应按键,以在工地附近导航DOM。 “打h打开帮助”或“按m进入菜单”,那样的事情。但我希望这个KeyPressHandler激活,如果用户只是在一个文本框输入,对不对?我不想离开他们正在输入的东西。所以,我需要一些方法来滤除这些事件,从我的应用程序中用户可能键入的任何地方进行筛选。

回答

0

这是一个替代方案。它检查如果初始目标元素是textareainput,当是这样的话,将不会触发帮助。对于任何其他元素,它将触发帮助并取消事件。

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"); 
     } 
     } 
    } 
}); 
0

我已经找到一个解决方案,它是一点点janky:

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可用?

现在我将使用此答案,但我很乐意将该复选标记授予更好的解决方案。

0

AFAIK有检查元素具有焦点没有直接的方法。但是你可以安装当元素获得焦点时触发的FocusHandler:

textBox.addFocusHandler(new FocusHandler() { 
     @Override 
     public void onFocus(FocusEvent event) { 
       // your element is now focused 
     } 
    }); 
0

只需禁用您的keypresshandler以进行文本输入onFocus。重新启用Blur。查看FocusHandler和BlurHandler的文档。

相关问题