从数字键盘检测十进制(点)键

时间:2010-07-13 09:21:14

标签: javascript jquery keyboard

我需要检测用户是否按下了数字键盘中的圆点键。我写了这篇适合我的第一稿:

<!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. 这些代码是否取决于键盘布局?


  4. 背景信息:我找不到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>
    

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

3 个答案:

答案 0 :(得分:3)

  

从e.which读取是否安全?

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

  

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

你不能在keypress中这样做,它只给你一个字符代码(46,.的ASCII)。相反,您必须捕获keydown,这样您就可以访问keyCode属性中的真实密钥代码,以及which中非IE的浏览器。 / p>

针对数字小键盘keyCode / .按钮报告的,为110(小写N的ASCII)。除了歌剧,它是78,ASCII为大写N,因此无法区别于按N按钮。

因此,您可以声明keydown事件并在按下键110或78时存储标记,然后声明keypress。如果设置了上一个keydown的标记且whichcharCode)属性为46,return false以阻止按键通过,然后插入{{1而是在焦点处。 (如果同时按下多个键并继续自动重复,则这不太可靠。)

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

  

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

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

就我个人而言,我认为正确解决一个糟糕的键盘布局选择,如西班牙语的小数位小数点将是使用MSKLC修改布局。

答案 1 :(得分:1)

你的代码在我的最后没有做任何事情,所以我想它可能确实取决于键盘布局。快速检查确认我的芬兰qwerty键盘上的输出是键码44,而不是预期的46。

答案 2 :(得分:1)

在问了这个问题后的一段时间,我终于找到了一个jQuery插件,它正是这样做的:numpad-decimal-separator