Javascript 的事件流

什么是事件流?

首先我们来说一下什么是事件

  • 概念:
    JavascriptHTML 之间的交互是通过 事件 来实现的。所谓 事件 就是文档或浏览器窗口中发生的一些特定的交互瞬间。事件 可以使用 侦听器(或处理程序) 进行预定, 以便 事件 发生时执行相应的代码 — 这个过程在传统软件工程上被称为 观察员模式的模型,支持页面的 行为(Javascript)页面外观(HTML & CSS) 之间的 松散耦合

所以什么是事件流

  • 概念:
    事件流 描述的是从页面中接受事件的顺序。

  • 提出:
    IE 提出的 事件流事件冒泡流Netscape Communicator 则是 事件捕获流。两家公司提出的是两个执行顺序截然相反的 事件流 的概念

  • 组成:

  1. 事件冒泡
  2. 事件捕获
  3. DOM 事件流

事件冒泡 (event bubbling)

  • 概念:
    事件冒泡 即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。事件冒泡 的用意在于事件到达预定目标之时捕获。自下而上的传播方式,有点像水里的泡泡由小变大向上冒,所以称为 事件冒泡

  • 支持:
    所有现代浏览器都支持 事件冒泡。但具体上会有差异:IE5.5 以及更早版本中的 事件冒泡 会跳过 <html> 元素(从 <body> 直接跳到 document)。IE9、Firefox、Chrome、Safari 则将事件一直冒泡到 window 元素。


事件捕获 (event capturing)

  • 概念:
    事件捕获 即事件开始时由不具体的节点(文档)接收,然后逐级向下传播到具体的元素(文档中嵌套层次最深的那个节点)。事件捕获 的用意在于事件到达预定目标之前就被捕获。

  • 支持:
    IE9、Firefox、Chrome、Opera、Safari 目前支持。但由于老版本浏览器不支持,因此很少有人用。因此建议大家更多的使用 冒泡事件 ,在特殊需要时再使用 事件捕获


DOM 事件流

  • 概念:
    DOM2 级事件” 规定事件流包括三个阶段:
  1. 事件捕获阶段 :为捕获事件提供机会。捕获阶段不会接收到事件,从 document<html> 再到 <body> 后就停止了。
  2. 处于目标阶段 :实际接收到事件。事件在 <div> (预计目标元素)上发生,并在事件处理中被看作冒泡阶段的一部分。
  3. 事件冒泡阶段 :冒泡阶段。事件传回文档。
IE9、Firefox、Chrome、Opera9.5、Safari 以及更高版本都会在捕获阶段触发事件对象上的结果
  • 支持:
    IE9、Firefox、Chrome、Opera、Safari 都支持 DOM 事件流IE8 以及更在版本不支持。