Кросс-браузерный обработчик ключевых событий в 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