KeyboardEvent.keyCodeは非推奨です。これは実際にはどういう意味ですか?


92

MDNによると、このプロパティは絶対に使用しないでください.keyCode。これは非推奨です。

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

W3スクールでは、この事実は軽視.keyCodeされ、互換性のためにのみ提供されており、DOMイベント仕様の最新バージョンでは、.key代わりにこのプロパティを使用することを推奨しているという副次的な注記があります。

問題は、それ.keyがブラウザーでサポートされていないことです。行方不明のものはありますか?


回答:


32

共有したリンクに書かれているので、3つの方法で対処できます。

if (event.key !== undefined) {

} else if (event.keyIdentifier !== undefined) {

} else if (event.keyCode !== undefined) {

}

それらを熟考する必要があります。クロスブラウザのサポートが必要な場合は、これが正しい方法です。

このようなものを実装した方が簡単かもしれません。

var dispatchForCode = function(event, callback) {
  var code;

  if (event.key !== undefined) {
    code = event.key;
  } else if (event.keyIdentifier !== undefined) {
    code = event.keyIdentifier;
  } else if (event.keyCode !== undefined) {
    code = event.keyCode;
  }

  callback(code);
};

13
私はそれを読みましたが、実際にすべての主要なブラウザで正常に機能する場合、MDNが何かが非推奨であると述べた以外に理由はないので、多くの追加コードであるように見えました。しかし、それが正しい方法であれば、感謝します!
Jason210 2016

3
うわぁこれ見て。caniuse.com/#search=keyCode(このKeyboardEventプロパティは、事実上すべてのブラウザーでサポートされています(IE6 +、Firefox 2 +、Chrome 1+などが「.keyCodeについて話しているため」)
Miguel Lattuada

2
これは、このすべてについて非常に迷惑なことです。主要なブラウザはすべてkeyCodeをサポートしていますが、推奨される.keyプロパティを確認してください。ほとんど使用しないでください。
Jason210 2016

4
ええ、私たちは2016年5月下旬です。ChromeはついにKeyboardEvent.keyプロパティを実装しました。Safariとすべてのモバイルブラウザーは、「全ユーザーの16.5%」のパーティーにまだ参加していません。また、残念なことに、Microsoft EdgeとGeckoは、かなりの数のイベントを異なる方法でエンコードします。たとえば、上矢印のキーイベントは、「ArrowUp」ではなく「Up」としてエンコードされます。
Joshua Dawson


26

また、すべてのことのkeyCodeこれはcharCodeはkeyIdentifierは廃止されました:
charCodekeyIdentifier非標準の機能です。
keyIdentifierChrome 54以降では削除されており、Opera 41.0
keyCodeは、FFの通常の文字によるキープレスイベントで0を返します。

重要なプロパティ

 readonly attribute DOMString key

押されたキーに対応するキー属性値を保持します

この記事の執筆時点では、このkeyプロパティは、Firefox 52、Chrome 55、Safari 10.1、Opera 46の時点ですべての主要なブラウザーでサポートされています。InternetExplorer 11を除きます。 非標準のキー識別子とAltGraphでの不正な動作。詳細
これが重要であるか、下位互換性がある場合は、次のコードのように機能検出を使用できます。

key値がkeyCodewhichプロパティとは異なることに注意してください。これには、コードではなくキーの名前が含まれています。プログラムで文字コードが必要な場合は、を利用できますcharCodeAt()。単一の印刷可能な文字の場合charCodeAt()、使用できるのは、ArrowUp チャンスのように値に複数の文字が含まれるキーを処理している場合です。特別なキーをテストして、それに応じてアクションを実行します。だから、キーの値とそれに対応するコードのテーブルを実装してみてくださいcharCodeArr["ArrowUp"]=38charCodeArr["Enter"]=13charCodeArr[Escape]=27...というように、見てください取るキー値とそれらに対応するコードを

if(e.key!=undefined){
        var characterCode = charCodeArr[e.key] || e.key.charCodeAt(0);
    }else{
        /* As @Leonid suggeted   */
        var characterCode = e.which || e.charCode || e.keyCode || 0;
    }
        /* ... code making use of characterCode variable  */  

上位互換性を検討したい場合があります。つまり、レガシープロパティが利用可能であり、ドロップされた場合にのみ新しいプロパティに切り替えます。

if(e.which || e.charCode || e.keyCode ){
        var characterCode = e.which || e.charCode || e.keyCode;
    }else if (e.key!=undefined){
        var characterCode = charCodeArr[e.key] || e.key.charCodeAt(0);
    }else{
        var characterCode = 0;
    }

