问题:

 <div class='item' id='outer' onclick="alert('outer')">
<div class='item' id='inner' onclick="alert('inner');">
<div class='item' id='core' onclick="alert('core')">
core!!!!!
</div>
</div>
</div>

1.上面div中,如果单击core,会执行多少个alert?先后顺序是什么?

该问题的答案取决于浏览器的对事件处理的机制。对于下图的结构,当两个element都绑定了onclick方法时,执行的顺序是什么?

-----------------------------------
| element1 |
| ------------------------- |
| |element2 | |
| ------------------------- |
| |
-----------------------------------
  • Netscape主张元素1的事件首先发生,这种事件发生顺序被称为捕获型
  • 微软则保持元素2具有优先权,这种事件顺序被称为冒泡型
  • DOM同时支持两种事件模型:捕获型事件和冒泡型事件,但是,捕获型事件先发生。两种事件流会触发DOM中的所有对象,从document对象开始,也在document对象结束。

冒泡型

1.对于某个节点,触发的一个事件, 会首先执行当前这个dom节点绑定的方法

2.执行完毕后,会冒泡至改节点的父节点,执行相应的函数

3. 重复以上过程,直至Dom的根节点。

对于上文中的例子, 单击#core,

1.首先触发alert('core')

   2.然后冒泡至#inner节点,触发alert('inner')

3.最后冒泡至#outer节点,触发alter('outer')

假设对于#inner,我们未为onclick事件指定方法,那么在第二步,不会有方法执行,但是click的事件,仍会继续冒泡至最外层的#outer.

捕获型

事件捕获的顺序刚好与之相反

  1.当一个事件发生时,最外层的已绑定该事件的方法会执行

  2.然后该事件会下降至他的子节点,触发相应的方法

  3.重复1,2的过程

如何加入一个捕获型/冒泡型事件

  • 参照上文给出的例子,我们直接在html中绑定事件方法, 这个事件就是冒泡型事件
 <div class='item' id='outer' onclick="alert('outer')">
  • 当采用原生Javascript(非Jquery)方法, 我们使用addEventListener绑定事件 当第三个参数是false的时候, 这个事件就是冒泡型事件(第三个参数的默认值是false).以下两种写法等价。
core.addEventListener("click",function(){alert('dddddd')},false);
core.addEventListener("click",function(){alert('dddddd')});
  • 我们使用addEventListener绑定事件 当第三个参数是true的时候, 这个事件就是捕获型事件
core.addEventListener("click",function(){alert('dddddd')},true);
  • addEventListe
  • core.addEventListener("click",function(){alert('dddddd')},true);

2.  stopPropagation()是停止冒泡事件流。

当我们为一个事件绑定的方法中,添加一句stopPropagation,那么该事件的冒泡过程到此为止,其后的所有节点绑定事件都不执行;

3. 没有方法去停止捕获事件流,当然,从功能上看也即没必要,也不合理。

4.除去addEventListener之外,通过attachEvent也可以绑定事件,attachEvent有哪些参数,执行顺序是什么?使用哪种机制?如果同时使用addEventListener和attachEvent,执行顺序又是怎样的?

4.下面是代码,保存成html文件,看看效果;

<html>
<head>
<style type="text/css">
.item{
display: table;
margin: 100px;
}
#outer{
width:400px;
height:400px;
background-color: blue;
}
#inner{
vertical-align: middle;
width:200px;
height:200px;
background-color: white;
}
#core{
width:80px;
height:80px;
background-color: red;
text-indent: 10px;
line-height: 50px;
}
</style> </head>
<body>
<div class='item' id='outer' onclick="alert('outer')">
<div class='item' id='inner' onclick="alert('inner');stopbubble(arguments[0])">
<div class='item' id='core' onclick="alert('core')">
core!!!!!
</div>
</div>
</div>
</body> <!--you must write <script> under <body>-->
<script type='text/javascript'>
var core = document.getElementById('core');
core.addEventListener("click",function(){alert('dddddd')},false);
//addEventListener: can add one more event to node "core"
function stopbubble(e){
e.stopPropagation();//stop bubble event on this node
}
</script>
</html>

前端效果:

点击core!!!后:
1.先alert core 因为绑定了dddd,然后会alert  dddd;

2.然后冒泡到inner节点后,alert inner,但是同时执行stopbubble(arguments[0])来停止冒泡;

3.停止冒泡后,该node后续节点就不执行了,所以不会alert outer;

