2014-09-28 91 views
1

檢測修飾符當我運行下面的代碼,然後按命令鍵在我的Mac(使用Chrome),metaKey被設置的keydown而不是KEYUP。難道我做錯了什麼?我只是想跟蹤元鍵被按下,所以我可以用它我的JavaScript內 - 如果有一個更好的辦法,請讓我知道:-)jQuery的不KEYUP

var metaPressed = false; 
    $(document).keydown(function(e) { 
    console.log('keydown ' + e.keyCode); 
    if (e.metaKey || e.ctrlKey) { 
     console.log('meta pressed'); 
     metaPressed = true; 
    } 
    }); 
    $(document).keyup(function(e) { 
    console.log('keyup ' + e.keyCode); 
    if (e.metaKey || e.ctrlKey) { 
     console.log('meta unpressed'); 
     metaPressed = false; 
    } 
    }); 

下面是相關按鍵的控制檯輸出

// Pressing cmd 
keydown 91 
meta pressed 
keyup 91 

// Pressing control 
keydown 17 
meta pressed 
keyup 17 

// Pressing non-meta like spacebar 
keydown 32 
keyup 32 
+3

不知道我得到它,並不如預期,只是,KeyUp事件觸發時的按鈕所以即使keyup事件用正確的keyCode觸發,e.metaKey在那一點上也會是false? – adeneo 2014-09-28 19:23:43

回答

1

我現在明白了,我誤解了jQuery如何處理修飾鍵。感謝@ adeneo的提示讓我思考正確。

此外,如果按鍵同時舉行了元字符,例如按M-x,jQuery不會發送'x'的鍵值,直到'M'也被釋放。所以你不必擔心像「元上下,X下來,把x向上,向上薈萃」發生

0

您將無法取回從KEYUP信息。我會推薦使用這個(e.keyCode === 17 || e.keyCode === 91)作爲測試用例(分別是CTRL和META)

+0

這些keyCode是依賴於瀏覽器的。 – Damien 2015-10-02 18:01:13

+0

@Damien http://unixpapa.com/js/key.html。如果向下滾動,您將看到CTRL鍵在不同瀏覽器中保持一致。 Windows Meta並未在Opera中正確支持,但其瀏覽器使用率共享無論如何都是不可接受的(也不是OP的使用案例) – tfrascaroli 2015-10-05 08:28:23

+0

MacOS上每個瀏覽器的命令密鑰代碼都不相同,Safari使用2代碼。請參閱http://stackoverflow.com/a/3922353/438970。 – Damien 2015-10-13 15:12:55