.keyCodeと.which


228

これはスタックオーバーフローのどこかで解決されると思いましたが、見つかりません。

キープレスイベントをリッスンしている場合、Enterキーが押されたかどう.keyCode.whichを確認するために使用する必要がありますか?

私はいつも次のようなことをしました:

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

しかし、の.which代わりにを使用する例を見ています.keyCode。違いは何ですか?他のブラウザよりフレンドリーなブラウザがありますか?


回答:


209

注:以下の回答は2010年に書かれています。ここ数年後、keyCodeおよびwhichkey(論理キーの場合)およびcode(キーの物理的な配置の場合)のために廃止されました。ただし、IEはをサポートしておらずcode、そのサポートkeyは古いバージョンの仕様に基づいているため、正確ではないことに注意してください。私がこれを書いているとき、EdgeHTMLとChakraに基づいた現在のEdge codeもどちらもサポートしていませんが、MicrosoftはBlinkベースとV8ベースのEdgeの置き換えを展開しています。


一部のブラウザはを使用しkeyCode、他のブラウザはwhich

jQueryを使用している場合はwhich、jQueryが標準化するため、確実に使用できます。詳細はこちら。

jQueryを使用していない場合は、これを行うことができます。

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

または代わりに:

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

...可能性のある可能性を処理しe.whichます0JavaScriptの奇妙に強力な演算子0を使用して、最後にそれを復元します||)。


2
TJに感謝します。これに関するリファレンスはどこにありますか?私はあなたを信じていないのではなく、私は好奇心旺盛です!...ありがとうございます。したがって、jqueryを使用していない場合でも、どちらを選択するのが良いでしょうか。
ScottE 2010

7
@ScottE:jQueryを使用しない場合は、自分で明示的に処理する必要があります。私は通常、このようにします。var key = event.which || event.keyCode;それがevent.which定義されていて偽りではないevent.keyCode場合、またはwhich未定義または偽である場合に使用します。技術的には私はおそらく行う必要がありますvar key = typeof event.which === "undefined" ? event.keyCode : event.which;が、場合event.whichである0(それができる0?)、私は物事の種類の世話しそうです。
TJクラウダー

2
@ScottE、ここに基本的なリファレンスがあります:quirksmode.org/js/keys.html(これは含まれていません。jQuerywhichによってのみ提供されると思いますが、100%確実ではありませんが、これであなたは見始めることができるはずです。ブラウザの違い)
Mottie 2010

1
@fudgey:IEを除くすべてのブラウザーでwhich提供さkeypressれます。そして、quirksmodeはここでは信頼できません。参考として、@ TJ Crowderが投稿したリンクははるかに優れています:unixpapa.com/js/key.html
Tim Down

5
@TJ Crowder:はい、イベントのwhichプロパティはゼロになる可能性があり、これはほとんどのアプリケーションに大きな違いをもたらす可能性があります。たとえば、Firefoxの印刷不可能なキーには、whichゼロのプロパティとと同じkeyCodeプロパティがありkeydownます。keyCode私のPCのFirefox のホームキーの36は "$"の文字コードで、ホームキーを押すユーザーとを使用して$文字を入力するユーザーを区別できなくなりますevent.which || event.keyCode
Tim Down

32

jQuery は、またはがブラウザーでサポートされているevent.whichかどうかevent.whichに応じて正規化します。event.keyCodeevent.charCode

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

2
var key = event.which || event.charCode || event.keyCode
アンヴァンロッサム2014

@ anne-van-rossum、event.wich == null && ...nullまたは未定義のみをテストします。あなたのevent.wich || ...ためのテストfalsy(未定義、ヌル、偽、0、 ''、など)
aMarCruz

@aMarCruzわいせつなこと。たとえば、bugs.webkit.org / show_bug.cgi?id = 16735とWebkitレポート0。そして、私はチェックする""か、[]傷つくとは思わない。
アンヴァンロッサム2015年

