2012-03-31 19 views

Respuesta

3

Utilice una matriz booleana global var keys = [] para comprobar si se pulsa una tecla. A continuación, utilice la siguiente función para añadir una tecla de acceso directo mundial:

window.addGlobalHotkey = function(callback,keyValues){ 
    if(typeof keyValues === "number") 
     keyValues = [keyValues]; 

    var fnc = function(cb,val){ 
     return function(e){ 
      keys[e.keyCode] = true; 
      executeHotkeyTest(cb,val); 
     };   
    }(callback,keyValues); 
    window.addEventListener('keydown',fnc); 
    return fnc; 
}; 

Como se puede ver que añade una nueva escucha al evento 'keydown'. Este oyente primero establecerá el valor correspondiente en keys verdadero y luego ejecutará una prueba, si el keyValues dado es actualmente verdadero. Tenga en cuenta que no puede eliminar keys[e.keyCode] = true y ponerlo en otro oyente porque esto podría dar como resultado una orden de devolución de llamada incorrecta (primero la prueba de tecla de acceso rápido, y luego la asignación de teclas). El executeHotkeyTest en sí es muy fácil también:

window.executeHotkeyTest = function(callback,keyValues){ 
    var allKeysValid = true; 

    for(var i = 0; i < keyValues.length; ++i) 
     allKeysValid = allKeysValid && keys[keyValues[i]]; 

    if(allKeysValid) 
     callback(); 
}; 

Por último hay que añadir otro oyente a keyup para limpiar las teclas liberados de keys.

window.addEventListener('keyup',function(e){ 
    keys[e.keyCode] = false; 
}); 

Ahora puede agregar una tecla de acceso directo a ctrl + x + introducir mediante el uso de addGlobalHotkey(callback,[13,17,88]):

addGlobalHotkey(function(){ 
    document.body.appendChild(
     document.createElement('div').appendChild(
      document.createTextNode('Ctrl + x + Enter down') 
    ).parentNode); 
},[88,13,17]); 

JSFiddle demo

En lugar de añadir un oyente para cada tecla de acceso directo se puede utilizar un mundial [[callback1,values1],[callback2,values2],...] matriz.

Nota importante: en IE versión anterior 9 tiene que usar attachEvent en lugar de addEventListener. Como ya está utilizando jQuery, puede usar .on(...) o .keydown.

3

Usted puede utilizar la propiedad ctrlKey de la clave de objeto de prensa evento

$(document).keypress(function(e) { 
    if(e.ctrlKey) { 
     // do code to test other keys 
    } 
}); 

también se desplazan, teclas alt reservada tienen propiedades, pero la tecla enter tiene keyCode 13.

¿Hay alguna razón que pueda para probar una combinación diferente, por ejemplo ctrl-alt-x? La tecla Intro generalmente se reserva para activar envíos de formularios y otros eventos en una página web.

+0

I vea que tal vez haya un problema con el combo ctrl-return, especialmente con el navegador cruzado; lea más aquí: http: // stackoverflow. com/questions/3532313/jquery-ctrlenter-as-enter-in-text-area –

2
$("body").bind("keydown",keyDown); 

function keyDown(e){ 
    if((e.ctrlKey)&&(e.keyCode == 88)&&(e.keyCode == 13)){ 
     alert("Keys down are Ctrl + x + Return"); 
    } 
} 
5

Puede encontrar que el uso de KeyboardJS es una mejor solución. Es fácil de usar.Aquí están docs;

KeyboardJS.on('ctrl + x + enter', function() { 
    //do stuff on press 
}, function() { 
    //do stuff on release 
}); 

Además, si desea forzar pulsando Ctrl antes de que X o introduzca usted puede hacer esto en vez

KeyboardJS.on('ctrl > x + enter', function() { 
    //do stuff on press 
}, function() { 
    //do stuff on release 
}); 

http://robertwhurst.github.com/KeyboardJS/

+0

Probé con las teclas rápidas jquery y la ratonera y ninguna de las dos funcionó ... Parece que no se han actualizado desde hace tiempo. ¡Esto ha sido actualizado recientemente y funciona! – Chris

1

simplemente escribir así:

document.getElementById('yourelementid').onkeydown = function(){ 
     if(event.ctrlKey===true && event.keyCode==88){ 
      //your code goes here 
     } 
    } 
//no depedency needs. pretty straight-forward 
Cuestiones relacionadas