2010-03-04 84 views
8

我正在努力解決一個jQuery UI小部件上非常奇怪的JavaScript行爲。 IE7(贏得XP),jQuery 1.2.6(是的,這是一箇舊版本)。IE e.keyCode - 我如何區分&符號和向上箭頭?

小部件是一個組合框,它捕獲鍵盤事件並具有箭頭鍵的特殊行爲。

當我嘗試在「flexbox」輸入字段中鍵入「&」字符時,出現奇怪的行爲。

的Flexbox的有像一些代碼:

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

當我介紹了一個日誌聲明,我找到的是按 「&」(SHIFT + 7)產生三個按鍵事件:

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 

顯然,keyCode 38是&符號的向上箭頭鍵和ASCII碼?

正如我在寫這篇文章,我想到我可以檢測到按鍵爲「shift + 7」(keyCode 55)將其視爲「&」鍵,然後設置某種標誌忽略下一個按鍵這是38)。這似乎是一個可怕的黑客。

有沒有人有更好的方法來區分特殊字符,如「&」和IE中的箭頭鍵?

+0

我認爲它談論的是關於IE瀏覽器的密鑰,這個箭頭鍵的keyCodes形成一個生氣的悲傷面孔:%&'( (在評論文字輸入字體中效果更好) – RMorrisey 2010-03-04 00:55:10

回答

3

這是我落得這樣做:

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

希望這有助於人。如果您正在重複使用此代碼,則可能需要調整關鍵字「this」的使用,具體取決於它所引用的對象(這裏是與flexbox窗口小部件關聯的javascript對象)。

編輯:我更新了這段代碼,並刪除了之前存在的正則表達式測試,我發現它是越野車。

2

我認爲​​可能會給您比keypress更可靠的數據。

+0

感謝您的回覆!如果這對我來說是一個可行的選擇,當用戶修改輸入時(無論是否是箭頭鍵),我需要捕獲事件。如果用戶按下字母鍵,我認爲keydown事件將會只輸入一次,輸入第一個字母,而不是每次更改? – RMorrisey 2010-03-04 00:21:13

0

鍵向上或向下返回的55鍵碼爲「&」和38「箭頭向上」

+0

查看我對Tobias的回答的評論 – RMorrisey 2010-03-04 17:46:46

相關問題