2010-03-04 18 views
8

Estoy peleando con un comportamiento de JavaScript muy extraño en un widget de jQuery UI que estoy tratando de corregir. IE7 (win XP), jQuery 1.2.6 (sí, es una versión anterior).IE e.keyCode - ¿Cómo puedo diferenciar entre ampersand y up-arrow?

El widget es un cuadro combinado, que captura los eventos del teclado y tiene comportamientos especiales para las teclas de flecha.

Cuando intento escribir el carácter "&" en el campo de entrada de la caja flexible, obtengo un comportamiento extraño.

El FlexBox tiene algún código como:

//initialization 
$myInputElement.keypress($.flexbox.process_key); 
$.flexbox.process_key = function process_key(e) { 
    $.flexbox.flexboxFromInput(this).processKey(e); 
    return true; 
}; 

//on the flexbox object's prototype: 
... 
    processKey: function processKey(e) { 
     var mod = 0; 
      if (typeof (e.ctrlKey) !== 'undefined') { 
       if (e.ctrlKey) mod |= 1; 
       if (e.shiftKey) mod |= 2; 
      } else { 
       if (e.modifiers & Event.CONTROL_MASK) mod |= 1; 
       if (e.modifiers & Event.SHIFT_MASK) mod |= 2; 
      } 
      ... 
      switch (e.keyCode) { 
        case 38: // up 
         this.prevResult(); 
         break; 
        case 40: // down 
         if (this.getCtr().is(':visible')) this.nextResult(); 
         else this.flexboxDelay(true); 
         break; 
       ...etc. 
      } 
    } 
... 

Cuando presento una declaración de registro, lo que encuentro es que al pulsar "&" (shift + 7) produce tres eventos de pulsación:

INFO: Flexbox> processKey, keyCode=16, ctrl=false, shift=true 
INFO: Flexbox> processKey, keyCode=55, ctrl=false, shift=true 
INFO: Flexbox> processKey, keyCode=38, ctrl=false, shift=true 

Aparentemente, el código de clave 38 es la tecla de flecha hacia arriba y el código ASCII para el signo &?

Mientras escribía esto, se me ocurrió que podía detectar la pulsación de tecla como "shift + 7" (código clave 55) para tratarla como la tecla ampersand, luego establecer algún tipo de indicador para ignorar la siguiente tecla (cual es el 38). Esto parece un hack horrible.

¿Alguien tiene una mejor manera de diferenciar entre caracteres especiales como "&" y las teclas de flecha en IE?

+0

Creo que dice mucho sobre IE que los códigos de las teclas de flecha forman una cara triste enojada:% & '( (funciona mejor en la fuente de entrada de texto de comentario) – RMorrisey

Respuesta

3

Esto es lo que terminé haciendo:

/* 
    * Hack around a wierd behavior in IE where "&%'(" have the same keyCodes 
    * as the arrow keys. 
    */ 
     if (keyCodeIn(e.keyCode, 55, 53, 57) && (mod & 2) && !(mod & 1)) { 
      this.ignoreNextArrowKey = true; 
     } 
     else if (222 === e.keyCode && !(mod & 2) && !(mod & 1)) { 
      this.ignoreNextArrowKey = true; 
     } 
     else if (keyCodeIn(e.keyCode, 38, 37, 39, 40) && this.ignoreNextArrowKey) { 
      this.ignoreNextArrowKey = false; 
      return; 
     } 

     //... 

     function keyCodeIn(keyCode) { 
      for(var i = 1; i < arguments.length; i++) { 
       if (arguments[i] === keyCode) { 
        return true; 
       } 
      } 
      return false; 
     } 

Espero que esto ayude a alguien. Si está reutilizando este código, es posible que deba ajustar el uso de la palabra clave 'this', según el objeto al que haga referencia (aquí, es un objeto javascript asociado con el widget flexbox).

Edit: He actualizado este código y eliminé la prueba de expresión regular que estaba allí anteriormente, que descubrí que tenía errores.

2

Creo que keydown podría darte datos más confiables que keypress.

+0

Gracias por la respuesta! No estoy seguro si esta es una opción viable en mi caso, necesito capturar el evento cada vez que el usuario realice cambios en la entrada (independientemente de si es o no una tecla de flecha). Si el usuario mantiene presionada una tecla de letra, creo que el evento de tecla aparecerá solo se activará una vez, para la primera letra ingresada, y no para cada cambio? – RMorrisey

0

clave hacia arriba o hacia abajo devuelve un código de tecla de 55 para '&' y 38 para 'flecha arriba'

+0

Ver mi comentario a la respuesta de Tobias – RMorrisey

1

recomiendo el uso de esta biblioteca jQuery para escribir controladores personalizados para las pulsaciones de teclas: http://code.google.com/p/js-hotkeys/

tratando de discernir códigos clave lógicamente es una pesadilla.

Cuestiones relacionadas