JS事件冒泡、停止冒泡、addEventListener--实例演示的更多相关文章

  1. js 事件监听 冒泡事件

    js 事件监听  冒泡事件   的取消 [自己写框架时,才有可能用到] <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitiona ...

  2. js事件流机制冒泡和捕获

    JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间. 事件流 从页面中接收事件的顺序称为事件流. IE --> 事件冒泡流 Netsc ...

  3. js 事件详解 冒泡

    起因:正常情况下我点击s2时是先弹出我是children,再弹出我是father,但是却出现了先弹出我是father,后弹出我是children的情况,这种情况是在和安卓app交互的h5页面中出现的, ...

  4. js事件捕获和冒泡解析

    <div id="box"> <div id="box2"> <p id="test">test< ...

  5. 在JS事件封装时,addEventListener()方法的this问题

    最近在写js的类库,模仿的是jquery的编程风格,当封装到事件监听的时候发现遇到了一个问题,代码是这样的: 上面是封装的一个事件委托的代码,我以为上面的封装跟普通的事件监听一样简单,结果我在调用时发 ...

  6. javascript的阻止默认事件和阻止冒泡事件

    这两个方面的知识,在妙味课堂中有听过,再次复习一下: 原文来自:[http://www.cnblogs.com/Essence/p/4266618.html] 事件冒泡与默认行为   在说事件冒泡之前 ...

  7. js中addEventListener第三个参数涉及到的事件捕获与冒泡

    js中,我们可以给一个dom对象添加监听事件,函数就是 addEventListener("click",function(){},true); 很容易理解,第一个参数是事件类型, ...

  8. JS Event事件流(冒泡机制、捕获机制、事件绑定)

    1.事件流 事件流:从页面中接收事件的顺序.也就是说当一个事件产生时,这个事件的传播过程,就是事件流. IE的事件流 IE中的事件流叫事件冒泡:事件冒泡:事件开始时由最具体的元素接收,然后逐级向上传播 ...

  9. js 事件冒泡、捕获;call()、apply()

    他们是描述事件触发时序问题的术语.事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件.相反的,事件冒泡是自下而上的去触发事件.绑定事件方法的第三个参数,就是控制事件触发顺序是 ...

随机推荐

  1. CII-2.4指针常量和常量指针

    #define T Stack_T typedef struct T *T; struct T { int count; struct elem { void *x; struct elem *lin ...

  2. 一款非常棒的纯CSS3 3D菜单演示及制作教程

    原文:一款非常棒的纯CSS3 3D菜单演示及制作教程 这段时间比较忙,很久没在这里分享一些漂亮的HTML5和CSS3资源了,今天起的早,看到一款很不错的CSS3 3D菜单,觉得非常上眼,就将它分享给大 ...

  3. SQL Server Log文件对磁盘的写操作大小是多少

    原文:SQL Server Log文件对磁盘的写操作大小是多少 SQL Server 数据库有三种文件类型,分别是数据文件.次要数据文件和日志文件,其中日志文件包含着用于恢复数据库的所有日志信息,SQ ...

  4. 2440裸 Delay(); 和 while(!(rUTRSTAT0 &amp; 0x2)); 问题

    前两天写RTC中断 使用串行输出 它发现,该方案将while(!(rUTRSTAT0 & 0x2));走不出的情况.的 解决方法: main函数添加: U32 mpll_val = 0,con ...

  5. [Java] 一、对象的创建 & 销毁

    *1.考虑静态工厂方法(static factory method)代替构造器?!优势?不足? 服务提供者架构: 1.服务接口(Service Interface) -- 提供者实现的: 2.提供者注 ...

  6. Swift中文教程(二)--简单值

    原文:Swift中文教程(二)--简单值 Swift使用let关键字声明常量,var关键字声明变量.常量无需在编译时指定,但至少要被赋值一次.也就是说,赋值一次多次使用: var myVariable ...

  7. Drop dual

    一些互联网用户删除dual表还有一个问题: 删除dual时间表hang直播,然后直接shutdown abort.话又说回来,当您启动数据库.发现open时间已经hang直播.但该数据库是真正开放的另 ...

  8. 使用Visual Studio创建映像向导(Image Sprite)——Web Essential

    原版的:Creating Image Sprite in Visual Studio - Web Essential 译者注:有关图片精灵的信息请參阅http://baike.baidu.com/vi ...

  9. 经常使用git命令集

    //创建本地仓库 mkdir git_root;cd git_root;git init // //查看 git status . git log git log ./kernel/driver/ g ...

  10. Milo的游戏开发的一些链接资料

    http://www.cnblogs.com/miloyip/default.aspx?page=1 http://www.cnblogs.com/miloyip/archive/2010/06/14 ...