我需要检测用户是否按下了数字键盘中的圆点键。我写了这篇适合我的第一稿:
<!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盒子中测试它。我的问题是:
从e.which
读取是否安全?我正在使用它,因为e.keyCode
和e.charCode
至少在一个浏览器中返回undefined
。
操作系统是否以某种方式影响这些数字代码,或者它只是浏览器的东西?
这些代码是否取决于键盘布局?
背景信息:我找不到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>
在数字小键盘中键入.
键(或键盘布局中替换它的任何键)以及与字母键盘中相同字符对应的键。目标是检测到您点击了第一个而不是第二个。
答案 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
的标记且which
(charCode
)属性为46,return false
以阻止按键通过,然后插入{{1而是在焦点处。 (如果同时按下多个键并继续自动重复,则这不太可靠。)
请注意,在焦点处插入角色本身并不重要;在这里看到许多以前的问题您需要IE(,
)和其他现代浏览器的分支代码(根据document.selection.createRange().text=...
/ value
更改输入selectionStart
)。较旧的,移动的或利基浏览器可能不支持任何一种编辑方法,因此请检测缺少这些属性,如果不能这样做,请单独使用键盘。
操作系统是否以某种方式影响这些数字代码,或者它只是浏览器的东西? 这些代码是否取决于键盘布局?
一般来说是的,虽然不是会影响到你的方式。关键事件通常仍然是跨浏览器,跨键盘和跨平台的巨大变化;如果可以,最好避免使用它们。
就我个人而言,我认为正确解决一个糟糕的键盘布局选择,如西班牙语的小数位小数点将是使用MSKLC修改布局。
答案 1 :(得分:1)
你的代码在我的最后没有做任何事情,所以我想它可能确实取决于键盘布局。快速检查确认我的芬兰qwerty键盘上的输出是键码44,而不是预期的46。
答案 2 :(得分:1)
在问了这个问题后的一段时间,我终于找到了一个jQuery插件,它正是这样做的:numpad-decimal-separator