2011-04-19 189 views
4

爲了研究開發中的應用程序,我添加了常見任務的鍵盤快捷鍵。我可以起訴Ext.KeyMap要做到這一點是這樣的...ExtJS使用Ext.KeyMap監聽全局按鍵

var map = new Ext.KeyMap("my-element", { 
    key: 13, // or Ext.EventObject.ENTER 
    fn: myHandler, 
    scope: myObject 
}); 

但我想檢測「SS」或「QQ」的字母,即特定的雙擊鍵。我不知道如何做到這一點....

我的想法是檢測單數keystroke,添加一個偵聽器來檢測後續關鍵筆劃。爲了處理它們之間的差距,請設置一個延遲事件,在x時間後刪除偵聽器。

任何改進/建議/警告?

回答

4

我不知道爲什麼你會需要一個額外的偵聽器在這裏。爲什麼不將之前的擊鍵存儲在一個變量中(帶有發生擊鍵的時間戳)。然後,您可以將最新的按鍵與上一次按鍵進行比較。如果它們是相同的,並且存儲的時間戳過去不是太遠,那麼這就是您之後的雙重關鍵。如果鍵碼不相同,或者存儲的時間戳太舊,只需使用新值更新存儲的鍵碼和時間戳。

+0

我明白你在說什麼....但是不得不存儲每一個被按下的鍵並做一個比較,但對我來說這似乎不是很好的做法。我想除了你建議的東西外,沒有辦法檢測到雙擊... – neolaser 2011-04-19 05:22:20

+0

不知道這是你的意思,但你不必儲存_every_鍵,只是最後一個。無論如何,我想這種方法看起來有點麻煩,但它實際上應該是非常簡單和短的編碼邏輯。加上內存時間戳會很小(只是最後一個鍵碼和時間戳)。 – Tommi 2011-04-19 10:44:09

0

您不必記住所有按鍵,只是最後一個。當你在雙擊事件中想到它時,它是相似的,但是由於點擊兩次更受歡迎,它已經爲我們實施了。

0

事情是這樣的:

function defineDoubleKeyMap(element, cfg) { 
    var repeated, timer; 
    return new Ext.KeyMap(element, { 
     key: cfg.key, 
     fn: function() { 
      if (repeated) { 
       // when clicked the second time 
       // stop timer and call our callback 
       repeated = false; 
       clearTimeout(timer); 
       cfg.fn.call(cfg.scope); 
      } 
      else { 
       // remember we clicked once, forget after delay 
       repeated = true; 
       // adjust the delay as needed. 
       // current 1 sec is probably too long 
       timer = (function(){ 
        repeated = false; 
       }).defer(1000); 
      } 
     } 
    }); 
} 

defineDoubleKeyMap("my-element", { 
    key: Ext.EventObject.ENTER, 
    fn: myHandle, 
    scope: myObject 
}); 

這段代碼的probem是快速按ENTER - DELETE - ENTER也將觸發事件彷彿ENTER - ENTER是按下。如果這是不可接受的,那麼你必須跟蹤所有的按鍵 - 我認爲你必須使用Ext.get("my-element").on("keypress")