事件机制

67 阅读4分钟

事件机制

JS与HTML的交互是通过事件实现的,事件代表文档或者浏览器窗口中某个有意义的时刻

可以向文档或者文档中的元素添加事件侦听器来预订事件

事件流

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

IE和网景公司提出了几乎完全相反的事件流方案:事件冒泡和事件捕获

事件冒泡

IE事件流被称为事件冒泡

这是因为事件被定义从最具体的元素开始触发,然后向上传播到没那么具体的元素

事件冒泡.png

事件捕获

网景团队提出了事件捕获

最不具体的节点最先开始接收事件,最具体的节点最后收到事件

事件捕获.png

DOM事件流

DOM2中将事件流分为3个阶段:事件捕获、到达事件、事件冒泡

事件捕获最先发生,为提前拦截时间提供了可能

然后实现的目标元素接收到事件

最后是冒泡,最迟要在这个阶段响应事件

DOM事件流.png

DOM事件级别

DOM有4次版本更新,与DOM版本变更,产生了3种不同的DOM事件 :DOM 0级事件处理,DOM 2级事件处理和DOM 3级事件处理

由于DOM 1级中没有事件的相关内容,所以没有DOM 1级事件。

DOM0级事件

把一个函数赋值给一个事件处理程序属性

 btn.onclick = function(){...}

其中,事件处理程序会在元素的作用域中运行,即this等于元素本身,并且this.id就是元素的ID

可以通过this访问元素的任何属性和方法

以这种方式添加事件处理程序是注册在事件流的冒泡阶段的

将事件处理程序属性的值设置为null,即可移除DOM0方式添加的事件处理程序

 btn.onclick = null

DOM2级事件

新定义了两个方法:addEventListenerremoveEventListener,这两个方法暴露在所有DOM节点上,接收三个参数:事件名、处理函数、布尔值,其中布尔值中的true表示在捕获阶段调用事件处理程序,false(默认值)表示在冒泡节点调用事件处理程序

要移除事件必须在removeEventListener中传入在addEventListener中注册的函数的名字,就能将其移除,不能移除匿名函数

同一个元素的同种事件可以绑定多个函数,按照绑定顺序执行

DOM3级事件

DOM3级事件在DOM2级事件的基础上添加了更多的事件类型,增加的类型如下:

  • UI事件,当用户与页面上的元素交互时触发,如:load、scroll
  • 焦点事件,当元素获得或失去焦点时触发,如:blur、focus
  • 鼠标事件,当用户通过鼠标在页面执行操作时触发如:dblclick、mouseup
  • 滚轮事件,当使用鼠标滚轮或类似设备时触发,如:mousewheel
  • 文本事件,当在文档中输入文本时触发,如:textInput
  • 键盘事件,当用户通过键盘在页面上执行操作时触发,如:keydown、keypress
  • 合成事件,当为IME(输入法编辑器)输入字符时触发,如:compositionstart
  • 变动事件,当底层DOM结构发生变化时触发,如:DOMsubtreeModified
  • 同时DOM3级事件也允许使用者自定义一些事件

事件委托

又称事件代理,事件委派

事件委托利用事件冒泡,可以只使用一个事件处理程序来管理一种类型的事件

不在事件的发生地(直接 dom)上设置监听函数,而是在其父元素上设置监听函数,通过事件冒泡,父元素可以监听到子元素上事件的触发,通过判断事件发生元素 DOM 的类型,来做出不同的响应

最经典的就是 ul 和 li 标签的事件监听,比如我们在添加事件时候,采用事件委托机制,不会在 li 标签上直接添加,而是在 ul 父元素上添加

优点:减少整个页面所需的内存,提升整体性能节省,花在设置页面事件处理上的时间