HTML 事件机制

页面上点击一个按钮,浏览器做了什么?

今天我们就浅浅的了解下,浏览器到底干了什么。

 

当页面触发一个事件的时候,浏览器主要做了三个阶段的事情:

 

  1. capture phase:捕获事件阶段
  2. target phase: 目标处理阶段
  3. bubble phase: 后续事件处理阶段
capture阶段就是当事件被触发的时候,产生事件对象,传递事件对象,最终找到目标元素触发事件。
那么事件是如何传递的呢?
  1. 浏览器会产生一个Event对象,包含目标元素的标识,事件名称等信息
  2. 然后,浏览器从DOM结构的根节点开始向各个也节点分发Event对象
从根节点到目标节点的父节点,这个过程就叫做capture阶段。

target阶段指Event对象到达了目标节点。
当Event对象到达了目标节点,目标节点将会马上执行注册好的监听器。
event.preventDefault();
 以上代码阻止了元素的默认行为,比如a标签的默认行为是打开href定义的页面。

bubble阶段是指当target阶段结束后,从目标节点反向的传递到跟节点的过程。
我们可以通过
event.stopPropagation();
 来阻止向上传递的过程。

具体序列图如下:

HTML 事件机制
 
那么HTML是如何约束这个机制的呢,我们来看下整体的接口:

HTML 事件机制
 
以上是HTML接口图:
Event接口规定了产生的事件的详细信息,包含事件目标对象,事件是否可以取消,事件所处的阶段等等信息。
CustomEvent则是Event的扩展,提供了第三方的扩展性。
DocumentEvent则是负责Event对象的产生。
EventListener规定了事件监听器的主要行为。
EventTarget负责Event对象的分发和事件监听器的注册以及响应。

我们来看一个实例:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
 </HEAD>
 <BODY>
	<div id="d" onclick="alert('this is bubble phase');"> 
		this is div
		<a id="a" href="#" onclick="alert('target');">test</a>
	</div>
 </BODY>
 <script type="text/javascript">
	document.getElementById("d").addEventListener('click',function(){
		alert("this is capture phase");
	},true);
 </script>
</HTML>
 
点击test连接的时候,alert的顺序
  1. this is capture phase
  2. target
  3. this is bubble phase
addEventListener
 的第三个参数是useCapture,true表示是否将此事件监听器注册到capture阶段。