Jquery按键事件排除:{某物}

6

除了某些操作或仅某些操作之外,jQuery或Javascript是否有处理按钮按下的快捷方式(实际上是一个函数),例如:

$(input).keypress('nonfunctional' function(){ 
  // do something
});

这将只在按下[a-z][0-9]按钮时触发,忽略单个shiftctrl,但处理shift+a = >按下A?

P.S.我知道if(key.code == 123)然后...

6个回答

10
不,如果您想要排除特定的键,那就需要使用 event.keyCode 或者 event.which 属性。请注意保留原有的 HTML 标记。

2
或者您可以扩展jQuery keypress。我猜应该是这样的:
$.fn.keypressBut = function(codes, callback) {
    $(this).keypress(function(e) {
        ~$.inArray(e.keyCode, codes) || callback.call(this, e);
    });
}

// Lets ignore Enter and Space
$('input').keypressBut([13, 32], function(e) {
    alert(e.keyCode);
})

2
您可以这样做:
  1. 通过一个函数来扩展jquery的fn属性,该函数接受参数如下:

    • 一些数据
    • 回调函数
  2. 编写一个验证函数,其中包括以下步骤:

    • 将keyCode转换为字符串
    • 与正则表达式匹配
    • 如果按下了shift键
      • 将其转换为大写字母
    • 检查是否满足其他条件,例如按下Ctrl/Alt键等。
    • 返回结果。
  3. 如果验证成功
    • 执行回调函数

在代码中,可以这样实现:

  $.fn.selectedKey = function (cb, data) {
      def.call(data, {
          ctrlKey: 2, //0: musn't be pressed, 1: must be pressed, 2: both.
          altKey: 2, // "
          invert: 0, //inverts the filter
          filter: /.*/, // A Regular Expression, or a String with a Regular Expression
          preventDefault: false //Set to true to prevent Default.
      }); //Sets the default Data for the values used,

      function validate(e) {
          var key = e.char = String.fromCharCode(e.keyCode || e.which); // Converts the pressed key to a String
          if (e.shiftKey) key = key.toUpperCase(); //Handles Case Sensitivity.
          var exp = new RegExp(e.data.filter.replace(/\\\\(\d)/g, String.fromCharCode("$1"))); //Creates a new RegExp from a String to e.g. allow "\2" to match the keyCode 2
          var c = !! (e.data.ctrlKey ^ e.ctrlKey ^ 1 > 0); //c == true if the above stated conditions are met e.g Ctrl Key Pressed and `ctrlKey == 1` -> true
          var a = !! (e.data.altKey ^ e.altKey ^ 1 > 0); //e.g Alt Key Pressed and `altKey == 0` -> false
          return (exp.test(key) && (c && a)); //Returns the validation Result
      }

      function def(obj) { //a minimal helper for default values
          for (var prop in obj) {
              this[prop] = this[prop] || obj[prop];
          }
      }
      this.keypress(data, function (e) {
          if (e.data.preventDefault) e.preventDefault();
          if (validate(e) != e.data.invert) cb(e); //Calls the callback function if the conditions are met
      });
  };

你可以使用以下方式:
通过正则表达式。
  $("body").selectedKey(function (e) {
      console.log("All lower characters Numbers and 'A': " + e.char);
  }, {
      filter: /[a-z]|[0-9]|A/,
      ctrlKey: 2,
      altKey: 2
  });

如果按下任何[a-z]或[0-9]或Shift键+A,则会触发此操作,无论ctrl和alt的状态如何

或者是按键代码

  $("body").selectedKey(function (e) {
      // do somet
      console.log("KeyCode 2 " + e.char);
  }, {
      filter: "\\2", //Ctrl + b
      ctrlKey: 1,
      altKey: 2
  });

如果按下ctrl + b,将会触发此操作。

您还可以将它们组合使用。

这是一个示例,在JSBin上进行调试。


1

如果您不想编写大量的if语句来检测按下的键码,那么有一个使用类和正则表达式过滤按键的jQuery插件,它被称为keyfilter。以下是一个示例:

$(selector).keyfilter(/[a-z]/);

1
例如,下面的函数只允许输入数字,并使用keydown事件处理这些函数。
function OnlyNumbers(event) {
    if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 || (event.keyCode == 65 && event.ctrlKey === true) || (event.keyCode >= 35 && event.keyCode <= 39)) { return; }
    else { if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) { event.preventDefault(); } }
}

0

你尝试过 event.altKey/event.shiftKey/event.ctrlKey 吗?


虽然这可能是一个值得尝试的好方法,但它并没有提供问题的解决方案。下次,把这个作为评论而不是答案可能更合适。 - RobSiklos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接