20

バニラJavascriptを使用している場合は、keyCodeが廃止され、削除されることに注意してください。

この機能はWeb標準から削除されました。一部のブラウザではまだサポートされている可能性がありますが、削除される予定です。使用を避け、可能であれば既存のコードを更新してください。このページの下部にある互換性の表を参照して、判断を下してください。この機能はいつでも動作しなくなる可能性があることに注意してください

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

代わりに、必要な動作に応じて.keyまたは.codeのいずれかを使用してくださいhttps : //developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code https://developer.mozilla.org/en -US / docs / Web / API / KeyboardEvent / key

どちらも最新のブラウザに実装されています。


.codeはキーボード上のキーの物理的な場所に対応しますが、.keyは場所に関係なく押されたキーによって生成される文字に対応します。
クリストファー

1
「コード」と「キー」の両方に、最近のブラウザの癖があります。別のブラウザーでMDN developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/codeの「試してみる」の例を使用すると、IE11 / IE Edgeが「コード」と「キー」を実装していないことが示されます実装がChrome / FF / Safariの実装と一致していません(違いは主に、エスケープやエンターなどの制御文字にあるようです)。これらの気まぐれを自分で説明するつもりがない限り、ライブラリを使用するのが最も簡単かもしれません。私は本当にこれを答えにしたいのですが、IEはこれを
台無しに

うーん...実際には、クロスブラウザの方法でキーを実装することはそれほど悪くはありません。通常の英数字キーは値を返すだけであり、コントロールキー(エスケープ、エンター、タブなど)の場合、古いバージョンの仕様を実装するIE11 / Edgeを除き、ほとんどのブラウザーで同じように実装されているように見えるため、少なくともそれぞれに2つの値しかありませんキー。
Akrikos 2018

key代わりに使用することをお勧めしますcode。たとえば、メディアコントロールキーを備えたキーボードの場合、再生/一時停止を押すと、「MediaPlayPause」がkey、「」がに出力されcodeます。
thdoan 2018年

6

これを見てくださいhttps : //developer.mozilla.org/en-US/docs/Web/API/event.keyCode

keypressイベントでは、押されたキーのUnicode値は、keyCodeまたはcharCodeプロパティのいずれかに格納されます。両方には格納されません。押されたキーが文字(「a」など)を生成する場合、charCodeは、大文字と小文字を区別して、その文字のコードに設定されます。(charCodeは、Shiftキーが押されているかどうかを考慮します)。それ以外の場合、押されたキーのコードはkeyCodeに格納されます。keyCodeは常にkeydownイベントとkeyupイベントで設定されます。これらの場合、charCodeは設定されません。keyCodeに格納されているかcharCodeに格納されているかに関係なく、キーのコードを取得するには、whichプロパティをクエリします。IMEを介して入力された文字は、keyCodeまたはcharCodeを介して登録されません。


6

私はevent.key現在お勧めします。MDNドキュメント:https : //developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key

event.KeyCodeまた、event.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'

私はここの例を使用して複数のブラウザーでテストしました(IE10で動作させるには、コードペンで開いて編集する必要がありました):https ://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/ コード

event.code 可能性として別の答えで言及されていますが、IE10 / 11 / Edgeはそれを実装していません。そのため、IEサポートが必要かどうかはわかりません。


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


ただし、Array.prototype.indexOfをシム処理するため、これを別のライブラリで使用している場合は、グローバルスコープを変更するため、適切ではない可能性があります。また、非推奨のを使用しているようですevent.keyCode
Akrikos 2018

このライブラリは私のVaioラップトップでFnを検出しませんでした。
thdoan

0

Firefoxでは、keyCodeプロパティはonkeypressイベントでは機能しません(0のみを返します)。クロスブラウザーソリューションの場合、keyCodeと共にwhichプロパティを使用します。例:

var x = event.which || event.keyCode;  // Use either which or keyCode, depending on browser support
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.