2010-03-04 12 views
8

Walczę z bardzo dziwnym zachowaniem javascript na widżecie interfejsu JQuery UI, który próbuję naprawić. IE7 (win XP), jQuery 1.2.6 (tak, to stara wersja).IE e.keyCode - Jak odróżnić ampersand i up-arrow?

Widżet to pole kombi, które przechwytuje zdarzenia na klawiaturze i ma specjalne zachowania dla klawiszy strzałek.

Kiedy próbuję wpisać znak "&" w polu wejściowym Flexbox, pojawia się dziwne zachowanie.

schematu flexbox ma jakiś kod jak:

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

Kiedy przedstawić oświadczenie rejestrowania, co uważam, że naciśnięcie "&" (shift + 7) produkuje trzy keypress zdarzenia:

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 

Wygląda na to, że keyCode 38 jest jednocześnie strzałką w górę i kodem ASCII dla ampersand?

Kiedy to pisałem, przyszło mi do głowy, że mogę wykryć naciśnięcie klawisza jako "shift + 7" (keyCode 55), aby potraktować go jako klawisz ampersand, a następnie ustawić flagę, aby zignorować następne naciśnięcie klawisza (który jest 38). To wygląda na okropne włamanie.

Czy ktoś ma lepszy sposób na odróżnienie znaków specjalnych, takich jak "&" i klawiszy strzałek w IE?

+0

Myślę, że mówi wiele o IE, że klucze do klawiszy strzałek tworzą smutną, smutną twarz:% & '( (działa lepiej w czcionce tekstu komentarza) – RMorrisey

Odpowiedz

3

To, co skończyło się robi:

/* 
    * 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 helps kogoś. Jeśli ponownie używasz tego kodu, być może będziesz musiał dostosować użycie słowa kluczowego "to", w zależności od tego, do którego obiektu się odnosi (tutaj jest to obiekt javascript powiązany z widżetem Flexbox).

Edytuj: Zaktualizowałem ten kod i usunąłem test wyrażeń regularnych, który był poprzednio, co odkryłem jako błąd.

2

Myślę, że keydown może dostarczyć bardziej wiarygodnych danych niż keypress.

+0

Dziękuję za odpowiedź! Nie jestem pewien jeśli jest to opłacalna opcja w moim przypadku, muszę przechwycić zdarzenie za każdym razem, gdy użytkownik wprowadzi zmiany w danych wejściowych (niezależnie od tego, czy jest to klawisz strzałki) .Jeśli użytkownik przytrzyma klawisz z literą, myślę, że zdarzenie keydown będzie uruchamia się tylko raz, dla pierwszej litery, a nie dla każdej zmiany? – RMorrisey

0

klawisz w górę lub w dół zwraca keyCode 55 lat dla „&” i 38 dla „Strzałka w górę”

+0

Zobacz mój komentarz do odpowiedzi Tobiasza – RMorrisey

Powiązane problemy