如何在Dart Web UI中处理按键Enter?

6

我希望使用Dart的Web UI,在输入框中声明性地监听ENTER键按下事件。我只想在按下ENTER键时运行一个方法,而不关心其他任何键。

我该怎么做?

2个回答

18

摘要

Dart的Web UI包可以声明性地注册各种事件处理程序,例如click和keyUp等。 keyUp事件将为每个键盘抬起事件触发。为了过滤这些事件,并仅侦听特定键,您需要查看keyCode属性。幸运的是,Dart具有用于规范化浏览器中键代码的方便类。您可以在声明性绑定属性中使用所有这些内容。继续阅读以了解更多!

监听按键

InputElement类具有用于keyUp事件的事件流,称为onKeyUp (docs) 。onKeyUp流会发出KeyboardEvent (doc)实例。

final Stream<KeyboardEvent> onKeyUp;

老式的办法

KeyboardEvent 提供了 keyCode 访问器,返回系统特定的按键代码。不幸的是,某些系统对于相同语义按键有不同的按键代码。幸运的是,Dart 有解决方法!

新潮的做法

使用 KeyEvent.wrap(KeyboardEvent parent) (doc) 模拟 KeyEvent 并且规范混淆的按键代码!

new KeyEvent.wrap(keyboardEvent)

现在您拥有一个KeyEvent实例,可以查询其keyCode以了解按下了哪个键。 keyCode getter返回一个int,但您可以将其与KeyCode (doc)类中的键列表进行比较。

var keyEvent = new KeyEvent.wrap(keyboardEvent);
if (keyEvent.keyCode == KeyCode.ENTER) {
  // enter was pressed
}

跨浏览器按键操作 FTW

KeyEventKeyCode 类可以帮助统一不同系统和浏览器的按键代码,因此您无需担心各种不兼容性。

使用 Web UI

Web UI 允许您声明式地注册事件处理程序。您可以监听按键事件并检查是否按下了 Enter 键。以下是一个示例:

<input type="text" id="new-todo" on-key-up="if (new KeyEvent($event).keyCode == KeyCode.ENTER) createNewTodo()">

注意on-key-up如何注册if语句,该语句使用KeyEventKeyCode来规范化键码。只有在按下回车键时才会调用createNewTodo方法。

Ta da!


这是一个非常有用的模式。 - adam-singer
1
我想说的是"on-key-enter"。因此,我打开了这个网址:https://github.com/dart-lang/web-ui/issues/357 - Seth Ladd
1
很好的答案,我只想补充一点,如果你有一个或多个输入字段和一个提交按钮的情况,那么你也可以监听表单的“submit”事件。这样,你就不需要显式地监听回车键按下和按钮点击事件,并且它还涵盖了所有其他边缘情况,比如在提交按钮上聚焦时通过按下“空格”来提交表单等 :) - tosh
我该如何确定需要哪个keyboardEvent?`异常:未声明顶级getter 'get:keyboardEvent'。NoSuchMethodError:找不到方法:'get:keyboardEvent' 接收器:顶级 参数:[...]` - David Notik
如果你想实现类似 CTRL+L 这样的功能,你应该添加常量吗?if(keyEvent.keyCode == KeyCode.CTRL + KeyCode.L)... 对我似乎没有起作用。 - Peril Ravine

6

这不是Web UI,而是另一种监听和使用键盘输入的方法。

1)监听按键:

void main() {
  ...    
  input.onKeyPress.listen(handleKeyEvent);    
  ...
}

2) 使用KeyEvent.wrap(keyboardEvent)构造函数将生成的KeyboardEvent转换为KeyEvent。然后,您可以通过比较您的KeyEvent.keyCode与KeyCode.Enter来执行如上操作:

void handleKeyEvent(KeyboardEvent event) {
  KeyEvent keyEvent = new KeyEvent.wrap(event);
  if (keyEvent.keyCode == KeyCode.ENTER) {
    handleInput();       
  }   
}

使用Dart VM版本1.13.2,KeyboardEvent现在有一个keyCode getter。不再需要包装。 - TastyCatFood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接