2012-01-17 22 views
13

¿Hay alguna manera de detectar el diseño del teclado actual mediante JavaScript? Encontré this, pero solo detecta si el visitante está en el diseño en inglés. Necesito saber el diseño exacto como una cadena, p. de-ch, fr o en.detectar el diseño del teclado con javascript

+0

¿Ha encontrado una respuesta? – yanivsh

Respuesta

11

Los diseños de teclado no tienen identificadores estandarizados. Tienen nombres asignados por el creador del diseño. Pueden tener una asociación de lenguaje como una propiedad definida.

Los diseños de teclado no se deben confundir con los identificadores de idioma o configuración regional. En particular, no hay un solo "diseño en inglés", sino docenas de diseños que pueden usarse para inglés.

No creo que los sistemas hagan que su configuración de diseño actual sea legible mediante JavaScript.

Por lo tanto, cualquier problema que intente solucionar detectando el diseño del teclado, se necesita un enfoque diferente.

+0

excelente respuesta, gracias. Voy a buscar una forma alternativa de resolver esto. – Parzifal

3

Lo que está buscando es cómo detectar su configuración regional. En los encabezados HTTP esto se almacena en el encabezado Accept-Language, pero eso no está disponible para el navegador a través de JS puro.

Hay un plugin de jQuery llamado 'Browser Language' que puede ayudarte a seguir el camino correcto.

+2

Accept-Language, los idiomas del navegador (esto tiene varios meaninigs) y el diseño del teclado son cosas diferentes. A lo sumo * puede adivinar * el idioma del teclado de los demás, ya menudo adivinará mal. –

+0

Gracias por su respuesta! Esto funcionaría para la mayoría de los visitantes, pero algunos tienen un diseño de teclado diferente que aceptar el idioma. Por ejemplo, mi encabezado es 'Accept-Language: de, en; q = 0.7, en-us; q = 0.3' aunque mi teclado está configurado en' de-ch' (los caracteres especiales son diferentes a los normales 'de-de') ¿No hay una forma directa de obtener el diseño? – Parzifal

+2

No hay forma de obtener el diseño, solo puede adivinar en función del idioma. Sí, en el caso en que es Querty vs. Divorak o chino tradicional vs. chino simplificado, probablemente no puedas determinarlo. Pensándolo bien ... me doy cuenta, es posible detectar pero ... sería irregular. Básicamente, tendrías que esperar a que el usuario escriba algo y luego examinar los códigos de las teclas. – synthesizerpatel

13

Sé que esta pregunta es antigua, pero para aquellos de ustedes que se han visto obstaculizados por el hecho de que algunas teclas se asignan a caracteres diferentes en otras configuraciones regionales, este es un enfoque que puede usar para manejarlo.

Lo más probable es que tenga su manejador de eventos de teclado vinculado a un evento de keyup o keydown; los resultados de la propiedad event.which o event.keyCode en este caso están relacionados con la tecla que el usuario presionó. Por ejemplo, la misma clave que usas para escribir ';' en un diseño EN es la clave utilizada para escribir 'ж' en un diseño RU, y el evento informa 186 como el código para ambos.

Sin embargo, si está más interesado en el personaje que resultó de la pulsación de tecla, debería usar el evento 'presionar tecla'. Este evento se dispara después de la activación/desactivación de la tecla e informa el punto de código unicode real del carácter que se ingresó dentro de event.which o event.charCode, que en el ejemplo anterior es decimal 1078 o U + 0436.

Por lo tanto, si prefieres no adivinar los diseños de teclado y no necesitas diferenciar entre keyup/keydown, la pulsación de tecla puede ser una alternativa viable para ti. No es perfecto (la mayoría de los navegadores no informan eventos de pulsación de tecla en teclas que no imprimen caracteres, como teclas modificadoras, teclas de función y teclas de navegación), pero es mejor que adivinar los códigos clave cuando se trata de caracteres imprimibles.

+6

"y el evento informa 186 como el código para ambos". Creo que esto es falso Prueba este violín http://jsfiddle.net/BWPaz/ e intenta cambiar entre diferentes configuraciones de teclado. Personalmente obtengo códigos diferentes en una configuración regional en inglés de los EE. UU. Como en una configuración regional francesa. –

+1

@JackM Obtengo los mismos códigos de tecla para diferentes símbolos rusos e ingleses que se encuentran en la misma clave. Chrome, Windows 8.1. –

1

Todo lo que sé sobre este tema y ya implementé una solución para él, es detectar el teclado de diseño no inglés, es decir, los idiomas que utilizan cualquier alfabeto que no sea el utilizado en inglés. La solución depende de la expresión regular para que coincida con cualquier carácter de palabra \w, cualquier dígito \d y una gama de caracteres especiales predefinidos del teclado inglés, por lo que ningún otro carácter, como árabe, japonés, etc., no coincidirá, todo esto utiliza el evento de tecla y Estoy usando esta solución para restringir y notificar nombres de usuario y entradas de campos de contraseña en el formulario de inicio de sesión.Me he empaquetado en una función como la siguiente:

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; 
    } 

A continuación, llamar a la función desde el evento de la siguiente manera:

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