Web/04-JavaScript基础/42-键盘事件.md
2022-01-02 17:38:44 +08:00

222 lines
5.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 42-键盘事件
publish: true
---
<ArticleTopAd></ArticleTopAd>
## 鼠标的拖拽事件
拖拽的流程
1`onmousedown`当鼠标在被拖拽元素上按下时开始拖拽
2`onmousemove`当鼠标移动时被拖拽元素跟随鼠标移动
3`onmouseup`当鼠标松开时被拖拽元素固定在当前位置
## 鼠标的滚轮事件
`onmousewheel`鼠标滚轮滚动的事件会在滚轮滚动时触发但是火狐不支持该属性
`DOMMouseScroll`在火狐中需要使用 DOMMouseScroll 来绑定滚动事件注意该事件需要通过addEventListener()函数来绑定
## 键盘事件
### 事件名
`onkeydown`按键被按下
`onkeyup`按键被松开
**注意**
- 如果一直按着某一个按键不松手那么`onkeydown`事件会一直触发此时松开键盘`onkeyup`事件会执行一次
- `onkeydown`连续触发时第一次和第二次之间会间隔稍微长一点后续的间隔会非常快这种设计是为了防止误操作的发生
键盘事件一般都会绑定给一些可以获取到焦点的对象或者是document代码举例
```html
<body>
<script>
document.onkeydown = function(event) {
event = event || window.event;
console.log('qianguyihao 键盘按下了');
};
document.onkeyup = function() {
console.log('qianguyihao 键盘松开了');
};
</script>
<input type="text" />
</body>
```
### 判断哪个键盘被按下
可以通过`event`事件对象的`keyCode`来获取按键的编码
此外`event`事件对象里面还提供了以下几个属性
- altKey
- ctrlKey
- shiftKey
上面这三个属性可以用来判断`alt``ctrl``shift`是否被按下如果按下则返回true否则返回false代码举例
```html
<body>
<script>
document.onkeydown = function(event) {
event = event || window.event;
console.log('qianguyihao键盘按下了');
// 判断y和ctrl是否同时被按下
if (event.ctrlKey && event.keyCode === 89) {
console.log('ctrl和y都被按下了');
}
};
</script>
</body>
```
**举例**input 文本框中禁止输入数字代码实现
```html
<body>
<input type="text" />
<script>
//获取input
var input = document.getElementsByTagName('input')[0];
input.onkeydown = function(event) {
event = event || window.event;
//console.log('qianguyihao:' + event.keyCode);
//数字 48 - 57
//使文本框中不能输入数字
if (event.keyCode >= 48 && event.keyCode <= 57) {
//在文本框中输入内容属于onkeydown的默认行为
return false; // 如果在onkeydown中取消了默认行为则输入的内容不会出现在文本框中
}
};
</script>
</body>
```
## 举例通过键盘的方向键移动盒子
代码实现
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title></title>
<style type="text/css">
#box1 {
width: 100px;
height: 100px;
background-color: red;
position: absolute;
}
</style>
</head>
<body>
<div id="box1"></div>
<script type="text/javascript">
// 使div可以根据不同的方向键向不同的方向移动
/*
* 按左键div向左移
* 按右键div向右移
* ...
*/
//为document绑定一个按键按下的事件
document.onkeydown = function(event) {
event = event || window.event;
//定义一个变量,来表示移动的速度
var speed = 10;
//当用户按了ctrl以后速度加快
if (event.ctrlKey) {
console.log('smyhvae ctrl');
speed = 20;
}
/*
* 37 左
* 38 上
* 39 右
* 40 下
*/
switch (event.keyCode) {
case 37:
//alert("向左"); left值减小
box1.style.left = box1.offsetLeft - speed + 'px'; // 在初始值的基础之上,减去 speed 大小
break;
case 39:
//alert("向右");
box1.style.left = box1.offsetLeft + speed + 'px';
break;
case 38:
//alert("向上");
box1.style.top = box1.offsetTop - speed + 'px';
break;
case 40:
//alert("向下");
box1.style.top = box1.offsetTop + speed + 'px';
break;
}
};
</script>
</body>
</html>
```
上方代码待改进的地方
1移动盒子时如果要加速需要先按`方向键`再按`Ctrl键`
2首次移动盒子时动作较慢后续如果学习了定时器相关的内容可以再改进
## 我的公众号
想学习<font color=#0000ff>**更多技能**</font>****id`qianguyihao`
扫一扫你将发现另一个全新的世界而这将是一场美丽的意外
![](http://img.smyhvae.com/20190101.png)