【问题标题】:Detect decimal (dot) key from numeric keypad从数字键盘检测十进制(点)键
【发布时间】:2010-07-13 09:21:14
【问题描述】:

我需要检测用户是否按下了数字键盘中的点键。我已经编写了适合我的初稿:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title></title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript"><!--
(function($){
    var knownCodes = [
        [110, 46], // Firefox, IE, Chrome
        [78, 46] // Opera
    ];
    var pressedCodes = [null, null];

    $.fn.comma = function(){
        this.live("keydown", function(e){
            pressedCodes = [e.which, null];

        }).live("keypress", function(e){
            pressedCodes[1] = e.which;

            for(var i=0, len=knownCodes.length; i<len; i++){
                if(pressedCodes[0]==knownCodes[i][0] && pressedCodes[1]==knownCodes[i][1]){
                    $("#log").append("<li>Decimal key detected</li>");
                    break;
                }
            }
        });

        return this;
    };
    $(function(){
        $('<ol id="log"></ol>').appendTo("body");
    });
})(jQuery);

jQuery(function($){
    $(".comma input:text, .comma textarea").css("border", "1px solid black").comma();
});
//--></script>
</head>
<body>

    <form action="" method="get" class="comma" size="20">
        <p><input type="text"></p>
        <p><textarea rows="3" cols="30"></textarea></p>
    </form>

</body>
</html>

但是,我只能在带有西班牙语键盘的 Windows XP 机器中对其进行测试。我的问题是:

  1. e.which 读取是否安全?我使用它是因为e.keyCodee.charCode 在至少一个浏览器中返回undefined

  2. 操作系统会以某种方式影响这些数字代码还是只是浏览器的东西?

  3. 这些代码是否取决于键盘布局?


背景信息:我找不到remap numeric keypad 的 jQuery 插件,所以我正在编写自己的。

更新

我会解释我的确切需求。带有数字小键盘的西班牙语键盘具有. 键。但是,西班牙语的小数点分隔符是,。这使得在 Web 应用程序中键入数字很烦人。某些桌面应用程序(例如 MS Excel)会重新映射此键,以便插入逗号。我正在尝试模仿。

我已经改编了一个小脚本,我一直在使用它来将其发布到这里。这就是我获得 knownCodes 数组值的方式:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title></title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript"><!--
(function($){
    $.fn.showKeyCodes = function(){
        var log = function(e){
            $("<li></li>").text(e.type + "(): [keyCode, charCode, which]=[" + e.keyCode + ", " + e.charCode + ", " + e.which + "]").appendTo("#log");
        }

        this.live("keydown", function(e){
            log(e);

        }).live("keypress", function(e){
            log(e);

        }).live("keyup", function(e){
            log(e);

        });

        return this;
    };
    $(function(){
        $('<ol id="log"></ol>').appendTo("body");
    });
})(jQuery);

jQuery(function($){
    $(".showKeyCodes input:text, .showKeyCodes textarea").css("border", "1px solid black").showKeyCodes();
});
//--></script>
</head>
<body>

    <form action="" method="get" class="showKeyCodes" size="20">
        <p><input type="text"></p>
        <p><textarea rows="3" cols="30"></textarea></p>
    </form>

</body>
</html>

在您的数字小键盘中键入. 键(或在您的键盘布局中替换它的任何键)以及与字母小键盘中相同字符对应的键。目标是检测您点击了第一个而不是第二个。

【问题讨论】:

  • 旁注:我希望你不需要这个键来做事,因为我的键盘没有数字小键盘:) apple.com/keyboard
  • 我希望它插入一个逗号,这是西班牙语中有效的小数分隔符。如果您没有键盘,那么您就没有我要解决的问题 :)
  • 46 是 DEL 键码。这就是在没有数字锁定的情况下按下数字键盘中的点时得到的结果。

标签: javascript jquery keyboard


【解决方案1】:

从 e.which 读取是否安全?

通常在 IE 中没有,你只会得到 keyCode(虽然在 keypress 它实际上是字符代码而不是键代码)。您的代码可以读取which,因为在幕后jQuery 将keyCode 值复制到IE 上的which。如果没有 jQuery,您需要属性嗅探代码来知道选择哪一个。 (您不能总是在 keypress 上阅读 keyCode,因为不能保证会提供它,它在 Firefox 上是 0。)

请注意,我不想检测字符:我想检测键。

你不能在keypress 中这样做,它只会给你一个字符代码(46,. 的 ASCII)。您将不得不捕获keydown,这使您可以访问真正的密钥代码(在keyCode 属性中,以及在不是IE 的浏览器中,在which 中)。

为数字键盘 ./, 按钮报告的 keyCode 是 110(小写 N 的 ASCII)。除了在 78 位的歌剧中,ASCII 表示大写 N,因此与按下 N 按钮没有区别。

因此,您可以声明keydown 事件并在按下键 110 或 78 时存储一个标志,然后声明 keypress。如果设置了最后一个keydown 的标志并且which (charCode) 属性为46,则return false 以防止按键通过,然后在焦点处插入,。 (不过,如果同时按下多个键并进行自动重复,这不太可靠。)

请注意,在焦点处插入一个字符本身并不简单;在这里查看许多以前的问题。您需要 IE (document.selection.createRange().text=...) 和其他现代浏览器的分支代码(根据 selectionStart/selectionEnd 更改输入的 value)。较旧的移动浏览器或小众浏览器可能不支持任何一种编辑方法,因此请检测这些属性的缺失,如果无法做到,请不要使用键盘。

操作系统会以某种方式影响这些数字代码还是只是浏览器的东西? 这些代码是否取决于键盘布局?

一般来说是的,但不会以某种方式影响您。关键事件通常仍然是跨浏览器、跨键盘和跨平台的巨大变化;如果可以,最好避免使用它们。

我个人认为,对于像西班牙语的小数点小数点这样的错误键盘布局选择,正确的解决方案是使用 MSKLC 修改布局。

【讨论】:

    【解决方案2】:

    您的代码对我没有任何作用,所以我想说它可能确实取决于键盘布局。快速检查确认我的芬兰 qwerty 键盘上的输出是键码 44,而不是预期的 46。

    【讨论】:

    • 嗯...我用普通的逗号键得到[keyCode, charCode, which]=[0, 44, 44]。您的 Finish 键盘是否有逗号键?
    • Keydown: 110,0,110 用于小键盘,188, 0, 188 用于普通逗号。在按键中:小键盘和普通逗号都为 44,44,44
    【解决方案3】:

    在问了这个问题一段时间后,我终于找到了一个可以做到这一点的 jQuery 插件:numpad-decimal-separator

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      相关资源
      最近更新 更多