【问题标题】:jQuery event.keyCode 0 when Swedish keys å, ä and ö are pressed按下瑞典键 å、ä 和 ö 时的 jQuery event.keyCode 0
【发布时间】:2010-10-05 15:32:23
【问题描述】:

我有一个包含很多文本字段的 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,那也是一个解决方案。

编辑:我通过插入以下 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,那么焦点应该转移到下一个输入。假设不知道的东西虽然感觉不太好......

【问题讨论】:

    标签: jquery internationalization keyboard-events


    【解决方案1】:

    键盘上右 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
    

    【讨论】:

    • 绝对精彩!谢谢!
    • Mike McCaughan 首先提出了建议,但他认为这并不乐观。我只知道代码必须以某种方式发送,但可能是一些事件限制阻止它在按下 alt ws 时被 jquery 触发。
    【解决方案2】:

    jQuery 自动将event.keyCodeevent.which 规范化为event.which,所以你可能会因为重新规范化event.keyCode 而丢失一些东西。看看 jQuery 的 API 文档页面上event.which 的示例,它将显示输入字符的关键代码。

    【讨论】:

    • 感谢您的链接。我尝试了演示,但在那里得到了相同的结果。当我按 å、ä 或 ö 键时,我得到“keydown:0”。 :(
    • 嗯。您可能会尝试捕获keypress 事件而不是keyup,但它看起来并不乐观。有关浏览器如何识别键盘事件的有趣调查,请参阅 unixpapa.com/js/key.html。似乎大多数浏览器在这一点上不处理除了 ASCII 键码以外的任何东西。 Unicode 代码点出现在 DOM Level 3 事件规范中,但没有发布的浏览器完全实现这些。 IE9 beta 最接近 (!)。
    • 这确实是个坏消息......我会在这个问题上悬赏一段时间,以防万一有人有任何解决方法......
    【解决方案3】:

    您经常提到的字符需要输入两次按键。这确实使按键检测有问题。因此,与其专注于按下的键,不如通过直接查看输入字段中的值来查看按键的副作用?

    $('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(); 
        });
    

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 2011-07-28
      • 2020-08-03
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 2013-02-26
      相关资源
      最近更新 更多