2011-02-10 926 views

Respuesta

67

Con el fin de detectar múltiples teclas lo mantiene pulsado, utilice los keydown y keyup eventos.

var keys = {}; 

$(document).keydown(function (e) { 
    keys[e.which] = true; 
}); 

$(document).keyup(function (e) { 
    delete keys[e.which]; 
}); 

He creado una demostración aquí: http://jsfiddle.net/gFcuU/. Es divertido, aunque noté que mi teclado solo puede detectar 6 teclas.

+1

Bonito script, pude obtener solo 6 claves al mismo tiempo como máximo cuando sus códigos estaban muy separados (2 o más diferencias). PD. ¿Por qué eliminar la clave y no establecerla solo en falso? – jerone

+0

@jerone Supongo que no quería que el objeto se amontone con un historial de todas las claves, y guardará algunas iteraciones en el ciclo 'printKeys'. Pero en la práctica, tienes razón, es una pequeña diferencia. –

+0

También puedo hacer alrededor de 7 teclas, sin embargo, para lo que quiero (teclas de flechas) hay algunas combinaciones que permiten 3 o 2, pero nunca 4 ... interesante – ajax333221

1

No. keypress se disparará por cada tecla individual que se presione, excepto las teclas modificadoras como CTRL, ALT y SHIFT, puede combinarlas con otras teclas, siempre que solo sea una clave más.

47

Depende. Para las teclas "normales", que medios no Shift, Ctrl,ALT, (CMD ), la respuesta es no, el controlador de eventos se pondrá al día/fuego en una cola, uno tras otro.

Para las teclas modificadoras que mencioné anteriormente, hay una propiedad en el objeto de evento.

Ejemplo:

$(document).bind('keypress', function(event) { 
    if(event.which === 65 && event.shiftKey) { 
     alert('you pressed SHIFT+A'); 
    } 
}); 

Jsfiddle demo.

Otros propertys son:

  • event.ctrlKey
  • event.altKey
  • event.metaKey
+0

@jAndy ¿Cuál es 'event.metaKey' para? –

+1

por razones prácticas, es la tecla de Windows/comando (pero ... http://en.wikipedia.org/wiki/Meta_key) – Mauricio

+0

@Jacob, supongo que la tecla de Windows/Mac? Desde w3: "En algunas plataformas, esta clave se puede asignar a un nombre de clave alternativo". –

-1

Como mi GIST expiró (nadie lo estaba usando :() me decidí a actualizar la respuesta con más solución de 2017. Compruebe a continuación.

Puede utilizar mi blog a más de jQuery para detectar accesos directos.

básicamente eventos y de caché conseguir lo se pulsan las teclas en el momento. Si todas las teclas son presionadas se dispara la función.

https://github.com/maciekpaprocki/bindShortcut (expirado!)

Yo Tiene una pequeña explicación sobre cómo usarlo en el archivo Léame. Espero que esto ayude. Comentarios más que apreciados.

Edición 2017:

Es 2017 y que no necesita plugins jQuery para resolver cosas por el estilo.En resumen se necesita algo como esto:

let pressed = {}; 

document.addEventListener('keydown', (event) => { 
    pressed[event.key] = true; 
}); 
document.addEventListener('keyup', (event) => { 
    delete pressed[event.key]; 
}); 

//and now write your code 
document.addEventListener('keydown', (event) => { 
    if(pressed[firstKey]&&pressed[secondKey]){ 
    //dosomething 
    } 
}); 

Los navegadores más antiguos podrían tener algunas peculiaridades, sin embargo a partir de IE9 todo debería funcionar muy bien a excepción de las cantidades marginales de los sistemas operativos que no son compatibles delegación de eventos derecha (super vieja ubuntu etc.) No hay forma de arreglar eso en ellos ya que ese no es el problema del navegador.

Existen algunas peculiaridades en los nuevos Mac conectados a teclas booleanas como, por ejemplo, el bloqueo de mayúsculas.

Leer más: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names_and_Char_values

+1

"Página no encontrada"): –

+0

Sería genial ver algún código. Este enlace roto hace que la respuesta sea obsoleta. –

+0

Desafortunadamente veo que mi esencia fue eliminada. De cualquier manera. El plugin jQuery para algo como esto en 2017 es solo una broma, así que actualizaré la respuesta pronto. Si no me bajaste hasta que lo haga :) –

2

Si lo que desea es disparar un manejador cuando varias teclas se presionan en serie, intente algo como:

jQuery.multipress = function (keys, handler) { 
    'use strict'; 

    if (keys.length === 0) { 
     return; 
    } 

    var down = {}; 
    jQuery(document).keydown(function (event) { 
     down[event.keyCode] = true; 
    }).keyup(function (event) { 
     // Copy keys array, build array of pressed keys 
     var remaining = keys.slice(0), 
      pressed = Object.keys(down).map(function (num) { return parseInt(num, 10); }), 
      indexOfKey; 
     // Remove pressedKeys from remainingKeys 
     jQuery.each(pressed, function (i, key) { 
      if (down[key] === true) { 
       down[key] = false; 
       indexOfKey = remaining.indexOf(key); 
       if (indexOfKey > -1) { 
        remaining.splice(indexOfKey, 1); 
       } 
      } 
     }); 
     // If we hit all the keys, fire off handler 
     if (remaining.length === 0) { 
      handler(event); 
     } 
    }); 
}; 

Por ejemplo, para disparar contra st,

jQuery.multipress([83, 84], function() { alert('You pressed s-t'); }) 
+0

Definitivamente hay mejores soluciones, pero si solo estás presionando teclas para desencadenar código de depuración, etc., es bueno no agregar otra dependencia. –

0

Aquí hay una solución de jQuery basada en La respuesta de Maciej https://stackoverflow.com/a/21522329/

// the array to add pressed keys to 
var keys = []; 
// listen for which key is pressed 
document.addEventListener('keydown', (event) => { 
    if ($.inArray(event.keyCode, keys) == -1) { 
     keys.push(event.keyCode); 
    } 
    console.log('keys array after pressed = ' + keys); 
}); 
// listen for which key is unpressed 
document.addEventListener('keyup', (event) => { 
    // the key to remove 
    var removeKey = event.keyCode; 
    // remove it 
    keys = $.grep(keys, function(value) { 
     return value != removeKey; 
    }); 
    console.log('keys array after unpress = ' + keys); 
}); 
// assign key number to a recognizable value name 
var w = 87; 
var d = 68; 
var s = 83; 
var a = 65; 
// determine which keys are pressed 
document.addEventListener('keydown', (event) => { 
    if ($.inArray(w, keys) != -1 && $.inArray(d, keys) != -1) { // w + d 
    console.log('function for w + d combo'); 
    } else if ($.inArray(s, keys) != -1 && $.inArray(a, keys) != -1) { // s + a 
    console.log('function for s + a combo'); 
    } 
}) 

demostración violín

https://jsfiddle.net/Hastig/us00zdo6/

Cuestiones relacionadas