Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Angular 中的伪事件

Angular 中的伪事件

作者头像
Jimmy_is_jimmy
发布于 2023-08-16 00:15:26
发布于 2023-08-16 00:15:26
1.1K00
代码可运行
举报
文章被收录于专栏:call_me_Rcall_me_R
运行总次数:0
代码可运行

原文 - Angular Pseudo-Events 作者 - Shijir Tsogoo

Angular 提供了一个巧妙的小功能,用于简化监听键盘事件的过程。尽管在 Angular 模版绑定文档中提到了伪事件 pseudo-event,但是在其他地方没有进一步的文档说明。深入之前,我们看看 Angular 中的伪事件解决了什么问题。我们简单举个例子,假设你需要添加一个 UNDO 命令来切换复选框。UNDO 命令是恢复用户的上一个选择。

如同我们在自己电脑上执行 UNDO 指令一样,指令应该根据 CTRL+Z 组合做出响应。下面的案例展示我们是怎么使用非伪事件实现的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// app.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: 'app.component.html'
})
export class AppComponent {
  onKeydown(event: KeyboardEvent) {
    if(event.key == "z" && event.ctrlKey) {
      event.target.checked = !event.target.checked;
    }
  }
}

译者加:在 mac 平台上不起效

正如上面案例所示,我们监听 KeyboardEvent.key 来检查哪个按键被敲击。当然,还有很多 KeyboardEvent 的属性可以用来检查和捕获按键,比如 KeyboardEvent.key, KeyboardEvent.charCode, KeyboardEvent.keyCode 或者 KeyboardEvent.which。然而,它们中有些是被抛弃或者浏览器并不支持。并且,我们监听的组合键越多,语法越复杂。

Angular 伪事件将解决上面的担忧。通过伪事件,Angular 允许你直接绑定指定按键或者按键组合。这意味着,键盘事件只会通过特定键或者组合键上触发,而不是所有键盘事件上都触发。如下,是一个关于怎么在模版中声明伪事件的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (keyup.enter) ='...responds to enter...' />

<input (keydown.esc) ='...responds to escape...' />

<input (keyup.shift.f) ='...responds to shift+f...' />

现在,让我们看看伪事件如何帮助我们监听 CTRL+Z 键盘组合:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// app.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: 'app.component.html'
})
export class AppComponent {
  toggle(checkbox: HTMLElement) {
    checkbox.checked = !checkbox.checked;
  }
}

正如你所见,我们不再需要检查哪些按键事件被注册,因为我们制定了处理程序的应该响应的组合键,而且语法变得更加声明性。

在 @HostListener 中使用 Pseudo-Events

如同其他 DOM 事件,你可以通过 @HostListener 监听伪事件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@HostListener('keydown.control.z') 
undo(event: KeyboardEvent) {
  // responds to control+z
}

当然,如果宿主元素不可获取焦点,或者无论事件来自何处,你都要捕获键盘事件,你可以将事件绑定到全局元素,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@HostListener('document:keydown.control.z')
undo(event: KeyboardEvent) {
  // responds to control+z
}

Pseudo-Events 的键名

现在,我们看看键组合伪事件的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (keydown.control.shift.z)='...' />

你可能疑惑这些键名(比如: control, shiftz)来自哪里?它们并不是 Angular 伪元素独有的。实际上,它们是 KeyboardEvent 小写的键属性。如果你想查键盘事件属性值完整的列表,请移步参考。现在,让我们来查看一下可用于 Angular 伪事件的键值。

Modifier Keys

修饰键(Modifier Keys)包括 ShiftControlAlt(Option)Meta(Command)。从现在开始,我们会把其他键称为非修饰键。修饰键伪事件的示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (keyup.control)='...respond to ctrl/control...' />

<input (keyup.alt)='...respond to alt/option...' />

<input (keyup.shift)='...respond to shift...' />

<input (keyup.meta)='...respond to command...' />

Angular 中使用伪事件,有几个点需要我们记住。

第一,任何组合键都必须有至少一个修饰键,但是只有一个非修饰键。 比如,下面的案例将不会起作用,因为组合键只是由字母组成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (keyup.a.z)='...responds to a+z...' />

第二,非组合键必须放在组合键的最后定义。 下面是一个正确的放置案例,因为非修饰键 Z 放在最后定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (**keydown.control.z**)='...responds to control+z...' />

相比之下,下面这个例子中修饰键放置的位置不对:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (keydown.z.control)='...won't respond at all...' />

