Appearance
事件对象
定义一个形参 EV 用来接收方法执行的时候,浏览器传递的信息值(事件对象:MouseEvent 鼠标事件对象、KeyboardEvent 键盘事件对象、Event 普通事件对象...)
事件对象中记录了很多属性名和属性值,这些信息中包含了当前操作的基础信息,例如:鼠标点击位置的 X/Y 轴坐标,鼠标点击的是谁(事件源)等信息
MouseEvent
javascript
box.onclick = function (ev) {
//[MouseEvent]
// ev.target:事件源(操作的是哪个元素)
// ev.clientX / ev.clientY :当前鼠标触发点距离当前窗口左上角的X/Y轴坐标
// ev.pageX / ev.pageY:当前鼠标触发点距离BODY(第一屏幕)左上角的X/Y轴坐标
// ev.preventDefault():阻止默认行为
// ev.stopPropagation():阻止事件的冒泡传播
// ev.type:当前事件类型
};
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
KeyboardEvent
javascript
box.onclick = function (ev) {
//[KeyboardEvent]
// ev.code:当前按键'keyE'
// ev.key:当前按键'e'
// ev.which / ev.keyCode:当前按键的键盘码 69
// let code = ev.which || ev.keyCode;
//=>常用的键盘码
/*
* 左-上-右-下:37-38-39-40
* Backspace:8
* Enter:13
* Space:32
* Delete:46
*
* Shift:16
* Alt:18
* Ctrl:17
* ESC:27
*
* F1~F12:112 ~ 123
* 48~57:数字键
* 65~90:小写字母
*/
};
tempInp.onkeydown = function (ev) {
console.log(ev.which);
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
IE6-8 ev
在 IE 低版本浏览器中,浏览器执行绑定的方法,并没有把事件对象传递进来,此时 ev===undefined,需要基于 window.event 来获取(由于是全局属性,鼠标每次操作都会把上一次操作的值替换掉)
javascript
box.onclick = function (ev) {
if (!ev) {
// => 低版本中没有的属性,我们手动设置一下:按照自己有的先获取到值,然后赋值给和标准对应的新属性(经过判断处理后,低版本中也有TARGET/PAGE-X/PAGE-Y这些属性了),后期再使用的时候,直接按照高版本的使用即可
ev = window.event;
// console.log(ev.srcElement);//=>ev.srcElement是获取事件源(标准中使用的是ev.target)
ev.target = ev.srcElement;
// console.log(ev.pageX);//=>低版本浏览器的事件对象中不存在pageX/pageY
ev.pageX =
ev.clientX +
(document.documentElement.scrollLeft || document.body.scrollLeft);
ev.pageY =
ev.clientY +
(document.documentElement.scrollTop || document.body.scrollTop);
ev.which = ev.keyCode;
// preventDefault & stopPropagation 这些在低版本下都没有
ev.preventDefault = function () {
ev.returnValue = false; //=>低版本阻止默认行为
};
ev.stopPropagation = function () {
ev.cancelBubble = true; //=>低版本阻止冒泡传播
};
}
//=>直接按照高版本的规则来使用即可
console.log(ev.target, ev.which);
ev.preventDefault();
ev.stopPropagation();
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
兼容写法
javascript
box.onclick = function (ev) {
// => 用到谁给谁处理兼容
ev = ev || window.event;
var target = ev.target || ev.srcElement;
ev.preventDefault ? ev.preventDefault() : (ev.returnValue = false);
};
1
2
3
4
5
6
2
3
4
5
6
总结
- 事件对象是用来存储当前本次操作的相关信息,和操作有关,和元素无必然关联
- 当我们基于鼠标或者键盘等操作的时候,浏览器会把本次操作的信息存储起来(标准浏览器存储到默认的内存中(自己找不到),IE 低版本存储到 window.event 中了),存储的值是一个对象(堆内存);操作肯定会触发元素的某个行为,也就会把绑定的方法执行,此时标准浏览器会把之前存储的对象(准确来说是堆内存地址)当做实参传递给每一个执行的方法,所以操作一次,即使再多方法中都有 EV,但是存储的值都是一个(本次操作信息的对象而已)