2010-03-04 7 views
8

Ich kämpfe mit einem sehr seltsamen JavaScript-Verhalten auf einem jQuery UI-Widget Ich versuche zu beheben. IE7 (Win XP), jQuery 1.2.6 (Ja, es ist eine alte Version).IE e.keyCode - Wie kann ich zwischen kaufmännischem Und und Pfeil nach oben unterscheiden?

Das Widget ist eine Combo-Box, die Tastaturereignisse erfasst und spezielle Verhalten für die Pfeiltasten hat.

Wenn ich versuche, das Zeichen "&" in das flexbox-Eingabefeld einzugeben, bekomme ich seltsames Verhalten.

Der Flexbox hat einige Code wie:

//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. 
      } 
    } 
... 

Wenn ich eine Logging-Anweisung vorstellen, was ich finde, ist, dass die Taste "&" (Shift + 7) drei Tastendruck-Ereignisse erzeugt:

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 

Anscheinend ist keyCode 38 sowohl die Pfeiltaste nach oben und der ASCII-Code für Ampersand?

Während ich dies schrieb, fiel mir ein, dass ich den Tastendruck als "shift + 7" (keyCode 55) erkennen kann, um es als kaufmännisches Und-Zeichen zu behandeln, und dann eine Art Flag setzen, um den nächsten Tastendruck zu ignorieren (welches ist das 38). Das scheint ein schrecklicher Hack zu sein.

Hat jemand eine bessere Möglichkeit, zwischen Sonderzeichen wie "&" und den Pfeiltasten im IE zu unterscheiden?

+0

Ich denke, es Bände über IE spricht, dass die Keycodes für die Pfeiltasten bilden ein wütendes trauriges Gesicht:% & '( (funktioniert besser im Kommentartext Eintrag Schrift) – RMorrisey

Antwort

3

ist, was ich am Ende tun:

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

Hope this jemand hilft. Wenn Sie diesen Code erneut verwenden, müssen Sie möglicherweise die Verwendung des Schlüsselwortes 'this' anpassen, je nachdem, auf welches Objekt es verweist (hier handelt es sich um ein Javascript-Objekt, das dem flexbox-Widget zugeordnet ist).

Bearbeiten: Ich habe diesen Code aktualisiert und entfernt den regulären Ausdruck Test, der zuvor dort war, die ich entdeckte, war fehlerhaft.

2

Ich denke, keydown könnte Ihnen zuverlässigere Daten als keypress geben. Diese

+0

Danke für die Antwort Ich bin aber nicht sicher! Wenn dies eine praktikable Option in meinem Fall ist, muss ich das Ereignis erfassen, wenn der Benutzer Änderungen an der Eingabe vornimmt (unabhängig davon, ob es eine Pfeiltaste ist oder nicht.) Wenn der Benutzer eine Buchstabentaste gedrückt hält, denke ich, dass das Keydown-Ereignis nur einmal ausgelöst werden, für den ersten eingegebenen Buchstaben, und nicht für jede Änderung? – RMorrisey

0

Taste nach oben oder unten ein keyCode von 55 für ‚&‘ gibt und 38 für ‚Pfeil nach oben‘

+0

Siehe meinen Kommentar zu Tobias 'Antwort – RMorrisey

1

Ich empfehle diese jQuery-Bibliothek mit benutzerdefinierten Handler für Drücken von Tasten schreiben: http://code.google.com/p/js-hotkeys/

zu erkennen versuchen, Keycodes sind logisch ein Albtraum.