javascript jquery html firefox3.6

javascript - Compruebe las teclas Ctrl/Shift/Alt en el evento ''clic''



jquery html (9)

¿Cómo podría identificar qué teclas Ctrl / Shift / Alt se presionan en el siguiente código?

$("#my_id").click(function() { if (<left control key is pressed>) { alert("Left Ctrl"); } if (<right shift and left alt keys are pressed>) { alert("Right Shift + Left Alt"); } });


¡Funciona de maravilla! y en Chrome, Firefox, IE y Edge también;) https://jsfiddle.net/55g5utsk/2/

var a=[]; function keyName(p){ var cases = {16:''Shift'',17:''CTRL'',18:''Alt''}; return cases[p] ? cases[p] : ''KeyCode: ''+p; } function keyPosition(p){ var cases = {1:''Left'',2:''Right''}; return cases[p] ? cases[p]+'' '' : ''''; } $(''input'').on(''keydown'',function(e){ a.push(keyPosition(e.originalEvent.location)+keyName(e.keyCode)); }) $(''input'').on(''keyup'',function(){ var c=''''; var removeDuplicates = []; $.each(a, function(i, el){ if ($.inArray(el, removeDuplicates) === -1) { removeDuplicates.push(el); c=c+(el)+'' + ''; } }); a=[]; alert(c.slice(0, -3)) });

A continuación, una versión con el evento click http://jsfiddle.net/2pL0tzx9/

var a=[]; function keyName(p){ var cases = {16:''Shift'',17:''CTRL'',18:''Alt''}; return cases[p] ? cases[p] : ''''; } function keyPosition(p){ var cases = {1:''Left'',2:''Right''}; return cases[p] ? cases[p]+'' '' : ''''; } $(document).on(''keydown'',function(e){ a.push(keyPosition(e.originalEvent.location)+keyName(e.keyCode)); }) $(''#my_id'').on(''click'',function(){ var c=''''; var removeDuplicates = []; a =a.filter(function(v){return v!==''''}); $.each(a, function(i, el){ if ($.inArray(el, removeDuplicates) === -1){ removeDuplicates.push(el); c=c+(el)+'' + ''; } }); if (c) alert(c.slice(0, -3)); a=[]; });


Bueno, esto no funcionará en todos los navegadores, solo IE 8. Microsoft implementó la capacidad de determinar qué tecla (derecha / izquierda) se presionó. Aquí hay un enlace http://msdn.microsoft.com/en-us/library/ms534630(VS.85).aspx

También encontré este artículo maravilloso sobre keypress, keyup, keydown event en los navegadores. http://unixpapa.com/js/key.html

$(''#someelement'').bind(''click'', function(event){ if(event.ctrlKey) { if (event.ctrlLeft) { console.log(''ctrl-left''); } else { console.log(''ctrl-right''); } } if(event.altKey) { if (event.altLeft) { console.log(''alt-left''); } else { console.log(''alt-right''); } } if(event.shiftKey) { if (event.shiftLeft) { console.log(''shift-left''); } else { console.log(''shift-right''); } } });


En la mayoría de los casos, los booleanos de teclas ALT , CTRL y SHIFT funcionarán para ver si se presionaron esas teclas. Por ejemplo:

var altKeyPressed = instanceOfMouseEvent.altKey

Cuando se le solicite, devolverá verdadero o falso. Para obtener más información, vaya a https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/altKey

Para referencia futura, también hay una llamada metaKey (NS / metaKey solamente) que funciona cuando se presiona la tecla meta.



Más fácil que nada: utiliza el evento de tecla para verificar si es Ctrl (17) o Mayús (16), luego usa el evento de tecla para verificar si es Intro (13) y Ctrl o Mayús presionar antes (al pulsar la tecla) cancelar Ctrl o Mayús en cualquier teclado pero Enter


Siguiendo mi comentario , esta es una posible solución.

Para verificar qué tecla de modificación específica se presiona, puede usar KeyboardEvent Location ( consulte la tabla de compatibilidad )

Para admitir IE8, afortunadamente podría utilizar la solución ya publicada .

Ahora la solución es establecer un objeto global con propiedades relevantes con respecto a qué teclas modificadoras se mantienen. Otras formas sin usar un objeto global serían posibles, por supuesto.

Aquí, capturo el evento usando el método de escucha de JavaScript relevante (jQuery no admite la fase de captura) . keydown/keyup evento para manejar el caso donde la propagación de los eventos keydown/keyup sería detenida por alguna razón por el código ya en uso.

/* global variable used to check modifier keys held */ /* Note: if e.g control left key and control right key are held simultaneously */ /* only first pressed key is handled (default browser behaviour?)*/ window.modifierKeys = (function() { /* to handle modifier keys except AltGr which is key shortcut for controlRight + alt */ var mKeys = {}; /* to fire keydown event only once per key held*/ var lastEvent, heldKeys = {}; // capture event to avoid any event stopped propagation document.addEventListener(''keydown'', function(e) { if (lastEvent && lastEvent.which == e.which) { return; } lastEvent = e; heldKeys[e.which] = true; setModifierKey(e); }, true); // capture event to avoid any event stopped propagation document.addEventListener(''keyup'', function(e) { lastEvent = null; delete heldKeys[e.which]; setModifierKey(e); }, true); function setModifierKey(e) { mKeys.alt = e.altKey; mKeys.ctrlLeft = e.ctrlKey && e.location === 1; mKeys.ctrlRight = e.ctrlKey && e.location === 2; mKeys.shiftLeft = e.shiftKey && e.location === 1; mKeys.shiftRight = e.shiftKey && e.location === 2; } return mKeys; })(); /* on div click, check for global object */ $(''.modifierKey'').on(''click'', function() { console.log(modifierKeys); /* for demo purpose */ $(''.info'').text(function() { var txt = []; for (var p in modifierKeys) { if (modifierKeys[p]) txt.push(p); } return txt.toString(); }); })

/* for demo purpose */ .info:not(:empty) { border: 1px solid red; padding: .1em .5em; font-weight: bold; } .info:not(:empty):after { content: " held"; font-weight: normal; }

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <div class="modifierKey" tabindex="-1"> DIV to catch modifier keys on click </div> <br> <span class="info"></span>

Como notas al margen:

  • La tecla ALT GR es una tecla de método abreviado para las teclas CTRL-Derecha y ALT
  • al mantener simultáneamente dos teclas modificadoras (por ejemplo, las teclas Shift-Izquierda y Shift-Rigth), resultaría que solo se manejará la primera (parece el comportamiento predeterminado del navegador, así que de todos modos, ¡parece correcto!)


e.originalEvent.location devuelve 1 para la tecla izquierda y 2 para la tecla derecha. Por lo tanto, puede detectar qué tecla modifier se presiona de la siguiente manera. Espero que esto te ayudará.

var msg = $(''#msg''); $(document).keyup(function (e) { if (e.keyCode == 16) { if (e.originalEvent.location == 1) msg.html(''Left SHIFT pressed.''); else msg.html(''Right SHIFT pressed.''); } else if (e.keyCode == 17) { if (e.originalEvent.location == 1) msg.html(''Left CTRL pressed.''); else msg.html(''Right CTRL pressed.''); } else if (e.keyCode == 18) { if (e.originalEvent.location == 1) msg.html(''Left ALT pressed.''); else msg.html(''Right ALT pressed.''); e.preventDefault(); //because ALT focusout the element } });

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <label>Press modifier key: </label> <strong id="msg"></strong>


$(''#someelement'').bind(''click'', function(event){ if(event.ctrlKey) console.log(''ctrl''); if(event.altKey) console.log(''alt''); if(event.shiftKey) console.log(''shift''); });

No sé si es posible verificar las teclas izquierda / derecha dentro de un clic, pero no creo que sea posible.