javascript - JavaScript:检查何时未按下按钮而不使用 onkeyup
问题描述
我有一个任务:
- 单击按钮时运行动画
- 按住按钮只运行一次动画
- 仅使用“onKeyDown”设备支持的唯一 dom 事件
在这里你可以看到我是如何做到这一点的例子:
let timer = null;
let isPressed = false;
const runAnimation = () => {
div.classList.remove('run-animation');
void div.offsetWidth;
div.classList.add('run-animation');
}
const fillDiv = () => {
if (!isPressed) {
isPressed = true;
runAnimation();
}
clearTimeout(timer);
timer = setTimeout(() => {
isPressed = false;
}, 50);
};
document.onkeydown = function() {
fillDiv();
}
但是这里的问题是,当你按住按钮时,动画会播放两次
是否有一些解决方案如何避免运行动画的第二次触发?
解决方案
好的,这是一种查找键是否被按住的方法。keydown事件对象包含一个名为 repeat 的属性。
如果按键已按下足够长的时间以触发按键重复,则为 true;否则为假。
我们可以检查一下。如果它是真的,我们可以直接返回而不做任何事情,否则我们可以启动fillDiv
函数。
我已经删除了所有不再需要的部分,比如isPressed
和timer
为了让它工作,我必须e
在你的事件监听器中作为参数传递,我曾经e
表示event
.
const div = document.getElementById('test');
const runAnimation = () => {
div.classList.remove('run-animation');
void div.offsetWidth;
div.classList.add('run-animation');
}
const fillDiv = () => {
runAnimation();
};
document.onkeydown = (e) => {
if (e.repeat) return;
fillDiv();
}
@-webkit-keyframes runAnimation {
from {
background-color: green;
}
to {
background-color: white;
}
}
.run-animation {
-webkit-animation: runAnimation 1.5s ease;
-webkit-animation-fill-mode: forwards;
}
.center {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
#test {
padding: 10px 17px;
display: inline-block;
border-radius: 5px;
margin: 0 auto;
}
.text {
font-size: 26pt;
}
<div id="test" class="center">
<div class="text">
Text
</div>
</div>
我希望你觉得这有帮助。
推荐阅读
- android - 我的 gridView 没有显示在 mainactivity
- javascript - 带有三元组的 Javascript 函数语法 =>
- angular-cli - 使用 @angular-builders/custom-webpack 使用 --watch 在 Angular 构建后添加任务
- ms-access - MS-Access Pro Plus 2016“无法使用”
'; 文件已在使用”Win 10 Pro 64 位 v1909 - javascript - 无法正确使用语义标签
- c# - Visual Studio 解决方案中嵌入式数据库的 SQL 连接字符串
- javascript - 模拟 javascript ES6 构造函数的可接受方式?
- google-play-console - 错误状态:在 Google Play 控制台中创建订阅时出现无人认领的错误
- c# - 将 HTTP 流量从一台 PC 重定向到另一台 PC 的任何方式
- database - Docker 容器上的 Oracle 12c 数据库,状态:不健康