aunque la consideré, yo no lo elegería la opción de accesskey porque cada navegador requiere una combinación distinta y la idea es que puedas usar tu propia combinación de teclas. por otra parte accesskey solo funciona con elementos que pueden recibir el foco (input, textarea, a, button).
de momento tengo un código un tanto simple para agregar accesos directo (hotkey o shortcut) pero tengo que seguir elaborandola para soportar una gama de posibilidades de combinaciones. la idea es que te sirva de inicio. por ahora solo funciona para hacer combinaciones con CTRL, ALT, y SHIFT con un caracter alfanumérico.
Código:
var Handler = {
add: function(elem, event, handler, capture){
try{
elem.addEventListener(event, handler, capture);
} catch(error){
elem.attachEvent('on' + event, handler);
}
},
remove: function(elem, event, handler, capture){
try{
elem.removeEventListener(event, handler, capture);
} catch(error){
elem.detachEvent('on' + event, handler);
}
},
addHotkey: function(keys, action){
var modifiers = keys.toLowerCase().match(/\b\w{2,}\b/g), key = keys.toUpperCase().match(/\b\w\b/);
Handler.add(document, "keydown", function(evt){
for(var i = 0; modifiers && i < modifiers.length; i++) if(!evt[modifiers[i]+"Key"])return;
if(key && evt.keyCode != key[0].charCodeAt(0))return;
action(evt);
}, false);
}
} // Handler;
/* Argumentos:
** string keys: la combinación de teclas a registrar.
** function action: función o método a invocar para la combinación.
*/
// ejemplo de uso;
Handler.addHotkey("CTRL + ALT + SHIFT + I", function(){alert("funcion que se invoca con el hotkey agregado");});
aclarar algunos detalles. todos los hotkeys se registran en el objeto
document con el evento keydown. de modo que no importa donde este situado el foco, el hotkey siempre estará disponible. el formato del argumento
keys consiste en separar cada tecla con algún caracter no alfanumérico a excepción del guión bajo (underscore: _). por ejemplo, "Ctrl G", "Shift+U", "Alt|E". la función asignada al segundo parametro recibirá como argumento el objeto event en caso de necesitarlo.