2010-03-15 18 views
86

Me gustaría detectar un evento de clic con jQuery y ser capaz de decir si se presionó una tecla al mismo tiempo, así puedo pasar a la función de devolución de llamada en función del evento de pulsación de tecla.¿Cómo puedo verificar si se presiona una tecla durante el evento click con jQuery?

Por ejemplo:

$("button").click(function() { 
    if([KEYPRESSED WHILE CLICKED]) { 
     // Do something... 
    } else { 
     // Do something different... 
    } 
}); 

Es esto posible en absoluto o cómo se puede hacer esto si es posible?

Respuesta

42

Necesitas un seguimiento por separado el estado de la clave utilizando keydown() y keyup():

var ctrlPressed = false; 
$(window).keydown(function(evt) { 
    if (evt.which == 17) { // ctrl 
    ctrlPressed = true; 
    } 
}).keyup(function(evt) { 
    if (evt.which == 17) { // ctrl 
    ctrlPressed = false; 
    } 
}); 

Véase el list of key codes. Ahora puede verificar que:

$("button").click(function() { 
    if (ctrlPressed) { 
    // do something 
    } else { 
    // do something else 
    } 
}); 
+5

Una cosa negativa de este método (no que yo sepa una mejor manera) es si se está detectando la tecla ALT, y el usuario ALT-aquí a otra ventana, luego el navegador no detecta el evento de keyup porque ocurrió en otra aplicación. A partir de ese punto, jquery piensa que la clave está desactivada, hasta que se configuran en tu aplicación jquery. Esto solo importa con la tecla ALT, hasta donde puedo imaginar. – Ben

+1

Para Mac OS X que sería Cmd-Tab, pero creo que el principal todavía tiene – murftown

+0

o Ctrl + Tab para cambiar la pestaña del navegador – Seeven

152

Puede detectar fácilmente las teclas shift, alt y control desde las propiedades del evento;

$("button").click(function(evt) { 
    if (evt.ctrlKey) 
    alert('Ctrl down'); 
    if (evt.altKey) 
    alert('Alt down'); 
    // ... 
}); 

Ver quirksmode para más propiedades. Si desea detectar otras claves, consulte cletus's answer.

+3

No veo esa propiedad en el objeto Evento jQuery: http: //api.jquery. com/category/events/event-object/ – cletus

+1

Bueno, como dice la página, "La mayoría de las propiedades del evento original se copian y se normalizan para el nuevo objeto de evento". ctrlKey, altKey, etc. son parte del estándar ecmascript (ver el primer enlace en la página de API de jquery antes mencionada), así que (al menos en buscadores decentes) el objeto de evento generalmente también tiene esas propiedades establecidas. – kkyy

+3

El modo Quirks solo dice que estos están definidos * en * un evento clave ... sin mencionar un evento de mouse. –

4

pude utilizarlo con JavaScript sola

<a href="" onclick="return Show(event)"></a> 

    function Show(event) { 
      if (event.ctrlKey) { 
       alert('Ctrl down'); 
      } 
    } 
Cuestiones relacionadas