我有一个带有大量文本字段的html表单,所有文本字段都只占用一个字符(想想填字游戏)。当在输入字段中输入字母时,我使用jQuery跳转到下一个字母。这种方法很好,除了瑞典字符åäö(其他国际字符也可能受到影响)。
我将一个事件监听器绑定到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,那也是一个解决方案。
编辑:如果出现以下情况,我已经通过插入以下内容进行了临时(并且丑陋)修复:
// å, ä 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,则焦点应该移动到下一个输入。假设不知道的东西虽然感觉不好......
答案 0 :(得分:1)
jQuery会自动将event.keyCode
和event.which
规范化为event.which
,因此您可能会因event.keyCode
上的重新规范化而丢失某些内容。请查看jQuery的event.which API文档页面上的示例,该页面将显示输入字符的关键代码。
答案 1 :(得分:1)
您经常提到的字符需要输入两次按键。这确实使按键检测成为问题。因此,不是专注于按下的键,而是通过直接查看输入字段中的值来查看按键的副作用呢?
$('input')
.bind('keyup', function (e) {
var t = $(this), // the current input element
value = t.attr('value'),
new_value = value.slice(-1); // last char only (if any)
t.attr('value', new_value);
t.select(); // highlight the text of current element
// or jump to the next... whatever you want
})
// optional select on focus to make things consistent if you .select() above
.bind('focus', function () {
$(this).select();
});
答案 2 :(得分:1)
键盘右键的键码为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 +字母两次 - 一次使用== 0,然后使用==正确的字母代码。
例如
我居住的地方alt + a生成±并在0之后的事件中输入正确的代码。 在同样的情况下,Keydown只用0代码发送一次。
代码:
alt==0
a==97
ą=261