Кросс-браузерный обработчик ключевых событий в Dart

Я использую релиз 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. Должен быть лучший способ справиться с пробелом и все еще держать его в одном переключателе, верно? Я знаю, что могу посмотреть на другие поля, чтобы получить место, но это тоже не очень хорошая альтернатива (с тех пор я бы разделил код на два оператора 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?

2 ответа

Решение

На основании вашего вопроса, другого ответа, этого исходного кода и этой ошибки (которую вы должны отметить), вот мои рекомендации:

  • Используйте keyCode.
  • Не бойтесь использовать if/else if вместо оператора switch, если вам нужно. В JavaScript все равно нет оптимизированных операторов switch.
  • Пока эта ошибка не будет исправлена, вы, вероятно, должны просто создать свои собственные константы.

Обновлено: это было исправлено.

Я думаю, что это похоже на проблему. По-видимому, KeyIdentifier возвращает ноль в Firefox.

Кстати, вместо "U+0020" вы можете использовать KeyName.SPACEBAR

Другие вопросы по тегам