Jquery keypress除了:{something}

时间:2013-01-22 13:39:01

标签: javascript jquery

jQuery或Javascript中是否有任何快捷方式(实际上是一个函数)来处理按钮按下除了某些东西,或者只有某些东西,例如:

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

仅在按下[a-z] [0-9]按钮时触发并忽略单shiftctrl但处理shift+a =>压了?

P.S.i确实知道if(key.code == 123)然后...

6 个答案:

答案 0 :(得分:10)

不,如果您要排除event.keyCode / event.which属性所针对的特定密钥。

答案 1 :(得分:2)

或者你可以扩展jquery按键。我猜是这样的事情:

$.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 :(得分:2)

您可以执行类似

的操作
  1. 使用带有参数的函数扩展jquerys fn属性

    • 一些数据
    • 回调函数
  2. 编写验证函数

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

  4. 在代码网站上,这可能是

      $.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上的一个示例,用来摆弄。

答案 3 :(得分:1)

如果你不想编写一个大的if语句来检测按下的密钥代码,它有一个jQuery插件,用于使用类和正则表达式来过滤按键,它被称为keyfilter。一个例子是

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

答案 4 :(得分: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(); } }
}

答案 5 :(得分:0)

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