2012-01-17 13 views
13

C'è un modo per rilevare il layout corrente della tastiera utilizzando JavaScript? Ho trovato this, ma rileva solo se il visitatore è nel layout inglese. Ho bisogno di conoscere il layout esatto come una stringa, ad es. de-ch, fr o en.Rileva layout tastiera con javascript

+0

Hai trovato una risposta? – yanivsh

risposta

11

I layout di tastiera non hanno identificatori standardizzati. Hanno nomi assegnati loro dal creatore del layout. Possono avere un'associazione linguistica come una proprietà definita.

I layout della tastiera non devono essere confusi con gli identificatori della lingua o delle impostazioni internazionali. In particolare non esiste un singolo "layout inglese" ma dozzine di layout che possono essere usati per l'inglese.

Non penso che i sistemi normalmente rendano leggibili le loro attuali impostazioni di layout tramite JavaScript.

Quindi qualsiasi problema si stia risolvendo rilevando il layout della tastiera, è necessario un approccio diverso.

+0

ottima risposta, grazie. Cercherò un modo alternativo per risolvere questo. – Parzifal

3

Stai cercando è come rilevare le loro impostazioni internazionali. Nelle intestazioni HTTP questo è memorizzato nell'intestazione Accept-Language, ma questo non è disponibile per il browser tramite puro JS.

C'è un plugin jQuery chiamato "Browser Language" che potrebbe farti andare sulla giusta strada.

+2

Accept-Language, lingue del browser (questo ha diversi meaninigs) e il layout della tastiera sono tutte cose diverse. Puoi al massimo * indovinare * la lingua della tastiera degli altri e spesso indovinerai male. –

+0

Grazie per la tua risposta! Ciò funzionerebbe per la maggior parte dei visitatori, ma alcuni hanno un layout di tastiera diverso dall'accettare la lingua. Ad esempio, la mia intestazione è 'Accept-Language: de, en; q = 0.7, en-us; q = 0.3' sebbene la mia tastiera sia impostata su' de-ch' (i caratteri speciali sono diversi dal normale 'de-de'). Non c'è un modo diretto per ottenere il layout? – Parzifal

+2

Non c'è modo di ottenere il layout, puoi solo indovinare in base alla lingua. Sì, nel caso in cui sia Querty vs. Divorak o cinese tradizionale rispetto a cinese semplificato, probabilmente non è possibile determinarlo. Ripensandoci ... mi rendo conto che potrebbe essere possibile rilevare ma ... sarebbe imprevedibile. Dovresti in pratica aspettare che l'utente digiti qualcosa e quindi esaminare i codici chiave. – synthesizerpatel

13

So che questa domanda è vecchia, ma per quelli di voi che sono stati ostacolati dal fatto che alcune chiavi si associano a caratteri diversi in altri locali, ecco un approccio che è possibile utilizzare per affrontarlo.

Molto probabilmente, il tuo gestore eventi tastiera è legato a un evento keyup o keydown; i risultati della proprietà event.which o event.keyCode in questo caso sono legati a quale tasto l'utente ha premuto. Ad esempio, la stessa chiave che usi per digitare ';' in un layout EN è la chiave utilizzata per digitare 'ж' in un layout RU e l'evento riporta 186 come codice per entrambi.

Tuttavia, se si è più interessati al carattere derivante dalla pressione del tasto, è necessario utilizzare invece l'evento "keypress". Questo evento si attiva dopo il keydown/up e riporta l'effettivo codice unicode del carattere che è stato digitato all'interno di event.which o event.charCode, che nell'esempio precedente è decimale 1078 o U + 0436.

Quindi, se preferisci non indovinare i layout della tastiera e non devi distinguere tra keyup/keydown, keypress potrebbe essere un'alternativa valida per te. Non è perfetto (la maggior parte dei browser non riporta in modo coerente eventi di keypress su tasti che non stampano caratteri, come tasti modificatori, tasti funzione e tasti di navigazione), ma è meglio che indovinare sui keycode quando si tratta di caratteri stampabili.

+6

"e il report degli eventi 186 come codice per entrambi." Penso che questo sia falso. Prova questo fiddle http://jsfiddle.net/BWPaz/ e prova a passare da una tastiera all'altra. Personalmente sto ottenendo diversi codici su un locale inglese americano come in un locale francese. –

+1

@JackM Ricevo gli stessi codici chiave per i diversi simboli russo e inglese che si trovano sulla stessa chiave. Chrome, Windows 8.1. –

1

Tutto quello che so di questo argomento e già implementato una soluzione per esso, è quello di rilevare non layout di tastiera inglese, cioè Lingue che usa qualsiasi alfabeto diverso da quello usato in inglese. La soluzione dipende dall'espressione regolare per far corrispondere qualsiasi carattere di parola \w, qualsiasi carattere numerico \d e una serie di caratteri speciali predefiniti per tastiera inglese, quindi qualsiasi altro carattere, come arabo, giapponese, ecc. Non corrisponderà, tutto ciò utilizza l'evento keydown e Sto usando questa soluzione per limitare e notificare i campi dei nomi utente e password nel modulo di login.Ho confezionato in una funzione come la seguente:

function checkKeyboard(ob,e){ 
     re = /\d|\w|[\.\[email protected]\*\\\/\+\-\^\!\(\)\[\]\~\%\&\=\?\>\<\{\}\"\'\,\:\;\_]/g; 
     a = e.key.match(re); 
     if (a == null){ 
     alert('{{__('Error 2:\nNon English keyboard layout is detected!\nSet the keyboard layout to English and try to fill out the field again.')}}'); 
     ob.val(''); 
     return false; 
     } 
     return true; 
    } 

Quindi chiamare la funzione dall'evento come il seguente:

$("#textFieldId").keydown(function(e){ 
     if (!checkKeyboard($(this),e)){ 
      return false; 
     } 
    });