当按下瑞典键å,ä和ö时,jQuery event.keyCode为0

时间:2010-10-05 15:32:23

标签: jquery internationalization keyboard-events

我有一个带有大量文本字段的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,则焦点应该移动到下一个输入。假设不知道的东西虽然感觉不好......

3 个答案:

答案 0 :(得分:1)

jQuery会自动将event.keyCodeevent.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