web-dev-qa-db-ja.com

keyCode = 229のキーダウンイベントを無視しても大丈夫ですか?

最初は、_<input type="text">_への変更をリアルタイムで監視したいと思っていました(たとえば、ユーザーがキーを押したときなど)。 onChangeイベントは、ユーザーがEnterキーを押すか、入力要素からフォーカスを削除したときにのみトリガーされるため、機能しませんでした。それから私はStackOverflowで この質問 を見ました。その答えからコードを試しましたが、問題は、印刷可能な文字を表していないキーの押下について通知を受けたくないということです。そのため、イベントに印刷可能な文字があることを確認するために、この方法でコードを変更する必要がありました。 :

_...

textInputElement.onKeyDown.listen((KeyboardEvent ev) {
  if (new String.fromCharCode(ev.keyCode).length > 0) {
    callAFunction();
  }
});

...
_

(+ onKeyUpイベントの同じ変更)

Dartiumでこれをテストしたところ、入力要素にフォーカスしてから任意のキーを押すと、_ev.keyCode = ev.which = 229_と_ev.charCode = 0_でkeydownイベントがトリガーされることがわかりました。このイベントの直後に、押されたキーの正しい_ev.keyCode = ev.which_と_ev.charCode = 0_で別のkeydownイベントがトリガーされます。この229キーがどこから来たのかわかりませんでしたが、印刷可能な文字_å_であることがわかりました。インターネットを検索したところ、他の人がこの問題を抱えており、他のプログラミング言語やテクノロジーを使用していることがあります。関連するリンクの1つは this であり、選択された修正は this very small commit にあります-彼らは_keyCode = 229_を持つすべてのイベントを無視することを選択しました。 Chrome/Chromium/WebKitは、すべての標準キーボードイベントの前にこれらのキーダウンイベントの送信を開始しました。その意味は、ユーザーが何らかのボタンを押したことです。しかし、インプットメソッドはまだそれを処理していますまたはインプットメソッドエディターはキー入力を処理しています

私の質問は、new String.fromCharCode(229)が印刷可能な文字「_keyCode = 229_」を返す場合、_å_でkeydownイベントを無視しても大丈夫ですか?同じキーコードとそれに対応する文字を生成する実際のキーがある可能性のある状況について考えました。

どんな助けにも感謝します!

9
silviubogan

簡単な答えは「いいえ」です。keyCode= 229のキーダウンイベントは無視できますが、キープレスイベントの直後に続く場合に限ります。

特定のキーを押したままにすると、一部のブラウザはkeyCode値が229のキーダウンイベントを繰り返し送信しますが、他のブラウザは元のキーダウンkeyCodeを再度送信します。一部のブラウザは、keypressイベントに関連付けられたkeyCodeとして0を送信し、charCodeプロパティに文字コードを配置します。

すべての場合において、テストからわかる限り、イベントの順序は常に予測可能です。

keydown  (event.keyCode  = key-keyCode            ex: 65 = "A")
keypress (event.keyCode  = 0 | character-keyCode  ex: 97 = "a")  - conflated model
          event.charCode =     character-keyCode                 - split model
keydown  (event.keyCode  = 229 | key-keyCode      ex: 229 | 65)  - may be repeated
keyup    (event.keyCode  = key-keyCode            ex: 65)

文字å は、多くのスカンジナビア言語で使用されています。キーボードがスウェーデン語またはフィンランド語に設定されていて、å文字(Pキーの左側)が押されたときにSafari6.1.5で受信されるイベントは次のとおりです。

EVENT    keyCode
keydown  219     ("[" key position)
keypress 229     (å)
keydown  229     (repeatedly, indicating that the Input Monitor is busy)
keyup    219

最初のキーダウンkeyCodeは229ではなく219であることに注意してください。

最初のkeydownイベントで229keyCodeを生成するには、任意の「デッドキー」を押すことができます。たとえば、Macのスウェーデン語キーボードでは、BACKSPACEキーのすぐ左にあるキーは、déjà-vuのような単語で使用されているように、 ´(アキュートアクセント)です。デッドキーを押すと、入力フィールドに文字が表示されますが、挿入ポイントは移動しません。その後、組み合わせ可能な文字を入力すると、ブラウザは最初のデッドキー文字を独自のUnicode値を持つ複合文字( ´+ e =é)に置き換える場合があります。

スウェーデン語のキーボードでユーザーが ´に続いてeを押して放したときに、Safari6.1.5に表示されるイベントは次のとおりです。

EVENT    keyCode
keydown  229 (dead key)
keyup    187 (acute accent)
keydown  229 (second key is being treated)
keyup     69 ("E")

押された「é」キー自体がないため、キー押下イベントはまったく送信されないことに注意してください。ユーザーが入力した文字を判別する場合は、2回目のキー入力が完了するまで待ってから、入力フィールドから文字を読み取ることができます。

つまり、キー押下イベントの後に229 keyCodeafterを使用すると、キーダウンイベントを無視できますが、229 keyCodeをすべて無視すると、ユーザーがさまざまな発音区別符号を追加します。

KeyCode 229の詳細については、w3.orgサイトから: キーイベントのkeyCodeプロパティ

13
James Newton