JavaScript中的keycode不等于charcode

6

我正在使用jQuery绑定keydown事件,以允许在文本框中输入特定字符。我正在尝试使我的代码跨浏览器和平台兼容。我的主要问题是,我找不到一种方法将接收到的键码映射到有效的字符码,特别是来自数字键盘的键码(小数分隔符,逗号还是句号等)。

3个回答

6

没错,你无法进行这样的映射;keydown 甚至可能不对应任何插入字符。或者大写锁定键可能会改变按键的含义,并且你无法嗅探到它。还有其他一些问题

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


这也是我的结论。不过,根据http://www.quirksmode.org/js/keys.html的说法,Firefox似乎没有正确处理keypress事件。我在这个问题上有点困惑:-/ - Fabian Vilers
关于按键事件,还有一件事情需要注意,我发现句点和删除键(不是退格键)的代码是相同的:46。这对我来说是一个很大的问题 :(使用英文版的Windows XP操作系统,在英文版的Firefox浏览器下,使用比利时键盘和比利时键位映射。 - Fabian Vilers
3
Firefox的按键处理很好,只需使用通常的event.which来获取字符。然后为IE的charCode-in-keyCode行为添加回退。例如:var c= 'which' in event? event.which : event.keyCode; - bobince
还有很多键也有奇怪的键码。我不太确定你想做什么,但如果是数字验证,键盘事件并不适合这样做。 - bobince
我正在尝试过滤文本框中的输入,只允许一组字符。目前,我正在处理数字过滤器(允许负数和/或小数)。Bobince,欢迎任何更好的方法 :) - Fabian Vilers
"onchange" 是传统的过滤位置,因此您可以键入任何内容,但是当您取消焦点时,它会更新。否则,您可能会遇到问题,例如无法键入句点,因为验证正则表达式不允许有尾随句点。而且,按键过滤无法阻止其他形式的编辑,例如复制粘贴、拖放、右键撤消等。 - bobince

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

这种方法最大的问题是每个按键都会在屏幕上出现一段时间。另一方面,使用正则表达式可以更好地控制允许输入的格式。在上面的示例中,我只允许输入正数或负数(带有可选的小数点)。例如:“123”,“-123”,“-123.456”,“123.456”。
我知道这并没有真正回答你的问题,但它完全绕过了这个问题!

有趣,但正如你所说,字符将首先出现在文本框中。这是我不想要的。 - Fabian Vilers

1

就像我在评论中所说的那样,这个问题的目标是过滤文本框中的数字值。我使用了keypress事件来实现我的目标。

我已经发布了一个jQuery插件,供那些对解决方案感兴趣的人使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接