Diferentes keycode para guion

Estoy rehaciendo una función para detectar las teclas pulsadas en un campo de texto, y resulta que para el guión, en IExplorer / Chrome el código retornado es 189 y en el Firefox es 173.

Pero lo "mejor" de todo es que luego al hacer un String. FromCharCode con el 189 me retorna un guión, correcto, pero al hacerlo con el 173, no me retorna nada (o blanco).

¿Cómo solucionarlo?

1 Respuesta

Respuesta
2

El problema que planteas es muy interesante.

Para empezar, los eventos keypress, keydown y keyup tienen implementaciones distintas en función del navegador y devuelven valores distintos.

Keydown y keyup devuelven el código de la tecla pulsada (keycode) mientras que keypress devuelve el carácter ASCII correspondiente con la pulsación (charcode).

Por ejemplo, si pulsas A y a tendrás el mismo keycode (tecla 'a') pero diferente ASCII.

En tu caso, el "-", tiene un único código ASCII (el 45) pero tiene varios keycodes (por ejemplo, en mi teclado hay dos teclas en el teclado que insertan dicho carácter, el guión de al lado del shift y el "menos" en el teclado numérico pero puedes tener más)

Aquí te dejo una herramienta online para hacer pruebas y obtener el keycode de la tecla pulsada:

http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes 

Bien, sabiendo esto ya vamos a las implementaciones concretas en cada navegador y aquí es cuando nos encontramos con cosas peculiares como que Explorer y Opera no soportan la opción del ASCII y en su lugar te devuelven el código de la tecla.

Aquí tienes más información acerca de como interpretan los diferentes eventos cada navegador:

http://www.quirksmode.org/js/keys.html 

Con esto, y dependiendo de si lo que te interesa es controlar la pulsación de una determinada tecla o de un determinado carácter, te recomendaría por normal general usar el evento keyup (ya que solo se ejecuta una vez) y te quedes con el keycode para compararlo con una lista de las posibles teclas que impriman el carácter que estás esperando.

Si antes ya me parecía por decirlo finamente, una locura, lo que programar web, con esto ya es de paranoia ¿cómo que Explorer no tiene en cuenta el ASCII? pues vamos finos ... No sé a qué espera la gente para dejar de programar para Explorer con la cantidad de incovenientes que conlleva ... Porque para saber que tecla ha pulsado el usuario, has de saber qué navegador utilizar y poner "if" aquí, "if" allá ... que al fin es esta la manera que implementé, ya que tuve que montar una función que determina qué navegador se utiliza, para otros temas ...

De todas maneras, la solucion que tomé, no me termino de gustar, esta manera de trabajar me parece bastante mala, bastante chapucera, pero es a lo que te obligan ... Los peor de todo, es que las pruebas las hago para Explorer, Mozilla y Chrome, que probablemente en otro navegador puede que salga mal, si utiliza otro sistema ...

Gracias.

Es cierto, que cada navegador implemente como quiera ciertos comportamientos el algo que nos trae de cabeza a los que trabajamos con javascript.

Mi recomendación es no usar código diferente por navegador (lo que comentabas de los 'if') si no que lo implementes de forma genérica y solo des soporte a ciertos navegadores/versión ya que, como bien dices, conforme pase el tiempo llegarán nuevos navegadores que pueden tener implementaciones distintas.

Si claro, no poner "if", pero claro, eso es muy relativo ... ¿Vas a pasar de Explorer, de Mozilla, de Chrome? ... que son los 3 "grandes" ... y que evidentemente cada cual trata la información a su manera, desde el posicionamiento en pantalla, los keyCode ... bla bla bla ...

Puedes pasar de ciertos navegadores, pero de esos tres creo que no ...

Ya trato de programar lo más genérico posible (para ahorrar mantenimiento) pero eso hay veces que es imposible ...

Hombre, depende de la funcionalidad que estás intentando implementar es posible buscar caminos alternativos para no tener que tener código específico para cada navegador (aunque a veces es imposible y tienes que pasar por el aro o directamente no dar soporte a cierta versión antigua de Explorer...).

Desconozco para que necesitas obtener el guión pero se me ocurren otras implementaciones sin tener en cuenta el parámetro del evento, por ejemplo, obteniendo el valor del input en keypress y buscando el guión con una regex.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas