4

私は何が間違っているのですか?関数が呼び出された後、配列がクリアされていないようです。

最初に押すctrl+cctrl+alt+c、2番目の関数は呼び出されません(2回押す場合のみ)。

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

コードの問題は配列ではありません。

アラートウィンドウが表示されたらキーを離したため、キーアップは呼び出されていません

ここで動作している同じコードを確認してください: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 に答える
2

編集:このコードは、表示どおりではありません。Ctrl+CCltrl+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 に答える