2

私はM1リリースを使用しており、次のようなキーハンドラーを作成しました。

void _onKeyPress(KeyboardEvent e) {
  switch (e.keyIdentifier) {
    case KeyName.UP:
    case KeyName.LEFT:
      e.preventDefault();
      prev();
      break;

    case "U+0020": // FIXME Must be a better way, or?
    case KeyName.DOWN:
    case KeyName.RIGHT:
      e.preventDefault();
      next();
      break;
  }
}

Chromeでは正常に動作しますが、FFやIEでは動作しません。スペースバーを処理し、それでも1つのスイッチに収めるより良い方法があるはずですよね?スペースを確保するために他のフィールドを調べることができることは知っていますが、それも良い選択肢ではありません(それ以来、コードを2つのswitchステートメントに分割します)。とにかく、FFとIEで機能しないという問題はさらに深刻です。 。代わりに使用するように書き直すとkeyCode、すべてのブラウザで正常に機能します。

void _onKeyPress(KeyboardEvent e) {
  switch (e.keyCode) {
    case 38:
    case 37:
      e.preventDefault();
      prev();
      break;

    case 32:
    case 40:
    case 39:
      e.preventDefault();
      next();
      break;
  }
}

私の問題は、仮想キーコードの定数が見つからないことです。私は何か間違ったことをしていますか?Dartで互換性のあるクロスブラウザの主要なイベントを処理するための最良の方法は何ですか?

4

2 に答える 2

1

あなたの質問、他の回答、このソース コード、およびこのバグ(スターを付ける必要があります) に基づいて、ここに私の推奨事項があります。

  • キーコードを使用します。
  • 必要に応じて、switch ステートメントの代わりに if/else if を使用することを恐れないでください。とにかく、JavaScript には最適化された switch ステートメントがありません。
  • このバグが修正されるまでは、独自の定数を作成する必要があります。

更新: これは修正されました。

于 2012-10-30T22:28:25.857 に答える
0

これは、この問題と同様の問題だと思います。どうやら、KeyIdentifier は Firefox で null を返します。

ところで、「U+0020」の代わりにKeyName.SPACEBARを使用できます

于 2012-10-30T19:10:41.190 に答える