第三,修饰键之间的顺序并不影响。 所以,我们可以根据自己的需要放置。下面的案例展示了有效的用例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (**keydown.shift.control.z**)='...responds to shift+control+z...' /> 

<input (**keydown.control.shift.z**)='...responds to control+shift+z...' />

接下来,我们看看非修饰键的示例。

Functional keys
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (keyup.f5)='...responds to F5...' />

<input (keyup.f12)='...responds to F12...' />
Number 和 letter keys
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (keyup.0)='...responds to 0...' />

<input (keyup.9)='...responds to 9...' />

<input (keyup.a)='...responds to a...' />

<input (keyup.z)='...responds to z...' />
Arrow keys
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (**keyup.arrowup**)='...responds to arrowup...' />  
  
<input (**keyup.arrowright**)='...responds to arrowright...' />

Other keys

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (keyup.enter)='...responds to enter...' />

<input (keyup.esc)='...responds to escape...' /> 

<input (keyup.escape)='...responds to escape...' />

<input (keyup.backspace)='...responds to backspace...' />

<input (keyup.tab)='...responds to tab...' />

到目前,只有两个键没提及:DotSpace。当你点击 dot 键的时候,KeyboardEvent.key 的属性值是 "."。但是,我们可以想象下,如果在伪事件中使用点作为分隔符,它在语法上是不正确的。这就是为什么它被映射为 "dot" 关键字。所以,我们需要按照下面的方式正确监听 Dot 按键:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (**keydown.dot**)='...responds to dot...'/>

而不是...

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (keydown.. )='...won't respond at all...'/>

Space 按键同理。因为它的 KeyboardEvent.key 是空 "",映射为 "space" 关键字可读性更高。所以不是这种写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (keydown. )='...won't respond at all...'/>

而是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (keydown.space)='...won't respond at all...'/>

不幸的是,Angular 伪事件在大多数字符号键(如减号,等号,斜杆,左括号,右括号,反向号等)上仍然缺乏这种映射。由于它们是符号键,这导致非常差的可读性,有时候会破坏绑定本身。例如,我们想监听 Minus 减号按键,我们只能按照下面这种方式进行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (keydown.-)='...responds to minus...'/>

正如你所见,这看起来很怪异或者语法错误,但是它可行。如果它映射成 "minus" 可读性更高。等号按键呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input (keydown.=)='...breaks the binding...'/>

如果你尝试按照上面的方式监听 Equal 等号按键,它会破坏我们模版绑定,因为它没有与之对应的 "equal" 关键字映射。

尽管符号键存在一些小缺点,但是 Angular 伪事件是一个非常棒的功能,能够满足大多数监听键盘事件的需求。我相信在任何 Angular 应用中使用它可以使实现键盘辅助功能和交互的过程更加简单。

阅读本文后,我希望你已经对 Angular 伪事件有一定的了解。

