我正在覆盖GWT TextInputCell.onBrowserEvent()
方法,尝试对输入到字段中的字符应用过滤。如何才能获得用户在keydown
事件中输入的实际字符?
我可以使用NativeEvent.getKeyCode()
方法来获取密钥代码,但这还不够,因为我想知道他们输入的特定字符,所以我可以将字符与常规表达进行比较。据我了解,keyCode只是告诉我他们在键盘上键入的键,所以我不能区分大写'A'和小写'a'。我也可以从InputElement
事件的keyup
中获取值,但这已经太晚了,因为该角色已经被渲染到UI元素。
当我调用NativeEvent.getCharCode()
时,它会为我键入的任何字符返回0。我在Chrome和Firefox上试过这个。为什么getCharCode()
总是返回0?这是一个错误吗?
例如,这是我尝试的内容以及键盘上输入数字“1”时得到的值:
event.getKeyCode() - 49
event.getCharCode() - 0
Character.toChars(event.getCharCode())[0] - (a box character because charCode was 0)
String.valueOf(Character.toChars(event.getCharCode())) - (a box character because charCode was 0)
String.valueOf((char) event.getKeyCode()) - 1
好的,所以我看到我需要捕获keypress
事件而不是keydown
,但是我打印出每个event.getType()
值,因为我键入的每个事件都发生了看到触发了一个keypress
事件。所以我更新的问题是,keypress
事件发生的原因是什么?如果我无法在TextInputCell.onBrowserEvent()
方法中捕获它,是否有不同的方法来捕获TextInputCell
。
答案 0 :(得分:2)
因此,事实证明,AbstractCell采用了表示“consumeEvents”的字符串列表。这基本上限制了子单元类可以处理的事件类型。 TextInputCell传递change和keyup事件类型。 AbstractInputCell添加焦点,模糊和keydown。因此,TextInputCell无法处理keypress本机事件。
我最终在我自己的项目中创建了一个近乎精确的TextInputCell副本,并将keypress类型添加到构造函数中。然后我能够抓住事件并进行我想要做的过滤。我将在GWT中创建一个请求,将此功能添加到TextInputCell。
我还创建了一个功能请求,将此功能添加到GWT:http://code.google.com/p/google-web-toolkit/issues/detail?id=5891
答案 1 :(得分:0)
有关密钥代码与字符代码的解释,请参阅this question。
要检测'A'与'a',您可能需要检查NativeEvent.getShiftKey()方法,该方法将告诉您是否按下了shift键。请注意,还有NativeEvent.getCtrlKey()和NativeEvent.getMetaKey()方法。