事件概念:  

  HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件onclick、页面的滚动事件onscroll等等,可以向文档或者文档中的元素添加事件侦听器来预订事件。想要知道这些事件是在什么时候进行调用的,就需要了解一下“事件流”的概念。

什么是事件流?

  事件流描述的是从页面中接收事件的顺序。

  1、DOM事件流

  “DOM2级事件”规定的事件流包括三个阶段:

  ① 事件捕获阶段;

  ② 处于目标阶段;

  ③ 事件冒泡阶段;

  案例说明:页面中有一个id为btn的按钮,当点击这个按钮的时候,都发生了些什么? 

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>事件流</title>
<script> window.onload = function(){ var oBtn = document.getElementById('btn'); oBtn.addEventListener('click',function(){
console.log('btn处于事件捕获阶段');
}, true);
oBtn.addEventListener('click',function(){
console.log('btn处于事件冒泡阶段');
}, false); document.addEventListener('click',function(){
console.log('document处于事件捕获阶段');
}, true);
document.addEventListener('click',function(){
console.log('document处于事件冒泡阶段');
}, false); document.documentElement.addEventListener('click',function(){
console.log('html处于事件捕获阶段');
}, true);
document.documentElement.addEventListener('click',function(){
console.log('html处于事件冒泡阶段');
}, false); document.body.addEventListener('click',function(){
console.log('body处于事件捕获阶段');
}, true);
document.body.addEventListener('click',function(){
console.log('body处于事件冒泡阶段');
}, false); }; </script>
</head>
<body>
<a href="javascript:;" id="btn">按钮</a>
</body>
</html>

  当我们点击这个btn的时候,看看页面都输出了什么:

在解释输出结果为什么是这样之前,还有几个知识点需要讲解一下:

1、addEventListener

  addEventListener 是DOM2 级事件新增的指定事件处理程序的操作,这个方法接收3个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值。最后这个布尔值参数如果是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。

2、document、documentElement和document.body三者之间的关系:

  document代表的是整个html页面;

  document.documentElement代表的是<html>标签;

  document.body代表的是<body>标签;

接着我们就来聊聊上面的例子中输出的结果为什么是这样:

  在标准的“DOM2级事件”中规定,事件流首先是经过事件捕获阶段,接着是处于目标阶段,最后是事件冒泡阶段。这里可以画个图示意一下:

  首先在事件捕获过程中,document对象首先接收到click事件,然后事件沿着DOM树依次向下,一直传播到事件的实际目标,就是id为btn的a标签。

  接着在事件冒泡过程中,事件开始时由最具体的元素(a标签)接收,然后逐级向上传播到较为不具体的节点(document)。

需要注意的点:由于老版本的浏览器不支持事件捕获,因此在实际开发中需要使用事件冒泡,在由特殊需要时再使用事件捕获。

补充:

  1、IE中的事件流只支持“事件冒泡”,但是版本到了IE9+以后,实现了“DOM2级事件”,也就是说IE9+以后也可以在捕获阶段对元素进行相应的操作。

   2、在DOM事件流中,实际的目标在“捕获阶段”不会接收到事件。而是在“处于目标阶段”被触发,并在事件处理中被看成“冒泡阶段”的一部分。然后,“冒泡阶段”发生,事件又传播回文档。

最新文章

  1. 黑马----JAVA泛型基础
  2. 搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)
  3. Linux服务器宕机案例第二则
  4. 【Unity Shaders】学习笔记——SurfaceShader(二)两个结构体和CG类型
  5. 设计模式 --深入理解javascript
  6. OK335xS Linux kernel check clock 24M hacking
  7. 网上图书商城项目学习笔记-035工具类之JdbcUtils及TxQueryRunner及C3P0配置
  8. VLC打开.264文件
  9. MD中bitmap源代码分析--设置流程
  10. MFC自绘控件学习总结第二贴
  11. windows mysql安装、配置
  12. 理解cookie的path和domain属性(转)
  13. Load 数据1
  14. python列表反转
  15. WordPress让文本小工具支持简码
  16. Konckout第六个实例:自定义组件 -- 发表评论
  17. objectid.go源码阅读
  18. WDTP注册破解
  19. Learn Python The Hard Way, 2nd Edition
  20. shell while内获取外部变量内容

热门文章

  1. APPCLOUD 判断网络
  2. 根据Content获取到ItemsControl中对应的Item
  3. [问题记录]Ubuntu下chmsee安装失败的解决
  4. Sublime Text 3 使用小记
  5. SQLServer 错误: 15404,无法获取有关 Windows NT 组/ 用户 &#39;WIN-8IVSNAQS8T7\Administrator&#39; 的信息,错误代码 0x534。
  6. PG extract 函数示例
  7. SnowKiting 2017/1/24
  8. Nengo 神经网络
  9. FIBON高精度
  10. js解析json格式