JS之鼠标与键盘事件
一、鼠标的拖拽事件
拖拽的流程:
(1)`onmousedown`:当鼠标在被拖拽元素上按下时,开始拖拽;
(2)`onmousemove`:当鼠标移动时被拖拽元素跟随鼠标移动;
(3)`onmouseup`:当鼠标松开时,被拖拽元素固定在当前位置。
鼠标的滚轮事件
`onmousewheel`:鼠标滚轮滚动的事件,会在滚轮滚动时触发。但是火狐不支持该属性。
`DOMMouseScroll`:在火狐中需要使用 DOMMouseScroll 来绑定滚动事件。注意该事件需要通过addEventListener()函数来绑定。
二、键盘事件
1、事件名
`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>
```
2、判断哪个键盘被按下
可以通过`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>
```
keyCode 8 = BackSpace BackSpace keyCode 9 = Tab Tab keyCode 12 = Clear keyCode 13 = Enter keyCode 16 = Shift_L keyCode 17 = Control_L keyCode 18 = Alt_L keyCode 19 = Pause keyCode 20 = Caps_Lock keyCode 27 = Escape Escape keyCode 32 = space keyCode 33 = Prior keyCode 34 = Next keyCode 35 = End keyCode 36 = Home keyCode 37 = Left keyCode 38 = Up keyCode 39 = Right keyCode 40 = Down keyCode 41 = Select keyCode 42 = Print keyCode 43 = Execute keyCode 45 = Insert keyCode 46 = Delete keyCode 47 = Help keyCode 48 = 0 equal braceright keyCode 49 = 1 exclam onesuperior keyCode 50 = 2 quotedbl twosuperior keyCode 51 = 3 section threesuperior keyCode 52 = 4 dollar keyCode 53 = 5 percent keyCode 54 = 6 ampersand keyCode 55 = 7 slash braceleft keyCode 56 = 8 parenleft bracketleft keyCode 57 = 9 parenright bracketright keyCode 65 = a A keyCode 66 = b B keyCode 67 = c C keyCode 68 = d D keyCode 69 = e E EuroSign keyCode 70 = f F keyCode 71 = g G keyCode 72 = h H keyCode 73 = i I keyCode 74 = j J keyCode 75 = k K keyCode 76 = l L keyCode 77 = m M mu keyCode 78 = n N keyCode 79 = o O keyCode 80 = p P keyCode 81 = q Q at keyCode 82 = r R keyCode 83 = s S keyCode 84 = t T keyCode 85 = u U keyCode 86 = v V keyCode 87 = w W keyCode 88 = x X keyCode 89 = y Y keyCode 90 = z Z keyCode 96 = KP_0 KP_0 keyCode 97 = KP_1 KP_1 keyCode 98 = KP_2 KP_2 keyCode 99 = KP_3 KP_3 keyCode 100 = KP_4 KP_4 keyCode 101 = KP_5 KP_5 keyCode 102 = KP_6 KP_6 keyCode 103 = KP_7 KP_7 keyCode 104 = KP_8 KP_8 keyCode 105 = KP_9 KP_9 keyCode 106 = KP_Multiply KP_Multiply keyCode 107 = KP_Add KP_Add keyCode 108 = KP_Separator KP_Separator keyCode 109 = KP_Subtract KP_Subtract keyCode 110 = KP_Decimal KP_Decimal keyCode 111 = KP_Divide KP_Divide keyCode 112 = F1 keyCode 113 = F2 keyCode 114 = F3 keyCode 115 = F4 keyCode 116 = F5 keyCode 117 = F6 keyCode 118 = F7 keyCode 119 = F8 keyCode 120 = F9 keyCode 121 = F10 keyCode 122 = F11 keyCode 123 = F12 keyCode 124 = F13 keyCode 125 = F14 keyCode 126 = F15 keyCode 127 = F16 keyCode 128 = F17 keyCode 129 = F18 keyCode 130 = F19 keyCode 131 = F20 keyCode 132 = F21 keyCode 133 = F22 keyCode 134 = F23 keyCode 135 = F24 keyCode 136 = Num_Lock keyCode 137 = Scroll_Lock keyCode 187 = acute grave keyCode 188 = comma semicolon keyCode 189 = minus underscore keyCode 190 = period colon keyCode 192 = numbersign apostrophe keyCode 210 = plusminus hyphen macron keyCode 211 = keyCode 212 = copyright registered keyCode 213 = guillemotleft guillemotright keyCode 214 = masculine ordfeminine keyCode 215 = ae AE keyCode 216 = cent yen keyCode 217 = questiondown exclamdown keyCode 218 = onequarter onehalf threequarters keyCode 220 = less greater bar keyCode 221 = plus asterisk asciitilde keyCode 227 = multiply division keyCode 228 = acircumflex Acircumflex keyCode 229 = ecircumflex Ecircumflex keyCode 230 = icircumflex Icircumflex keyCode 231 = ocircumflex Ocircumflex keyCode 232 = ucircumflex Ucircumflex keyCode 233 = ntilde Ntilde keyCode 234 = yacute Yacute keyCode 235 = oslash Ooblique keyCode 236 = aring Aring keyCode 237 = ccedilla Ccedilla keyCode 238 = thorn THORN keyCode 239 = eth ETH keyCode 240 = diaeresis cedilla currency keyCode 241 = agrave Agrave atilde Atilde keyCode 242 = egrave Egrave keyCode 243 = igrave Igrave keyCode 244 = ograve Ograve otilde Otilde keyCode 245 = ugrave Ugrave keyCode 246 = adiaeresis Adiaeresis keyCode 247 = ediaeresis Ediaeresis keyCode 248 = idiaeresis Idiaeresis keyCode 249 = odiaeresis Odiaeresis keyCode 250 = udiaeresis Udiaeresis keyCode 251 = ssharp question backslash keyCode 252 = asciicircum degree keyCode 253 = 3 sterling keyCode 254 = Mode_switch
三、举例
**举例**: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)首次移动盒子时,动作较慢。后续如果学习了定时器相关的内容,可以再改进。

浙公网安备 33010602011771号