Выполнение комбинаций клавиш с помощью jQuery / JavaScript

Мне любопытно, как я, с помощью следующего кода плагина jQuery, который я пишу в конце этого вопроса, могу реализовать комбинации клавиш. Как это работает до сих пор, это позволяет пользователю создавать ключевые команды, просто выполняя обычный синтаксис, подобный jQuery, и предоставлять событие для ключевой команды, например:

$(window).jkey('a',function(){
   alert('you pressed the a key!');
});

или

$(window).jkey('b c d',function(){
   alert('you pressed either the b, c, or d key!');
});

, и, наконец, то, что я хочу, - это возможность делаю, но не могу понять:

$(window).jkey('alt+n',function(){
   alert('you pressed alt+n!');
});

Я знаю, как это сделать за пределами плагина (при нажатии на клавиатуре установите значение переменной false, а при нажатии на кнопку установите значение переменной true и проверьте, верно ли значение переменной при нажатии другой клавиши) , но я не знаю, как это сделать, если вы не знаете, какие клавиши и сколько будут нажиматься. Как мне добавить эту поддержку? Я хочу, чтобы они могли делать такие вещи, как alt + shift + a или a + s + d + f , если они этого захотят. Я просто не могу понять, как это реализовать. Любые идеи?

Я собираюсь выпустить это как плагин с открытым исходным кодом, и я хотел бы дать всем, кто дает мне право, работать, немного похвалы в сообщении в блоге и в собственном коде. Заранее спасибо!

(function($) {
  $.fn.jkey = function(keyCombo,callback) {
    if(keyCombo.indexOf(' ') > -1){ //If multiple keys are selected
        var keySplit = keyCombo.split(' ');
    }
    else{ //Else just store this single key
        var keySplit = [keyCombo];
    }
    for(x in keySplit){ //For each key in the array...

        if(keySplit[x].indexOf('+') > -1){
            //Key selection by user is a key combo... what now?
        }
        else{
            //Otherwise, it's just a normal, single key command
        }

        switch(keySplit[x]){
            case 'a':
                keySplit[x] = 65;
                break;
            case 'b':
                keySplit[x] = 66;
                break;
            case 'c':
                keySplit[x] = 67;
                break;
            //And so on for all the rest of the keys
        }
    }
    return this.each(function() {
        $this = $(this);
        $this.keydown(function(e){
            if($.inArray(e.keyCode, keySplit) > -1){ //If the key the user pressed is matched with any key the developer set a key code with...
                if(typeof callback == 'function'){ //and they provided a callback function
                    callback(); //trigger call back and...
                    e.preventDefault(); //cancel the normal
                }
            }
        });
    });
  }
})(jQuery);
7
задан Oscar Godson 18 June 2011 в 01:00
поделиться