javascript - JS如何处理键盘事件
问题描述
我的任务是分别在按下向上和向下箭头键时增加和减小“气球”的大小。我已将其设置为
HTML 中的标签,当按下这些键时,它必须将字体大小设置为更大或更小 10%。然而它不起作用。大小保持不变。
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Event tasks</title>
</head>
<body>
<p style="font-size: 24px;"></p>
<button id="temp">Temp</button>
<script src="tasks.js"></script>
</body>
</html>
JS:
const balloon = document.querySelector('p');
const defaultSize = balloon.style.fontSize;
balloon.addEventListener('keydown', event => {
let size = balloon.style.fontSize;
if (event.key == 'ArrowUp') {
/*size += 0.1 * size;
balloon.style.fontSize = size + 'px';*/
setSize(size * 1.1);
event.preventDefault();
}
else if (event.key == 'ArrowDown') {
while (size > defaultSize) {
/*size -= 0.1 * size;
balloon.style.fontSize = size + 'px';*/
setSize(size * 0.9);
event.preventDefault();
}
}
});
function setSize(newSize) {
size = newSize;
balloon.style.fontSize = size + "px";
}
document.getElementById('temp').addEventListener('click', () => {
setSize(40);
});
我为包含气球符号和起始大小的 p 元素设置了一个常量,以便在减小其大小时使用,这样它就不会超过某个大小。接下来只是监听事件,如果键是 ArrowUp(我尝试使用 Arrow Up 的编号,但它也不起作用)然后增加大小,或者如果它是 ArrowDown,则减小大小。我还覆盖了默认行为,因为我不确定它是什么。setSize 函数是临时的,就像按钮一样,用于查看是我没有正确编写大小增加过程还是其他问题。
解决方案
像这样尝试(首先单击片段内部,使其具有焦点):
const balloon = document.querySelector('p');
const defaultSize = parseFloat(balloon.style.fontSize);
let size = defaultSize;
window.addEventListener('keydown', event => {
if (event.key == 'ArrowUp') {
/*size += 0.1 * size;
balloon.style.fontSize = size + 'px';*/
setSize(size * 1.1);
event.preventDefault();
}
else if (event.key == 'ArrowDown') {
if (size > defaultSize) {
/*size -= 0.1 * size;
balloon.style.fontSize = size + 'px';*/
setSize(size * 0.9);
event.preventDefault();
}
}
});
function setSize(newSize) {
size = newSize;
balloon.style.fontSize = size + "px";
}
document.getElementById('temp').addEventListener('click', () => {
setSize(40);
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Event tasks</title>
</head>
<body>
<p style="font-size: 24px;"></p>
<button id="temp">Temp</button>
<script src="tasks.js"></script>
</body>
</html>
变化:
size
在事件处理程序之外定义,因此当前大小是已知的defaultSize
并且size
是数字(而不是 eg'24px'
)- 附加事件处理程序
window
以便keydown
事件注册 - 对于
'ArrowDown'
,使用if
条件而不是while
循环检查大小。
推荐阅读
- python - 将文件路径传输到另一个类并将项目添加到列表
- delphi - 为什么在抑制 WM_PASTE 后数据集的状态会更改为 dsEdit?
- reactjs - 使用 catch 在 redux-saga 中进行 Rest API axios 错误处理
- r - 将值与列名组合为新列
- java - 处理大量输入数据时出现 StackOverflow 错误
- vba - 基于模板的电子邮件中丢失的 HTML 格式
- docker-swarm - docker swarm 如何杀死不健康的容器
- javascript - 在网页上以展开模式在谷歌地图中显示表单
- sql - 根据数量列中的值将行拆分为多行
- json - C# - 根据 Schema 验证 json。json中哪里出现错误?