2009-12-11 41 views
6

我使用jQuery绑定了keydown事件,以允许在文本框中使用一些特定的字符。我试图让我的代码跨浏览器和平台兼容。我的主要问题是我无法找到一种方法将接收到的密钥代码映射到有效的char代码,特别是来自数字键盘(小数点分隔符,它是昏迷还是句点等)的密钥代码。Javascript关键代码=/= char代码

预先感谢帮助, 费边

回答

1

好吧,就像我在评论中所说的,这个问题背后的目标是过滤一个数字值的文本框。我设法使用按键事件达到我的目标。

我已经为那些对解决方案感兴趣的人发布了jQuery plug-in

6

这是正确的。没有这样的映射,你可以做;​​甚至可能不对应于正在插入的字符。或Caps Lock可能会改变按键的含义,并且您无法嗅探到这一点。和various other wrinkles

如果您想知道字符代码,您唯一的选择就是使用keypress事件。

+0

这也是我的结论。但是,根据http://www.quirksmode.org/js/keys.html,似乎Firefox没有正确处理按键事件。我有点卡住在这个问题上: -/ – 2009-12-11 14:17:36

+0

关于按键的另外一件事,我得到的时间和删除键(不退格)相同的代码:46.这对我来说是一个巨大的问题:( 使用英文Windows XP,英文Firefox,比利时键盘,比利时地图 – 2009-12-11 14:36:31

+3

Firefox的按键效果很好,只需使用通常的'event.which'来获取字符,然后为IE的charCode-in-keyCode行为添加回退,例如'var c ='which'in event?event.which:event.keyCode;' – bobince 2009-12-11 15:26:39

1

那么,如果你的问题是把键码翻译成字符,为什么不让浏览器为你处理呢?这听起来很可怕,但你可以简单地让浏览器修改文本框(这样删除就是删除,而句点是句号),然后返回并编辑它......呃......也许是这样的:

function hookEvents() { 
    $('#myTextBox').oldValue = $('#myTextBox').value; 
    $('#myTextBox').bind('keyup', function(event) { 
     // Maybe nothing's changed? 
     if (event.target.oldValue == event.target.value) { 
      return; 
     } 

     var validInput = /(\-?[0-9]*(?:\.[0-9]*)?)/; 
     var input = event.target.value; 
     var result = validInput.exec(input); 
     if (result.index != 0 || result[result.length-1] != input.length) 
     { 
      event.target.value = result[0]; 
     } 

     // update for later 
     event.target.oldValue = event.target.value; 
    }); 
} 

这种方法最大的问题是每按一次按键都会在屏幕上出现一会儿。另一方面,通过REGEX,您可以更好地控制允许输入的格式。在上面的例子中,我只允许正数或负数(带有一个可选的小数点)。如:“123”,“-123”,“-123.456”,“123.456”。

我知道这并不能真正回答你的问题,但它完全避免了这个问题!

+0

有趣,但正如您所说,角色将首先在文本框中进行设置。这是我不想拥有的东西。 – 2009-12-15 09:38:23