2010-09-23 5 views
69

Ho un tag di ancoraggio che chiama una funzione JavaScript.JQuery o JavaScript: come determinare se si preme il tasto Maiusc mentre si fa clic sul collegamento ipertestuale dell'etichetta di ancoraggio?

Con o senza JQuery come determinare se il tasto Maiusc è premuto mentre si fa clic sul collegamento?

Il seguente codice NON funziona perché la pressione di tasto viene attivata solo se si preme una "chiave reale" (non il tasto Maiusc). (Speravo che avrebbe sparato se solo il tasto shift da solo è stato premuto.)

var shifted = false; 

$(function() {       
    $(document).keypress(function(e) { 
     shifted = e.shiftKey; 
     alert('shiftkey='+e.shiftkey); 
    }); 

    $(document).keyup(function(e) { 
     shifted = false; 
    }); 
} 

... 

function myfunction() { 
    //shift is always false b/c keypress not fired above 
} 
+3

il seguente codice anche non funziona perché digitato 'shiftkey' invece di' shiftKey' :-) –

+0

Se avete bisogno di sapere che, per evitare di chiamare il gestore quando si preme 'shift + click', usare [' filter-altered-clicks'] (https://github.com/bfred-it/filter-altered-clicks) –

risposta

23

Per gli eventi del mouse, so che in Firefox, almeno la proprietà "shiftKey" sull'oggetto evento vi dirà se il turno la chiave è giù. È documentato su MSDN ma non l'ho provato per sempre, quindi non ricordo se IE lo fa correttamente.

Quindi dovresti essere in grado di controllare "shiftKey" sull'oggetto evento nel tuo gestore "click".

+1

In effetti. Questo è stato il caso risalente ai primissimi giorni di JavaScript. – bobince

6

Il keypress evento non viene attivato da tutti i browser quando si fa clic spostamento o ctrl, ma per fortuna the keydown event is.

Se si spegne il keypress con keydown si potrebbe avere migliore fortuna.

+1

Bene, ma il problema è che non saprà per * sicuro * se viene premuto il tasto Maiusc. Oh, ma suppongo che se il flag è impostato anche per "keyUp", allora sarebbe possibile rilevare quando "click" è tra parentesi dagli eventi chiave. – Pointy

79
$(document).on('keyup keydown', function(e){shifted = e.shiftKey}); 
+18

Questo ha funzionato per me ma ha interrotto tutte le scorciatoie standard che non implicavano 'shift' poiché la funzione restituisce' false'. Ho dovuto esplicitamente restituire true per consentire crtl + r, ctrl + s, ctrl + p ecc. –

+2

Quindi il suggerimento è usare keydown anziché keypress. – rwitzel

54

Ecco il codice chiave per ogni tratto di chiave in JavaScript. È possibile utilizzarlo e rilevare se l'utente ha premuto il tasto Maiusc.

backspace   8 
tab     9 
enter    13 
shift    16 
ctrl    17 
alt     18 
pause/break   19 
caps lock   20 
escape    27 
page up    33 
page down   34 
end     35 
home    36 
left arrow   37 
up arrow   38 
right arrow   39 
down arrow   40 
insert    45 
delete    46 
0     48 
1     49 
2     50 
3     51 
4     52 
5     53 
6     54 
7     55 
8     56 
9     57 
a     65 
b     66 
c     67 
d     68 
e     69 
f     70 
g     71 
h     72 
i     73 
j     74 
k     75 
l     76 
m     77 
n     78 
o     79 
p     80 
q     81 
r     82 
s     83 
t     84 
u     85 
v     86 
w     87 
x     88 
y     89 
z     90 
left window key  91 
right window key 92 
select key   93 
numpad 0   96 
numpad 1   97 
numpad 2   98 
numpad 3   99 
numpad 4   100 
numpad 5   101 
numpad 6   102 
numpad 7   103 
numpad 8   104 
numpad 9   105 
multiply   106 
add     107 
subtract   109 
decimal point  110 
divide    111 
f1     112 
f2     113 
f3     114 
f4     115 
f5     116 
f6     117 
f7     118 
f8     119 
f9     120 
f10     121 
f11     122 
f12     123 
num lock   144 
scroll lock   145 
semi-colon   186 
equal sign   187 
comma    188 
dash    189 
period    190 
forward slash  191 
grave accent  192 
open bracket  219 
back slash   220 
close braket  221 
single quote  222 

Non tutti i browser gestire l'evento keypress bene, quindi utilizzare il tasto su o l'evento premuto il tasto, in questo modo:

$(document).keydown(function (e) { 
    if (e.keyCode == 16) { 
     alert(e.which + " or Shift was pressed"); 
    } 
}); 
+0

Ottima risposta! Il migliore ... – MAChitgarha

+0

più 1 per la quantità di sforzo messo in questa risposta –

+0

Usa 'event.key' invece! Ti darà direttamente il carattere, ad esempio: "a", "1", "LeftArrow" – Gibolt

19

Ho avuto un problema simile, cercando di catturare un 'cambiamento + fare clic su 'ma poiché utilizzavo un controllo di terze parti con un callback anziché il gestore standard click, non ho avuto accesso all'oggetto evento e al suo associato e.shiftKey.

Ho finito per gestire l'evento del mouse verso il basso per registrare lo shift-ness e quindi utilizzarlo in seguito nella mia richiamata.

var shiftHeld = false; 
    $('#control').on('mousedown', function (e) { shiftHeld = e.shiftKey }); 

Inviato nel caso in cui qualcun altro finisca qui alla ricerca di una soluzione a questo problema.

3

L'eccellente libreria JavaScript KeyboardJS gestisce tutti i tipi di pressione dei tasti incluso il tasto MAIUSC. Permette anche di specificare combinazioni di tasti come la prima pressione di CTRL + x e poi a.

KeyboardJS.on('shift', function() { ...handleDown... }, function() { ...handleUp... }); 

Se si desidera una versione semplice, la testa al answer by @tonycoupland):