参照:KeyboardEvent.codeプロパティのドキュメントとこの回答の詳細。


私のブラウザー(Windows 10、Chrome 60、ベルギーのキーボード)ではソリューションが機能しません。まず、charCodeArr機能が存在しません。また、のcharCodeAtすべての値に対して機能するわけではありませんe.key。たとえば、Enter/ Returnキーの場合、e.keyプロパティの値は"Enter"でありcharCodeArr、その文字列に対して実行すると値69(文字のASCIIコードE)が返されます。
John Slegers 2017

@JohnSlegers、はい、それはタイプミスでした。ユーザーが作成した配列を意味しました。詳細については、私の最新の回答を参照してください。
user10089632 2017

19

TLDR:私はあなたがすることをお勧めしたいはずです新しい使用event.keyevent.codeプロパティの代わりに、従来のものを。IEとEdgeはこれらのプロパティをサポートしていますが、新しいキー名はまだサポートしていません。それらのために、標準のキー/コード名を出力させる小さなポリフィルがあります:

https://github.com/shvaikalesh/shim-keyboard-event-key


OPと同じMDN警告の理由を探して、この質問に行きました。さらに検索すると、問題keyCodeがより明確になります。

使用に関する問題keyCodeは、英語以外のキーボードでは異なる出力が生成され、レイアウトが異なるキーボードでも一貫性のない結果が生成される可能性があることです。加えて、

W3C仕様を読んだ場合:https ://www.w3.org/TR/uievents/#interface-keyboardevent

実際には、keyCodeとcharCodeは、プラットフォーム間で一貫性なく、異なるオペレーティングシステムでの同じ実装でも、異なるローカリゼーションの使用でも一貫性がありません

それは何が問題であったかを説明するいくつかの深さに入りますkeyCodehttps : //www.w3.org/TR/uievents/#legacy-key-attributes

これらの機能は正式には指定されておらず、現在のブラウザの実装は大幅に異なります。ユーザーエージェントの検出とそれに応じた動作に依存するスクリプトライブラリを含む大量のレガシーコンテンツは、これらのレガシー属性とイベントを形式化しようとすると、修正または有効化するだけのコンテンツを破壊するリスクがあることを意味します。さらに、これらの属性は国際的な使用には適しておらず、アクセシビリティの問題にも対応していません。

したがって、レガシーのkeyCodeが置き換えられた理由を確認した後、今日何をする必要があるかを見てみましょう。

  1. 最新のブラウザはすべて、新しいプロパティ(keyおよびcode)をサポートしています。
  2. IEとEdgeは古いバージョンの仕様をサポートしており、一部のキーには異なる名前が付いています。あなたはそれのためにシムを使うことができます:https//github.com/shvaikalesh/shim-keyboard-event-key(またはあなた自身のものを転がしてください-それはとにかくかなり小さいです)
  3. Edgeはこのバグを最新リリースで修正しました(おそらく2018年4月にリリースされる予定です)-https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/
  4. 使用できるイベントキーのリストを参照してください:https : //www.w3.org/TR/uievents-key/

MDNよれば、Internet ExplorerもEdgeもサポートしていませんKeyboardEvent.code。また、keyおよびの値codeはブラウザに依存します。どちらの問題も実際のアプリケーションで使用するには実用的ではkeyありcodeません。
John Slegers


矢印キー、ページアップ/ダウン、ホーム&エンドをテストする場合、使用する必要がありますkeycode?通常は物理的なキーですが、Num Lockとレイアウトにも依存します...ベストプラクティスは何ですか?
ジェイク

12

MDNはすでにソリューションを提供しています。

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

window.addEventListener("keydown", function (event) {
  if (event.defaultPrevented) {
    return; // Should do nothing if the default action has been cancelled
  }

  var handled = false;
  if (event.key !== undefined) {
    // Handle the event with KeyboardEvent.key and set handled true.
  } else if (event.keyIdentifier !== undefined) {
    // Handle the event with KeyboardEvent.keyIdentifier and set handled true.
  } else if (event.keyCode !== undefined) {
    // Handle the event with KeyboardEvent.keyCode and set handled true.
  }

  if (handled) {
    // Suppress "double action" if event handled
    event.preventDefault();
  }
}, true);

3
残念ながら、またはのkeyようなブラウザ固有の文字列値であり、対応するコードに変換する標準化された方法はありません。そのため、キーとコードを変換するには、さらに多くのボイラープレートコードが必要になります。"Enter""ArrowUp"
John Slegers 2017

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.