javascript - 输入时如何禁用热键?
问题描述
当用户按下某个键时,会显示一个组件。我有四个这样的组件。当用户键入或编辑时,我想禁用热键。
我在四个组件中都有这个代码
componentDidMount(){
document.body.addEventListener("keypress", (e) => {
if (e.key === "t") { // "n" "w" "," for the others
this.setState({opened: !this.state.opened});
}
});
}
我只想在用户键入或编辑时禁用热键。有没有办法知道是否有任何输入成为焦点?或者另一种方式,只有当所有输入都“模糊”时,我们才能添加事件侦听器?
解决方案
所以我们需要知道页面上是否有任何输入是焦点,如果它们中的任何一个是焦点,那么我们就不会做任何事情来显示或隐藏组件。
假设我们的组件在 state 中有一些属性,表示页面上的某些输入是焦点,我们称之为isFocus
。
因此,我们需要收集页面上的所有输入,遍历它们并为每个输入分配focus
事件blur
处理程序,以便我们能够知道何时更改isFocus
状态中的属性。
首先,我们需要收集页面上的所有输入,我们这样做:
const inputs = document.getElementsByTagName('input')
.
遍历它们并分配focus
和blur
事件处理程序:
for (let input of inputs) {
input.addEventListener('focus', () => this.setState({isFocus: true}));
input.addEventListener('blur', () => this.setState({isFocus: false}));
}
最后,让我们更改keypress
事件的条件:
document.addEventListener('keypress', e => {
if (!this.state.isFocus && e.key === "t") {
this.setState({opened: !this.state.opened});
}
});
一切都将如下所示:
componentDidMount() {
const inputs = document.getElementsByTagName('input');
for (let input of inputs) {
input.addEventListener('focus', () => this.setState({isFocus: true}));
input.addEventListener('blur', () => this.setState({isFocus: false}));
}
document.addEventListener('keypress', e => {
if (!this.state.isFocus && e.key === "t") {
this.setState({opened: !this.state.opened});
}
});
}
希望这可以帮助。祝你好运。
推荐阅读
- next.js - 在 Axios 拦截器下捕获 400 和 500 用于哨兵
- puppeteer - Crawlera & Puppeteer - HTTPS 中的身份验证问题
- python - 自动运行 python-pygame 脚本不输出声音
- amazon - 通过亚马逊 ASIN 获取 EAN
- loops - awk 语法 '||' 没有'if' - 它是如何工作的,为什么它会循环?
- android - 如何在活动旋转时保存/恢复 MotionLayout 的状态
- c - 我的代码“忽略”多个正确的显示并选择它捕获的第一个
- c# - 使用回调调用本机代码时出现 System.EngineExecutionException
- symfony - 从 Symfony 中的动态 ID 获取服务
- mysql - 为什么我的 SQL 查询会产生不同的顺序?