var shiftHeld = false; 
$('#control').on('mousedown', function (e) { shiftHeld = e.shiftKey }); 
+0

@downvoters: lascia un commento perché fai downvote alla soluzione – koppor

0
var shiftDown = false; 
this.onkeydown = function(evt){ 
    var evt2 = evt || window.event; 
    var keyCode = evt2.keyCode || evt2.which;  
    if(keyCode==16)shiftDown = true; 
} 
this.onkeyup = function(){ 
    shiftDown = false; 
} 

demo

2

Questa grande opera per me:

function listenForShiftKey(e){ 
    var evt = e || window.event; 
    if (evt.shiftKey) { 
     shiftKeyDown = true; 
    } else { 
     shiftKeyDown = false; 
    } 
} 
4

ho usato un metodo per tes t se un tasto specifico è premuto memorizzando i codici chiave attualmente pressate in un array:

var keysPressed = [], 
    shiftCode = 16; 

$(document).on("keyup keydown", function(e) { 
    switch(e.type) { 
     case "keydown" : 
      keysPressed.push(e.keyCode); 
      break; 
     case "keyup" : 
      var idx = keysPressed.indexOf(e.keyCode); 
      if (idx >= 0) 
       keysPressed.splice(idx, 1); 
      break; 
    } 
}); 

$("a.shifty").on("click", function(e) { 
    e.preventDefault(); 
    console.log("Shift Pressed: " + (isKeyPressed(shiftCode) ? "true" : "false")); 
}); 

function isKeyPressed(code) { 
    return keysPressed.indexOf(code) >= 0; 
} 

Here is the jsfiddle

+2

, ma ha bisogno di una soluzione minore alla chiave: while (idx> = 0) { \t \t \t \t \t keysPressed.splice (idx, 1); \t \t \t \t \t idx = avpg.keysPressed.indexOf (e.keyCode); \t \t \t \t} Altrimenti, viene rimossa solo la prima occorrenza di una pressione di tasto. Per notarlo, tieni premuto MAIUSC per alcuni secondi. L'array si riempie di codici maiuscoli, ma solo uno di essi viene rimosso sulla chiave. – pkExec

2

Un approccio più modulare oltre alla possibilità di mantenere l'ambito this negli ascoltatori:

var checkShift = function(fn, self) { 
    return function(event) { 
    if (event.shiftKey) { 
     fn.call(self, event); 
    } 
    return true; 
    }; 
}; 

$(document).on('keydown', checkShift(this.enterMode, this)); 
0

Se qualcuno sta cercando di rilevare una determinata chiave e ha bisogno di conoscere lo stato dei "modificatori" (come vengono chiamati in Java), ad esempio i tasti Maiusc, Alt e Control, è possibile fare qualcosa di simile, che risponde a keydown sul tasto F9, ma solo se nessuno dei tasti Shift, Alt o Control è attualmente premuto.

jqMyDiv.on('keydown', function(e){ 
    if(! e.shiftKey && ! e.altKey && ! e.ctrlKey){ 
     console.log(e); 
     if(e.originalEvent.code === 'F9'){ 
      // do something 
     } 
    } 
}); 
Problemi correlati