4

我究竟做错了什么?调用函数后似乎没有清除数组。

如果您先按ctrl+c然后ctrl+alt+c第二个功能将不会调用(仅当您按第二次时)。

var key = function (keys, fn) {
  var arr = [];
  $(document).on({
    keydown: function (e) {
      arr.push(e.which);
      if (arr.join(', ') === keys) {
        fn(e);
        arr = [];
      }
    },
    keyup: function (e) {
      arr = [];
    }
  });
};

// ctrl + c
key('17, 67', function (e) {
  alert('ctrl+c');
});

// ctrl + alt + c
key('17, 18, 67', function () {
  alert('ctrl+alt+c');
});

这是一个小提琴

4

2 回答 2

2

编辑:这段代码不像出现的那样好。它不会看到和之间的Ctrl+C区别Cltrl+C+V

试试这个代码:

var key = function (keys, fn) {  
  $(document).on({
    keydown: function (e) {
      var arr = [];
      if(e.ctrlKey)
        arr.push("17");
      if(e.altKey)
        arr.push("18");
      arr.push(e.which);
      if (arr.join(', ') === keys) {
        fn(e);        
      }
    }
  });
};

// ctrl + c
key('17, 67', function (e) {
  alert('ctrl+c');
});

// ctrl + alt + d
key('17, 18, 68', function () {
  alert('ctrl+alt+c');
});

您可以在 keydown 事件发生时检查它是否被按下,而不是将按下的键收集到全局数组中。这对我来说很好:http: //fiddle.jshell.net/27WGw/2/请注意,我将 Ctrl+Alt+c 更改为 Ctrl+Alt+d,因为第一个是我机器上的全局热键)

于 2013-01-16T13:32:55.843 回答
2

您的代码中的问题不是数组。

未调用您的 keyup,因为您在看到警报窗口时释放了该键

检查在此处工作的相同代码:http: //jsfiddle.net/WucCQ/1/ - 观看控制台日志

var key = function (keys, fn) {
  var arr = [];
  $(document).on({
    keydown: function (e) {
      arr.push(e.which);
      if (arr.join(', ') === keys) {
        fn(e);
        arr = [];
      }
    },
    keyup: function (e) {
      arr = [];
    }
  });
};

// ctrl + c
key('17, 67', function (e) {
  console.log('ctrl+c');
});

// ctrl + alt + c
key('17, 18, 67', function () {
  console.log('ctrl+alt+c');
});
于 2013-01-16T13:38:16.280 回答