2010-12-17 8 views
175

これはStack Overflowのどこかで答えられると思っていましたが、見つけられませんでした。.keyCode vs. .which

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

私は常に次のようなものやった:

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

をしかし、私は.whichの代わり.keyCode使用例を見ています。違いは何ですか?他のブラウザよりもクロスブラウザの方がフレンドリーですか?

+1

これらの両方は現在廃止予定です。 https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/which https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode – VisWebsoft

答えて

160

一部のブラウザはkeyCodeを使用し、その他のブラウザはwhichを使用します。 jQueryを使用している場合は、whichをjQuery standardizes thingsとして確実に使用できます。あなたはjQueryのを使用していない場合More here.


、あなたはこれを行うことができます。交互

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

または:e.whichがあるかもしれないという可能性を扱う

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

を... 0 (最後に0を復元することによって、JavaScript's curiously-powerful || operatorを使用して)。

+2

ありがとうT.J.これについての参考資料はどこにありますか?私はあなたを信じていない、私はちょうど興味がある! ...あなたがちょうどそれを追加したのを見て、ありがとう。だから、jqueryを使用していない人でも、。それはより良い選択ですか? – ScottE

+6

@ScottE:jQueryを使用しない場合は、これを明示的に処理する必要があります。私は通常このようにします。 'var key = event.which || event.keyCode; 'それは定義されていて偽でない場合は' event.which'を使用し、 'which'が未定義または偽の場合は' event.keyCode'を使用します。技術的には、おそらく 'var key = typeof event.which ===" undefined "を行うべきでしょうか? event.which; 'event.which'が' 0'( '0'でもかまいませんか?)であれば、私がすることの種類を気にすることはまずありません。 –

+2

@ScottE、ここには基本的なリファレンスがあります:http://www.quirksmode.org/js/keys.html(これは 'which'を含んでいません。これはjQueryによってのみ提供されていると思いますが、私は100% – Mottie

28

jQueryのevent.whichevent.keyCodeまたはevent.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; 
} 

Anは.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' –

+0

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

+0

@aMarCruz Falsyを目的としています。例えば。 https://bugs.webkit.org/show_bug.cgi?id=16735「0」と報告しているウェブキット。そして、私は '' '' '' '' '' 'や' '' 'のチェックが痛いとは思わない。 –

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に格納されているかどうかにかかわらず、キーのコードを取得するには、whichプロパティを照会します。 IMEによって入力された文字は、keyCodeまたはcharCodeで登録されません。

2

入力されたキーボード入力とキーの組み合わせをキャプチャするための強力なJavascriptライブラリ。依存関係はありません。 shiftoptionaltctrlcontrolcommand、そして

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

ホットキーは、以下の修飾子を理解します。

次の特殊キーがショートカットに使用することができます:backspacetabclearenterreturnescescapespaceupdownleftrighthomeendpageuppagedowndeldeletef1f19

+0

しかし、これはArray.prototype.indexOfをシムします。したがって、別のライブラリでこれを使用している場合、グローバルスコープを変更するので適切ではないかもしれません。また、廃止された 'event.keyCode'を使用しているようです。 – Akrikos

6

あなたはバニラJavaScriptで滞在している場合は、キーコードを注意してください廃止され、ドロップされます。

この機能は、Web標準から削除されました。いくつかのブラウザはまだそれをサポートしているかもしれませんが、それは落とされつつあります。可能であれば、それを使用したり、既存のコードを更新したりしないでください。このページの下部にある互換性表を参照して決定を導きます。あなたが望む行動に応じて、.KEYまたは.CODEhttps://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key

この機能は、任意のティム代わり

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

のいずれかを使用で仕事をやめることに注意してください

両方とも最新のブラウザに実装されています。

+0

**コード**はキーボード上のキーの物理的位置に対応しますが、**。**は位置に関係なく押されたキーによって生成される文字に対応します。 – Christopher

+0

最新のブラウザでは、 'code'と 'key'の両方に癖があります。さまざまなブラウザでMDN https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/codeの「試してみる」の例を使用すると、IE11/IE Edgeは「コード」を実装していないことがわかります。 'キー'の実装はChrome/FF/Safariの実装と一致しません(違いは主にEscapeやEnterなどの制御文字になります)。私はあなたがあなた自身でこれらの変化を説明しない限り、ライブラリを使用するのが最も簡単かもしれないと思います。私は本当にこれが答えであることを望んでいますが、IEはこれを上にねじ込みます:-( – Akrikos

+0

うーん...実際には十字ブラウザの方法でキーを実装するのは悪くはありません。古いバージョンの仕様を実装しているIE11/Edge以外のほとんどのブラウザでは、キー(エスケープ、入力、タブなど)が同じように実装されているように見えるため、各キーには少なくとも2つの値しかありません。 – Akrikos

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 === 'Esc' || event.key === 'Escape' 

:制御文字について

event.key === 'a' 

が好きなあなたは何かをする必要があると思います(私はcodepenで開き、IE10で動作するように編集しなければならなかった):https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code

event.codeは別の答えでa IE10/11/Edgeはそれを実装していないので、IEのサポートが必要な場合は外に出ます。

関連する問題