我正在尝试使用以下代码实现字母数字文本框:
textBoxNewPassword.addKeyPressHandler(new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent event) {
char keyCode = event.getCharCode();
TextBox sender = (TextBox) event.getSource();
if (!Character.isLetterOrDigit(keyCode)
|| !(keyCode == KeyCodes.KEY_TAB)
|| !(keyCode == KeyCodes.KEY_BACKSPACE)
|| !(keyCode == KeyCodes.KEY_LEFT)
|| !(keyCode == KeyCodes.KEY_RIGHT)
)
sender.cancelKey();
}
});
然而,Backspace和Tab不起作用,这需要擦除用户具有类型的内容并跳转到另一个表单字段。
此代码中缺少哪些想法?
答案 0 :(得分:1)
tb.addKeyPressHandler(new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent event) {
TextBox sender = (TextBox) event.getSource();
int keyCode = event.getNativeEvent().getKeyCode();
if (!(Character.isLetterOrDigit(event.getCharCode()))
&& !(keyCode == KeyCodes.KEY_TAB)
&& !(keyCode == KeyCodes.KEY_BACKSPACE)
&& !(keyCode == KeyCodes.KEY_LEFT)
&& !(keyCode == KeyCodes.KEY_RIGHT)) {
sender.cancelKey();
}
}
});
这看起来很有效。
答案 1 :(得分:0)
我认为问题在于你的条件。想想这样:如果用户点击Tab,那么它将不是字母或数字,因此它取消了键。只有当它不是任何你想要的密钥时,你才想取消,而不是如果它不是所有密钥(一次)。如果你改为&&
而不是它应该工作。
if (!Character.isLetterOrDigit(keyCode)
&& !(keyCode == KeyCodes.KEY_TAB)
&& !(keyCode == KeyCodes.KEY_BACKSPACE)
&& !(keyCode == KeyCodes.KEY_LEFT)
&& !(keyCode == KeyCodes.KEY_RIGHT)
)
sender.cancelKey();
如果它不是字母或数字,并且它不是标签,并且它不是退格键,而不是左键,而不是右键,则取消。
答案 2 :(得分:0)
DTing是在正确的轨道上,但是您无法确定在KeyPressEvent中是否获得了正确的键码(取决于浏览器),您应该将它与KeyDown处理程序结合使用。特别是退格和删除等处理方式不同。
来源:http://code.google.com/p/google-web-toolkit/issues/detail?id=4212和http://www.quirksmode.org/js/keys.html