确定按下的键是否在提供的数组中

时间:2011-12-14 09:44:47

标签: javascript jquery

我的代码类似于:

$("#some-input").keyup(function (event) {
  var availableKeys = [".", ",", ";"];
  var key = String.fromCharCode(event.which);
  if (availableKeys.indexOf(key) != -1) {
    alert("Derp");
  }
});

然而它并没有像我预期的那样奏效。 event.which / fromCharCode组合在数字或字母(大写字母)上正常工作,这是正确的行为,因为(我认为)事件键码与字符集条目不同。

除了直接指定用于比较的密钥代码(保持字符数组是优先级)之外,还有其他解决方法吗?

6 个答案:

答案 0 :(得分:4)

尝试更改阵列以包含您要检查的键的键码:

$("#some-input").keyup(function(event) {
    var availableKeys = [190, 188, 59]; // ".", ",", ";"
    if (availableKeys.indexOf(event.which) != -1) {
        alert("Derp");
    }
});

Example fiddle here

Here's a full list of keycodes

修改
经过一些调查后看来你的方法应该可行,但String.fromCharCode的实现是有缺陷的 - 至少对于符号键是这样。按下.会返回正确的keyCode 190,当你通过fromCharCode运行时,你会得到字符串¾[#等其他键表现出类似的行为。我认为这是由于国际化,也许其他人可以确认。

答案 1 :(得分:3)

您可以使用keypress代替。像

$("#some-input").bind('keypress', function(e) {
    var availableKeys = [".", ",", ";"];

    if(availableKeys.indexOf( String.fromCharCode( e.which ) ) > -1 ) {
        alert('Derp');
    }
});

答案 2 :(得分:1)

在我看来,您应该尝试使用charCodeAt在比较时将密钥转换为密钥代码。例如:

alert (".".charCodeAt(0)); // alerts 46

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/charCodeAt

答案 3 :(得分:0)

这很可能是与获取密钥/字符代码的方式有关的问题。尝试获取char / key代码,如:

var code = (event.charCode != 0) ? event.charCode : (event.keyCode != 0 ? event.keyCode : event.which);
var key = String.fromCharCode(code);

在代码的任何其他部分找不到任何问题。

答案 4 :(得分:0)

这不起作用,因为您在'中使用key作为separator之一,并且在数组中也使用char .,因此它会使程序混淆,否则它会为{{1}工作}和;。 [“。”“;”]。它考虑了4个不同的元素。 使用belwo代码:

$("#some-input").keypress(function (event) {
 var availableKeys = ",.;";
  var key = String.fromCharCode(event.which);
  if (availableKeys.indexOf(key) != -1) {
    alert("Derp");
  }
});

小提琴:http://jsfiddle.net/AVcrw/1/

答案 5 :(得分:0)

您可以使用underscore.js

$("#some-input").bind('keypress', function(event) {
        var aKeys = [13, 32];

        if ( _.contains(aKeys, event.which) ) {
            console.log("char :"  + event.which);
        }
});