我有一个 html 表单,其中有很多文本字段,这些文本字段都只包含一个字符(想想填字游戏)。当在输入字段中输入一个字母时,我使用 jQuery 跳转到下一个字母。除了瑞典字符 åäö(其他国际字符也可能受到影响)之外,这种方法工作得很好。
我将事件监听器绑定(bind)到 keyup 事件,并使用 event.keyCode 和 event.which 来确定按下的键是否是字母(如果是任何特殊键,则事件不受影响地传递)。
问题是,当我按 å、ä 或 ö 时,event.keyCode 和 event.which 均为 0。当我在 Firebug 中检查事件对象时,我找不到任何似乎包含键代码的属性.
代码如下所示:
var crossword = $('article.crossword');
crossword.bind('keyup', function(event) {
var target = $(event.target, crossword);
if (target.hasClass('crossword_letter_input')) {
var pressedKey = event.which ? event.which : event.keyCode;
var target_value = target.val();
var target_tabindex;
// Regular alphanumeric keys have keyCodes between 48 and 90.
if (pressedKey >= 48 && pressedKey <= 90 && target_value.length) {
target_tabindex = parseInt(target.attr('tabindex'));
$('input.crossword_letter_input[tabindex=' + (target_tabindex + 1) + ']', crossword).focus();
}
}
});
我使用 keyup 事件来在将字符输入文本字段后移动焦点。
如果您知道任何 jQuery 插件或 vanilla JS 可以完全替代它,那也将是一个解决方案。
编辑:我通过插入以下 else if 进行了临时(且丑陋的)修复:
// å, ä and ö reports keyCode 0 for some reason.
else if (pressedKey === 0 && target_value.length) {
target_tabindex = parseInt(target.attr('tabindex'));
$('input.crossword_letter_input[tabindex=' + (target_tabindex + 1) + ']', crossword).focus();
}
这样,我简单地假设,如果 event.which 和 event.keyCode 均为 0,并且字段中值的长度大于 0,则焦点应移至下一个输入。不过,在不知道的情况下假设事情感觉不太好......
最佳答案
键盘上右侧 alt 的键码为 0。当您键入需要使用此 alt 键的字母时,您会从 ket 代码中得到 0。还有其他键也给出代码 == 0(例如 linux 上 FF 上的 windows 键)
此代码(取自 jquery 示例并进行了一些更改)产生了应该足够的内容:
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.4.4.js"></script>
</head>
<body>
<input id="whichkey" value="type something">
<div id="log"></div>
<script>$('#whichkey').bind('keypress',function(e){
$('#log').html(e.type + ': ' + e.which );
}); </script>
</body></html>
当您输入时,它会被 alt+letter 触发两次 - 一次使用which==0,下一次使用which==正确的字母代码。
例如。
我住的地方 alt+a 产生 ą 并在带有 0 的事件之后的事件中执行正确的代码。 在相同情况下,Keydown 仅发送一次,且代码为 0。
代码:
alt==0
a==97
ą=261
关于按下瑞典键 å、ä 和 ö 时,jQuery event.keyCode 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3865215/