shortcut.js 1.96 KB
define("shortcut", ['jquery'], function() {
    var Keys = function() {
        var ret = {
            MODIFIER_KEYS: {
                16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta'
            },
            PRINTABLE_KEYS: {
                83: 's', 85: 'u', 67: 'c', 86: 'v'
            }
        };
        var name, modifierKeycode, printableKeycode;

        for( modifierKeycode in ret.MODIFIER_KEYS) {
            name = ret.MODIFIER_KEYS[modifierKeycode].toLowerCase();
            ret[name] = parseInt(modifierKeycode, 10);
        }

        for( printableKeycode in ret.PRINTABLE_KEYS) {
            name = ret.PRINTABLE_KEYS[printableKeycode].toLowerCase();
            ret[name] = parseInt(printableKeycode, 10);
        }

        return ret;
    }();

    var uid = 0;
    var ShortCut = function(options) {
        var container = options.container || document;
        var shortcuts = options.shortcuts || {};

        $(container).on('keydown.shortcut'+(uid++), function(e) {
            var ctrl = e.ctrlKey && 'ctrl+' || '',
                alt = e.altKey && 'alt+' || '',
                keyString = keyCodeToString(e.keyCode);

            var shortcut = ctrl + alt + keyString;
            var shortcutObj = shortcuts[shortcut];

            if(!shortcutObj) return;
            if(shortcutObj.preventDefault) {
                e.preventDefault();
            }

            return shortcutObj.handler.call(null, e);
        });
    };

    function keyCodeToString (keyCode) {
        var keyString = Keys[keyCode];
        if (typeof keyString != "string")
            keyString = String.fromCharCode(keyCode);
        return keyString.toLowerCase();
    }

    return {
        /**
         * options => {
         *  container: 快捷键容器
         *  shortcuts: {
         *      shortcut: "ctrl+s",
         *      handler: function() {}
         *  }
         * }
         */
        init: function(options) { 
            return new ShortCut(options);
        }
    }
});