2010-12-17 45 views
175

我認爲這將在堆棧溢出的某個地方得到解答,但是我找不到它。.keyCode與.which

如果我正在監聽按鍵事件,我應該使用.keyCode還是.which來確定Enter鍵是否被按下?

我一直在做類似如下:

$("#someid").keypress(function(e) { 
    if (e.keyCode === 13) { 
    e.preventDefault(); 
    // do something 
    } 
}); 

但我看到使用.which,而不是.keyCode例子。有什麼不同?另一種跨瀏覽器友好嗎?

+1

這兩個現在都被視爲棄用,FYI。 https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/which https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode – VisWebsoft 2017-11-27 14:07:33

回答

160

某些瀏覽器使用keyCode,其他使用which。如果你使用jQuery,你可以可靠地使用which作爲jQuery standardizes thingsMore here.


如果你不使用jQuery,你可以這樣做:

var key = 'which' in e ? e.which : e.keyCode; 

或者交替:

var key = e.which || e.keyCode || 0; 

...它處理的可能性,e.which可能0 (通過在最後恢復0,使用JavaScript's curiously-powerful || operator)。

+2

Thanks T.J.我在哪裏可以找到這方面的參考?不是我不相信你,我只是好奇! ...我看到你剛纔補充說,謝謝。所以,即使那些不使用jQuery的人,。這是一個更好的選擇? – ScottE 2010-12-17 14:55:52

+6

@ScottE:如果不使用jQuery,你必須自己明確地處理它。我通常這樣做'var key = event.which || event.keyCode;'如果定義了它,將使用'event.which'而不是falsey;如果'which'是未定義的或falsey,將使用'event.keyCode'。技術上,我應該做'var key = typeof event.which ===「undefined」? event.keyCode:event.which;'但如果'event.which'爲'0'(可以是'0'嗎?),我不太可能關心我所做的事情。 – 2010-12-17 15:02:47

+2

@ScottE,這是一個基本的參考資料:http://www.quirksmode.org/js/keys.html(它不包括'which',我認爲它只能由jQuery提供,但我不是100%當然,它應該讓你開始看到瀏覽器的差異) – Mottie 2010-12-17 15:05:53

28

的jQuery根據event.whichevent.keyCodeevent.charCode是否被瀏覽器支持正常化event.which

// Add which for key events 
if (event.which == null && (event.charCode != null || event.keyCode != null)) { 
    event.which = event.charCode != null ? event.charCode : event.keyCode; 
} 

一個額外的.which好處是,jQuery不會是鼠標點擊過:

// Add which for click: 1 === left; 2 === middle; 3 === right 
// Note: button is not normalized, so don't use it 
if (!event.which && event.button !== undefined) { 
    event.which = (event.button & 1 ? 1 : (event.button & 2 ? 3 : (event.button & 4 ? 2 : 0))); 
} 
+1

'var key = event.which || event.charCode || event.keyCode' – 2014-07-04 09:03:19

+0

@ anne-van-rossum,'event.wich == null && ...'測試僅適用於null或未定義。你的'event.wich || ...'測試_falsy_(undefined,null,false,0,''等) – aMarCruz 2015-05-22 11:54:47

+0

@aMarCruz Falsy。例如。 Webkit報告'0'的https://bugs.webkit.org/show_bug.cgi?id=16735。我不認爲檢查''「'或'[]'是否會受到傷害。 – 2015-05-24 08:50:17

5

看看這個:https://developer.mozilla.org/en-US/docs/Web/API/event.keyCode

在按鍵事件中,按下的鍵的Unicode值存儲在keyCode或charCode屬性中,而不是兩者。如果按下的按鍵生成一個字符(例如'a'),則charCode將被設置爲該字符的代碼,並遵守字母大小寫。 (即charCode考慮換檔鍵是否被按下)。否則,按鍵的代碼將存儲在keyCode中。 keyCode始終設置在keydown和keyup事件中。在這些情況下,charCode從未設置。 要獲取密鑰的代碼,無論它存儲在keyCode或charCode中,請查詢哪個屬性。 通過IME輸入的字符不通過keyCode或charCode註冊。

2

一個強大的Javascript庫,用於捕獲輸入的鍵盤輸入和組合鍵。它沒有依賴關係。

http://jaywcjlove.github.io/hotkeys/

hotkeys('ctrl+a,ctrl+b,r,f', function(event,handler){ 
    switch(handler.key){ 
     case "ctrl+a":alert('you pressed ctrl+a!');break; 
     case "ctrl+b":alert('you pressed ctrl+b!');break; 
     case "r":alert('you pressed r!');break; 
     case "f":alert('you pressed f!');break; 
    } 
}); 

熱鍵理解以下修飾符:shiftoptionaltctrlcontrolcommand,和

以下特殊鍵可用於快捷鍵:backspacetabclearenterreturnescescapespaceupdownleftrighthomeendpageuppagedowndeldeletef1f19

+0

儘管如此,如果你在另一個庫中使用它,它可能不適合,因爲它會修改全局範圍。它也似乎使用了不推薦的'event.keyCode'。 – Akrikos 2018-02-14 16:17:19

6

如果你是住在香草的Javascript,請注意鍵代碼現在已經過時,將被丟棄:

此功能已經從Web標準中刪除。儘管一些瀏覽器可能仍然支持它,但它正在被丟棄。避免使用它並儘可能更新現有的代碼;請參閱本頁底部的兼容性表格來指導您的決定。請注意,此功能可能會停止在任何恬工作

https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode

而是使用或者:這取決於你想要什麼樣的行爲。關鍵.CODEhttps://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key

兩者都在現代瀏覽器上實現。

+0

**。** **對應於鍵盤上鍵的物理位置,而**。鍵**對應於按鍵生成的字符,與位置無關。 – Christopher 2017-09-22 15:36:13

+0

「代碼」和「鍵」在現代瀏覽器中都有怪癖。在不同瀏覽器中使用MDN https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code上的「試用」示例顯示IE11/IE Edge未實現「代碼」,並且'key'的實現與Chrome/FF/Safari中的實現不匹配(區別似乎主要在控制字符中,如Escape和Enter)。我認爲使用圖書館可能是最簡單的,除非你願意自己解釋這些變幻莫測。我真的希望這是答案,但IE將這個問題搞砸了:-( – Akrikos 2018-02-14 15:43:52

+0

嗯......實際上,在跨瀏覽器的方式下實現鍵看起來不錯,常規的字母數字鍵只是返回它們的值並進行控制在大多數瀏覽器中,鍵(escape,enter,tab等)似乎以相同的方式實現,除了IE11/Edge,它實現了舊版本的規範,所以至少每個鍵只有兩個可能的值。 – Akrikos 2018-02-14 15:53:29

0

我建議event.key目前。 MDN文檔:https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key

event.KeyCodeevent.which都在他們的MDN頁面的頂部有討厭過時的警告:
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/which

對於字母數字鍵,event.key似乎在所有瀏覽器相同的實現。對於控制鍵(標籤,輸入,轉義等),event.key在Chrome/FF/Safari/Opera中具有相同的值,但在IE10/11/Edge中有不同的值(IE顯然使用舊版本的規格但彼此匹配截至2018年1月14日)。

對於字母數字鍵的支票會看起來像:

event.key === 'a' 

控制字符你需要做這樣的事情:

event.key === 'Esc' || event.key === 'Escape' 

我使用的示例這裏測試在多個瀏覽器(我不得不打開codepen和編輯,以使其與IE10的工作):https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code

event.code被提及在一個不同的答案作爲可能性,但是IE10/11/Edge並沒有實現它,所以如果你想要IE支持的話就沒有了。