# 事件

# 理解事件流

事件流描述了页面接受事件的顺序。

IE事件流被称为事件冒泡,因为事件被定义从最具体的元素开始触发,然后向上传播至没有那么具体的元素「document」。

所有现代浏览器都支持事件冒泡。

事件捕获的意思是最不具体的节点应该最先收到事件,而最具体的节点应该最后收到事件。

事件捕获实际上是为了在事件达到最终目标前拦截事件。
如:点击事件click首先由 document 元素捕获,然后沿 DOM 树依次向下传播,直到到达实际的目标元素 <div>

实际上,所有浏览器都是从 window 对象开始捕获事件,而 DOM2 Events 规范规定的是从 document 开始。

因为旧版本浏览器不支持,所以实际当中几乎不会使用事件捕获,建议使用事件冒泡,特殊情况下才考虑使用事件捕获。

DOM2 Events 规范规定事件流分为3个阶段:事件捕获、到达目标和事件冒泡

# 使用事件处理程序

为响应事件而调用的函数被称为事件处理程序。

HTML事件处理程序,即标签中定义的如 onclick 事件,包含局部变量 event。

DOM0 事件处理程序,JS中取得操作对象的引用,再去添加属性 onclick。

DOM2 事件处理程序,定义了两个方法:addEventListener()removeEventListener() 。接收3个参数:事件名、事件处理函数和一个布尔值。

true 表示再捕获阶段调用事件处理函数,false 表示在冒泡阶段调用事件处理函数。

// 事件冒泡阶段,可以绑定多个
let btn = document.getElementById('btn')
const handler = () => {
  console.log(this.id)
}
btn.addEventListener('click', handler, false)
// removeEnentListerer 第二个参数,应使用同一个 handler
btn.removeEventListener('click', handler, false)

1
2
3
4
5
6
7
8
9

IE 事件处理程序,IE 实现了与 DOM 类似的方法,即 attachEvent()detachEvent()。接受两个参数。
添加多个 attachEvent() 时,触发顺序为先声明后调用。

跨浏览器事件处理程序,整合 DOM0、DOM2和IE处理方式。

事件对象,Event 对象。

DOM 事件对象的公共属性和方法:
bubbles Boolean 表示事件是否冒泡

cancelable Boolean 表示是否可以取消事件的默认行为

currentTarget element 当前事件处理程序所在的元素

defaultPrevented Boolean true 表示已经调用 perventDefault() 方法(DOM3 新增)

detail Number 事件相关的其他信息

eventPhase Number 调用事件处理程序的阶段:1 捕获阶段、2 到达目标、3 冒泡阶段

preventDefault() Function 取消事件的默认行为。只有cancelable为true 才可以调用这个方法

stopImmediatePropagation() 用于取消所有后续事件捕获或事件冒泡,并阻止调用任何后续事件处理程序(DOM3 新增)

stopPropagation() 用于取消所有后续事件捕获或事件冒泡。只有 bubbles 为true才可以调用这个方法。

target 事件目标

trusted true 表示事件是由浏览器生成的。false 表示事件是开发者通过JS创建的(DOM3 新增)

type 被触发的事件类型

View 与事件相关的抽象视图。等于事件所发生的 window 对象。

事件处理的内部,this 对象始终等于 currentTarget 的值。

# 了解不同类型的事件

用户界面事件:load、unload、abort、error、select、resize、scroll。

焦点事件:blur、DOMFocusIn、focus、focusin、focusout。

鼠标事件:click、dblclick、mousedown、mouseenter、mouseleave、mousemove、mouseout、mouseover、mouseup。

滚轮事件:同上

输入事件:keydown、keypress、keyup

键盘事件:同上

合成事件:compositionstart、compositionupdate、compositionend

HTML5 事件

contextmenu

beforeunload

DOMContentLoaded

readystatechange:文档或元素状态加载的信息,属性 readyState:uninitialized、loading、loaded、interactive、complete。

hashchange:URL#后面部分发生变化时通知开发者。

设备事件

orientationchange

deviceorientation

devicemotion

触摸及手势事件

触摸事件:touchstart、touchmove、touchend、touchcancel。

手势事件:gesturestart、gesturechange、gestureend

# 内存与性能

过多事件处理程序的解决方案是使用事件委托,利用事件冒泡,只使用一个处理程序来管理一种类型的事件。

删除事件处理程序

# 模拟事件