译者加:某些伪事件在平台上绑定有一定差异,比如在 mac 上绑定 document:keydown.control.arrowright 不生效,在 window 上则生效

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Vue 3 事件处理
页面上会有很多的页面交互,例如用户点击按钮,会触发什么样的事件,这个事件要做什么事情,就会涉及到事件处理。
公众号---人生代码
2020/11/03
2.2K0
Vue 3 事件处理
angular 常用事件
输入框的内容改变并不代表model的值更新。按我的理解,一般当两个状态互相切换时,model值会更新。两个状态我称之为合法状态和不合法状态。
kl博主
2023/11/17
2560
Python之pygame学习键盘事件操作(9)
pygame中事件模块是pygame.event,官方说法是用于与事件和队列进行交互。
萌海无涯
2019/08/20
16.4K0
Python之pygame学习键盘事件操作(9)
22. Vue keycodes按键修饰符
在业务开发中,例如:用户登录添加用户名和密码之后,按下回车键完成登录,这个操作就需要绑定按键的keyup事件,并且还要使用按键修饰符来指定按下的键盘按钮。
Devops海洋的渔夫
2020/03/19
2.1K0
【python自动化】Playwright基础教程(七)Keyboard键盘
selenium&playwright获取网站Authorization鉴权实现伪装requests请求
梦无矶小仔
2023/09/27
1.7K0
【python自动化】Playwright基础教程(七)Keyboard键盘
18. Vue keycodes按键修饰符
在业务开发中,例如:用户登录添加用户名和密码之后,按下回车键完成登录,这个操作就需要绑定按键的keyup事件,并且还要使用「按键修饰符」来指定按下的键盘按钮。
Devops海洋的渔夫
2022/01/17
7750
18. Vue keycodes按键修饰符
十四.Vue事件处理
十四.Vue事件处理
Java架构师必看
2021/05/14
1.9K0
十四.Vue事件处理
从零开始学VUE之模板语法(事件监听)
Vue.js 为 v-on 提供了事件修饰符来处理 DOM 事件细节,如:event.preventDefault() 或 event.stopPropagation()。
彼岸舞
2021/06/07
2.3K0
从零开始学VUE之模板语法(事件监听)
【音视频连载-003】基础学习篇-SDL 消息循环和事件响应
为了让窗口显示出来,在程序中写了一个死循环,这几行代码就是 SDL 消息循环和事件响应的核心缩影了。
音视频开发进阶
2020/03/10
1.4K0
【音视频连载-003】基础学习篇-SDL 消息循环和事件响应
Python如何接收键盘按键
在许多编程场景中,接收并响应用户输入是至关重要的。Python作为一种流行的编程语言,具有许多灵活的方法来处理键盘输入。本文将介绍如何使用Python来监听和响应键盘按键,从基础的概念到实际的代码示例。
霍格沃兹测试开发Muller老师
2024/03/19
9890
软件测试|web自动化测试神器playwright教程(二十四)
我们在使用selenium进行自动化测试的过程中,遇到输入框时,我们可以使用send_keys()输入内容,也可以使用键盘事件向输入框内输入内容,只是使用键盘事件时需要导入Keys,作为一款强大的工具,selenium有的功能,playwright也有,playwright同样可以使用键盘输入内容,本篇文章就来为大家介绍一下playwright的键盘事件。
霍格沃兹测试开发Muller老师
2023/08/01
4430
v-on绑定的一系列事件修饰符
官方文档看-->https://cn.vuejs.org/v2/guide/events.html
名字是乱打的
2021/12/22
2.5K0
一、Vue2笔记--基础篇--07-事件处理
打不着的大喇叭
2024/03/11
3630
vue常用的修饰符有哪些?
在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 。你可以添加 lazy 修饰符,从而转变为使用 change 事件进行同步:
Javanx
2020/08/10
3K0
JQuery事件
       focus()                 ------获得焦点事件
用户3159471
2018/09/13
2.6K0
【愚公系列】《循序渐进Vue.js 3.x前端开发实践》018-Vue中的事件类型
在构建现代 web 应用时,事件处理是实现用户交互的核心要素之一。Vue 作为一个流行的前端框架,为开发者提供了一系列强大而灵活的事件处理机制。这使得我们能够方便地响应用户的操作,从而提升应用的互动性和用户体验。
愚公搬代码
2025/07/03
1490
react 监听键盘事件 hook
import { useCallback, useEffect, MutableRefObject } from "react"; type keyType = KeyboardEvent["keyCode"] | KeyboardEvent["key"]; type keyFilter = keyType | Array<keyType>; type EventHandler = (event: KeyboardEvent) => void; type keyEvent = "keydown" | "k
小鑫
2022/04/25
2.3K0
[Vue 牛刀小试]:第六章 - 按键修饰符的使用
   上周末的时候,准备试试将 ASP.NET Core 的项目部署到 CentOS 服务器上,结果在一个接一个坑里面跳,最后 Supervisor 守护程序还是有问题,于是,采用重装系统大招,结果,碰巧赶上 aspnetcore 的一个 bug( Missing package dotnet-runtime 2.1.6 for CentOS),嗯,最后 dotnet core 环境装不上了,原本打算更新的 .NET Core 文章以及日常的 Vue 学习计划也暂时搁浅了。
程序员宇说
2019/09/11
1K0
[Vue 牛刀小试]:第六章 - 按键修饰符的使用
一些你可能还不知事件技巧– Vue3更新
Vue事件处理是每个Vue项目的必要方面。它用于捕获用户输入,共享数据以及许多其他创造性方式。
@超人
2021/07/05
7930
25 修饰键盘事件与鼠标事件
一般js监听键盘事件,例如keyup,无论用户是按下哪个键,例如a/b/c,事件函数都会触发。vue为了简化开发,对键盘事件、鼠标事件,提供了修饰符,方便只在用户按下某个特定键值时触发函数。
LIYI
2020/02/13
3K0
25 修饰键盘事件与鼠标事件
相关推荐
Vue 3 事件处理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验