La locura del JavaScript: Eventos de teclado

13 de Noviembre del 2007 Escrito por Alex Barros

Trabajar en JavaScript ha tenido siempre una gran dificultad, y es que se trata de un lenguaje no estándar, interpretado por el cliente. Esto provoca desigualdades en los resultados, dependiendo sobretodo de los distintos navegadores, y sus respectivas versiones.

En el caso de los eventos de teclado este desmadre tiene un especial énfasis, y viene a demostrarse en este documento (en inglés) que paso a resumiros.

Eventos keyup keydown y keypress

Estos eventos son disparados en momentos distintos, dependiendo del navegador. Por ejemplo el mantener pulsada la tecla “Alt”, o el pulsar un caracter durante varios segundos, producen resultados distintos en cuanto al disparo de eventos, en cada navegador.

Interpretación de la tecla pulsada

Llegados al punto de que el usuario ha pulsado una tecla, querremos saber cuál de ellas ha pulsado. Pues el resultado también difiere entre navegadores (como era de esperar).

Para complicarnos la vida a los programadores, la codificación es distinta entre los principales navegadores. Aúnque en los caracteres normales (numeros y letras) hay una cierta uniformidad, la diferenciación del lugar donde se pulsan los números (hay dos series de números en un teclado normal), y la mayoría de los signos, adquieren claves distintas que los identifican.

Echa un vistazo a la tabla de códigos más abajo.

Tablas clarificadoras

Navegador Eventos enviados cuando se pulsan teclas modificadoras (Alt, Ctrl, etc)
Gecko
Internet Explorer
keydown
keyup
Opera
Konqueror
keydown
keypress
keyup
Safari
iCab
ningún evento
Navegador Eventos lanzados en cada autorepetición
Gecko (Linux)
Gecko (Macintosh)
Safari (Macintosh)
Konqueror
Opera
sólo keypress
Internet Explorer
Gecko (Windows)
Safari (Windows)
keydown
keypress
iCab keyup
keydown
keypress
Tecla Mozilla Internet Explorer Opera códigos pseudo ASCII
Teclas alfabéticas Código ASCII de la letra en mayúscula
[ Espacio ] 32 32 32 32
[ Enter ] 13 13 13 13
[ Tabulador ] 9 9 9 9
[ Retroceder ] 8 8 8 8
[ Shift ] 16 16 16 16
[ Control ] 17 17 17 17
[ Alt ] 18 18 18 18
izquierda 37 37 37 37
arriba 38 38 38 38
derecha 39 39 39 39
abajo 40 40 40 40
Números en el teclado Código ASCII del número (48 más el número), aúnque esté pulsado un modificador Código ASCII del caracter que será enviado.
[ ; : ] 59 186 59 59 (unshifted) o 58 (shifted)
[ = + ] 61 187 61 61 (unshifted) o 43 (shifted)
[ , < ] 188 188 44 44 (unshifted) o 60 (shifted)
[ - _ ] 109 189 45 45 (unshifted) o 95 (shifted)
[ . > ] 190 190 46 46 (unshifted) o 62 (shifted)
[ / ? ] 191 191 47 47 (unshifted) o 63 (shifted)
[ ` ~ ] 192 192 126 126 (unshifted) o 96 (shifted)
[ \ | ] 220 220 92 92 (unshifted) o 124 (shifted)
[ ' " ] 222 222 39 39 (unshifted) o 34 (shifted)
Números (teclado separado) 96 más número 48 más número (ASCII)

Recomiendo leer la fuente original (inglés).

Categorias: Código, JavaScript, Web | 5 comentarios »

Carga asíncrona de archivos JavaScript

16 de Octubre del 2007 Escrito por Alex Barros

Me gustaría recalcar esta técnica, ya que según mi opinión no está valorada lo suficiente.

Se trata de la carga asíncrona de archivos Javascript, es decir, no cargar un archivo JavaScript hasta que lo necesite.

¿Cómo hago esto?

Es muy sencillo, una simple función puede facilitarte increíblemente el trabajo. Es la siguiente:

  1. function include(path){
  2.         var j = document.createElement("script");
  3.         j.type = "text/javascript";
  4.         j.src = path;
  5.         document.body.appendChild(j);
  6. }

Como puede apreciarse, la función crea “al vuelo” un elemento tipo script, y lo introduce en el cuerpo del documento. De esta forma no tenemos que cargar muchas librerías, o grandes archivos, hasta que no los necesitemos.

  1. if(programa == ‘test’) {
  2.         include(‘test.js’);
  3. } else {
  4.         include(‘default.js’);
  5. }

Es posible que incluso con el evento onLoad tengamos el control del instante en que se ha cargado, pero esto se atiene más a compatibilidades entre navegadores.

Este tema lo he rescatado, porque la versión 2.1 de Imaset va a tener una fuerte carga de Javascript, lo que hará que el manejo sea más rápido y llevadero, y evitará envíos AJAX innecesarios. Pero para esto debo cargar el gran fichero JS, únicamente cuando se solicite usar el plugin. De ahí su gran potencial.

Categorias: Código, JavaScript | 2 comentarios »

Comet, la nueva etapa de Ajax

30 de Agosto del 2007 Escrito por Alex Barros

generic-comet.jpgAjax sigue siendo un completo desconocido para muchos programadores web. Se habla de que es un lenguaje (no lo es, es una herramienta!) y se asocia automáticamente a la nueva generación de webs, más potentes, amigables, sociales, usables…

Ajax consiste, básicamente, en mandar mensajes (con formato XML, o texto plano) del servidor al cliente mediante una petición asíncrona por parte del cliente.

Un ejemplo: Cuando el usuario pulsa en un botón de búsqueda, se envía una petición al servidor solicitando los resultados de esta búsqueda, cuando los tiene los devuelve, y el usuario los ve en pantalla, todo sin cambiar de página.

Esto implica que para que el servidor me de información, el cliente tiene que solicitarla, es decir, al ocurrir algún evento en el lado cliente. Y aquí radica la diferencia entre AJAX y Comet (o HTTP Push), y es que Comet no requiere que el ordenador cliente solicite ninguna información, sinó que es el servidor el que decide cuándo enviar la información al cliente, de forma asíncrona.

Un ejemplo: En un sistema de mensajería instantánea, en lugar de hacer contínuos chequeos al servidor, para ver si hay nuevos mensajes, símplemente cada vez que el servidor recibe un nuevo mensaje envía esta información a las máquinas cliente.

La forma de hacer esto es mediante una conexión HTTP de larga duración, de esta forma el servidor tiene una línea contínua de comunicación con el cliente. Aquí el cliente envía información al servidor, y el servidor al cliente; pero cada uno lo hace en el momento oportuno, en lugar de viajar la información como bloque de datos en respuesta a una petición.

Para usar esta tecnología tendremos que usar alguno de los pocos frameworks que actualmente existen con soporte para Comet, por ejemplo Xaja, un framework PHP que permite este tipo de conexión, o HTTP.Push, pequeña biblioteca javascript con este tipo de llamada.

Personalmente todabía he de investigar sobre esta tecnología, porque no tengo muy claro lo de generar eventos en el servidor, o lo de que un archivo en lado servidor esté siempre disponible con el cliente.

Categorias: HTML, JavaScript, Web | No hay comentarios »

del.icio.us meneame.net RSS

Buscar:



Tagcloud

Entradas Recientes

Meta: