JavaScript事件高级
注册事件
「1.1注册事件概述」
给元素添加事件,称为注册事件或者绑定事件
注册事件有两种方式,传统方式和方法监听注册方式
传统注册方式
<button onclick="alert('hi')"></button>btn.onclick = function() { }
特点:
- 注册事件的唯一性
- 同一元素同一事件只能设置一个处理函数,最后注册的处理函数会覆盖前面注册的处理函数
方法监听注册方式
addEventListener()- attachEvent() //IE9之前
特点:
- W3C标准推荐方式
- 同一元素同一事件可以注册多个监听器
- 按注册顺序依次执行
「1.2 addEventListener 事件监听方式」
1 | eventTarget.addEventListener(type, listener, useCapture) |
eventTarget.addEventListener() 方法将指定的监听器注册到eventTarget(目标对象)上,当该对象触发指定事件时,就会执行事件处理函数
该方法接收三个参数:
- type:事件类型字符串,比如click,mouseover,注意这里不要带on
- listener:事件处理函数,事件发生时,会调用该监听函数
- useCapture:可选参数,是一个布尔值,默认false,DOM事件流会详细介绍
1 | <button>测试按钮0</button> |
「1.3 attachEvent事件监听方式」(不重要)
1 | eventTarget.attachEvent(eventNameWithon, callback) |
eventTarget.attachEvent()方法将指定的监听器注册到eventTarget(目标对象)上,当该对象触发指定的事件时,指定的回调函数就会被执行。
该方法接收两个参数:
- eventNameWithOn: 事件类型字符串,比如onclick,onmouseover, 这里要带on
- callback: 事件处理函数,当目标触发事件时回调函数被调用
「1.4 注册事件兼容性解决方案」
兼容性处理原则:首先照顾大多数浏览器,在处理特殊浏览器
删除事件
「2.1删除事件的方法」
1.传统注册方式
eventTarget.onclick = null
2.方法监听注册方式
- eventTarget.removeEventListener(type, listener, uesCapture);
- eventTarget.detaEvent(eventNameWithOn, callback);
「2.2删除事件兼容性解决方案」
DOM事件流
我们想水里面扔一块石头,首先它会有一个下降的过程,这个过程就可以理解为从最顶层向事件发生的最具体元素(目标点)的捕获过程;之后会产生泡泡,会在最低点(最具体的元素)之后漂浮到水面上,这个过程相当于事件冒泡。

官方描述
事件流描述的时页面中接收事件的顺序
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流
比如我们给div注册了一个点击事件,DOM的事件流就分三个阶段:
- 捕获阶段
- 当前目标阶段
- 冒泡阶段就

注意:
- 事件发生时,会在元素节点之间按照特定的顺序传播,这个传播过程即DOM 事件流
- js代码中只能执行捕获或者冒泡其中的一个阶段
- onclick和attachEvent 只能得到冒泡阶段
- addEventListener(type, listener, useCapture)第三个参数如果是true,表示在事件捕获阶段调用事件处理程序;如果是false(默认false),表示在事件冒泡阶段调用事件处理程序
- 实际开发很少用事件捕获,我们更关注事件冒泡
- 有些事件是没有冒泡的,比如onblur,onfocus ,onmouseleave
- 事件冒泡有时候会带来麻烦,下文提到
事件对象
「什么是事件对象」
1 | eventTarget.onclick = function(event) {} |
官方解释:event对象代表事件的状态,比如键盘按键的状态,鼠标按钮的状态
简单理解:事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象event,它有很多种属性和方法,比如:
- 谁绑定这个事件
- 鼠标触发事件的话,会得到鼠标的相关信息,比如鼠标位置
- 键盘触发事件的话,会得到键盘的相关信息,如按了哪个键
1 | <div>传统</div> |
event是一个形参,系统帮我们设定为事件对象,不需要传递实参过去
当我们注册事件时,event对象就会被系统自动创建,并依次传递给事件监听器(事件处理函数)
兼容性方案:e = e || window.event
「事件对象的常见属性和方法」
| 事件对象属性方法 | 说明 |
|---|---|
| e.target | 返回触发事件的对象(标准) |
| e.srcElement | 返回出发事件的对象(非标准 ie678) |
| e.type | 返回事件的类型 比如click mouseover 不带on |
| e.cancelBubble | 该属性阻止事件冒泡 (非标准 ie678) |
| e.returnValue | 该属性阻止默认事件(默认行为),比如不让链接跳转(非标准 ) |
| e.preventDefault() | 该方法阻止默认事件(默认行为),比如不让链接跳转(标准) |
| e.stopPropagation() | 阻止冒泡(标准) |
1 | <div>123</div> |
1 | <div>123</div> |
1 | <a href="http://www.baidu.com">百度</a> |
「阻止事件冒泡」
事件冒泡:开始时由最具体的元素接收,然后逐级向上传播到DOM最顶节点
1 | <div class="father"> |
事件委托
事件冒泡本身的特性,会带来坏处,也会带来好处,需要灵活掌握
班级有100学生,快递员有100快递,如果一个一个送花费时间长,同时每个学生领取花费时间同样长
解决方案:快递员把100快递委托给班主任,班主任发放
1 | <ul> |
常用鼠标事件
「常用鼠标事件」
| 鼠标事件 | 触发条件 |
|---|---|
| onclick | 鼠标点击左键触发 |
| onmouseover | 鼠标经过触发 |
| onmouseout | 鼠标离开触发 |
| onfocus | 获得鼠标焦点触发 |
| onblur | 失去鼠标焦点触发 |
| onmousemove | 鼠标移动触发 |
| onmouseup | 鼠标弹起触发 |
| onmousedown | 鼠标按下触发 |
1.禁止鼠标右键菜单
contexmenu主要控制应该何时显示上下文菜单,主要用于程序员取消默认上下文菜单
1 | document.addEventListener('contextmenu', function(e) { |
2.禁止鼠标选中
1 | document.addEventListener('selectstart', function(e) { |
「鼠标事件对象」
1 | document.addEventListener('click', function(e) { |
案例:跟随鼠标的天使
1 |
常用键盘事件
「常用键盘事件」
| 键盘事件 | 触发条件 |
|---|---|
| onkeyup | 某个键盘按键被松开时触发 |
| onkeydown | 某个键盘按键被按下时触发 |
| onkeypress | 某个键盘按键被按下时触发 但它不识别功能键比如ctrl shift |
- 如使用addEventListener 不需要on
- 三个事件执行顺序; keydown–keypress–keyup
「键盘事件对象」
| 键盘事件对象属性 | 说明 |
|---|---|
| keyCode | 返回改键的ASCII值 |
- keypress不识别功能键,但keyCode属性能区分大小写,返回不同的ASCII值






