一个DOM元素绑定多个事件时,先执行冒泡还是捕获

绑定在被点击元素的事件是按照代码顺序发生,其他元素通过冒泡或者捕获“感知”的事件,按照W3C的标准,先发生捕获事件,后发生冒泡事件。所有事件的顺序是:其他元素捕获阶段事件 -> 本元素代码顺序事件 -> 其他元素冒泡阶段事件 。

一个DOM元素绑定两个事件,一个冒泡,一个捕获,则事件会执行多少次,执行顺序如何。

首先来了解一下冒泡和捕获是怎么回事:

1.冒泡

冒泡是从下向上,DOM元素绑定的事件被触发时,此时该元素为目标元素,目标元素执行后,它的的祖元素绑定的事件会向上顺序执行。如下代码所示,四个嵌套的div:

addEventListener函数的第三个参数设置为false说明不为捕获事件,即为冒泡事件。

<div id=‘one‘>
  <div id=‘two‘>
    <div id=‘three‘>
      <div id=‘four‘>
      </div>
    </div>
  </div>
</div>

<script type=‘text/javascript‘>
  var one=document.getElementById(‘one‘);
  var two=document.getElementById(‘two‘);
  var three=document.getElementById(‘three‘);
  var four=document.getElementById(‘four‘);
  one.addEventListener(‘click‘,function(){
    alert(‘one‘);
  },false);
  two.addEventListener(‘click‘,function(){
    alert(‘two‘);
  },false);
  three.addEventListener(‘click‘,function(){
    alert(‘three‘);
  },false);
  four.addEventListener(‘click‘,function(){
    alert(‘four‘);
  },false);
</script>

代码的执行顺序是:

点击one元素,输出one;

点击two元素,输出two one;

点击three元素,输出 three two one;

点击four元素,输出 four three two one;

2.捕获

捕获则和冒泡相反,目标元素被触发后,会从目标元素的最顶层的祖先元素事件往下执行到目标元素为止。

将上面的代码第三个参数均改为true,则执行结果如下:

点击one,输出one;

点击two,输出one two;

点击three,输出one two three;

点击four,输出one two three four;

很明显执行顺序是不同的。

3.当一个元素绑定两个事件,一个冒泡,一个捕获

首先,无论是冒泡事件还是捕获事件,元素都会先执行捕获阶段。

从上往下,如有捕获事件,则执行;一直向下到目标元素后,从目标元素开始向上执行冒泡元素,即第三个参数为false的绑定事件的元素。(在向上执行过程中,已经执行过的捕获事件不再执行,只执行冒泡事件。)

如下代码:

one.addEventListener(‘click‘,function(){
alert(‘one‘);
},true);
two.addEventListener(‘click‘,function(){
alert(‘two‘);
},false);
three.addEventListener(‘click‘,function(){
alert(‘three‘);
},true);
four.addEventListener(‘click‘,function(){
alert(‘four‘);
},false);

此时点击four元素,four元素为目标元素,one为根元素祖先,从one开始向下判断执行。

one为捕获事件,输出one;

two为冒泡事件,忽略;

three为捕获时间,输出three;

four为目标元素,开始向上冒泡执行,输出four;(从此处分为两部分理解较容易。)

three为捕获已执行,忽略;

two为冒泡事件,输出two;

one为捕获已执行,忽略。

最终执行结果为:one three four two

(在这里可能会有疑问,目标元素是什么事件有区别吗?我的测试结果是没有区别的,无论目标元素是捕获还是冒泡,在w3c下都是先从根元素执行捕获到目标元素,再从目标元素向上执行。)

例如,three作为目标元素,执行结果为:one three two(因为two是冒泡事件,在向下执行时没有执行到)。

执行次数:绑定了几个事件便执行几次。

如下代码,two元素绑定了两个不同事件,点击two都会执行这两个事件。而执行顺序有所差异

one.addEventListener(‘click‘,function(){
alert(‘one‘);
},true);
two.addEventListener(‘click‘,function(){
alert(‘two,bubble‘);
},false);
two.addEventListener(‘click‘,function(){
alert(‘two,capture‘);
},true);
three.addEventListener(‘click‘,function(){
alert(‘three,bubble‘);
},true);
four.addEventListener(‘click‘,function(){
alert(‘four‘);
},true);

1、如果two为目标元素,目标元素的事情按顺序执行,而其他元素根据W3C的标准执行,即先捕获后冒泡。

点击two执行结果:one(因为是two的父元素支持捕获事件所以先执行)  two,bubble  two,capture(顺序执行,注意逗号不是间隔,是输出内容。)

2、如果目标元素不是two,则two的两个事件按先捕获后冒泡触发执行,也就是跟前面讨论的执行过程是一样的,只不过两个事件都绑定在同一个DOM元素上。

点击three执行结果:one two,capture three,bubble two,bubble

所有事件的顺序是:其他元素捕获阶段事件 -> 本元素代码顺序事件 -> 其他元素冒泡阶段事件 。

时间: 2024-10-26 09:56:16

一个DOM元素绑定多个事件时,先执行冒泡还是捕获的相关文章

【转载】W3C下的冒泡和捕获机制。到底是冒泡呢。还是捕获呢。一个DOM元素绑定多个事件时如何执行。

原文  http://blog.csdn.net/u011719449/article/details/23787627 在准备阿里前端面试的时候看到这么一道题. 一个DOM元素绑定两个事件,一个冒泡,一个捕获,则事件会执行多少次,执行顺序如何. 这导致了我对冒泡和捕获又进一步深入的了解.(永远都在发现自己知识匮乏的日子中度过人生真是好抓急啊.) 首先冒泡和捕获是怎么一回事. 简单点说.冒泡就是从下往上,像鱼吐泡,泡泡是从下往上升的,也就是DOM元素被触法事件时(此时的dom元素为目标元素),目

随笔一个dom节点绑定事件

以下利用jquery说明: js中,给一个dom节点绑定事件再平常不过了.这里说下,如果dom经常发生变化的话,给这个dom绑定事件的情况. 比如代码如下: li的节点,绑定了事件:点击会打出来里头的html内容. button点击事件:会生成一个li节点. 1 <html> 2 <head> 3 <meta charset="UTF-8"> 4 </head> 5 <body> 6 <ul class="ul

动态生成DOM元素绑定click事件无效问题

在页面里,jq动态生成dom节点,该节点的click事件无效. 如,html里动态添加class名为.del的<a>, js文件中: $('.del').bind('click',fuction(){ alert('sda'); }) 不响应, 网上说可以用live代替bind事件,但在jq1.7版本开始,就取消了live事件, 解决方法: on()事件 代码改为: $(document).on('click','.del',fuction(){ alert('sda'); }) 这样就搞定了

Js为Dom元素绑定事件须知

为异步加载的Dom 元素绑定事件必须在加载完成之后绑定: $('body').load('LearnClickBinding.ashx');$('a').click(function () { alert('I was clicked!'); }); 上面的绑定是无效的,因为异步加载需要时间,而在获取元素之前,早已执行了$('a').click();方法,所以绑定失败. 正确的做法是,等待元素加载完后再执行 $('a').click(); $('body').load('LearnClickBi

js Dom(三)节点、元素创建3种方式、为元素绑定多个事件addEventListener、attachEvent

目录: 1.节点的概念    2.节点的属性(nodeType,nodeName,nodeValue)    3.父节点(父元素)    4.获取子节点或子元素    5.获取节点.元素的方法(12行代码)    6.案例:div标签里面的p标签背景高亮(使用子节点或子元素的方式)    7.封装节点兼容代码    8.案例:切换背景图片    9.案例:全选.全不选    10.元素创建的第一种方式  document.write("<p>文本</P>"); 

为同一个元素绑定不同的事件指向同一个事件的处理函数

<input type="button" value="点击" id="btn"/><script src="commer.js"></script><script> //为同一个元素绑定不同的事件指向同一个事件的处理函数 ver("btn").onclick=f1; ver("btn").onmouseover=f1; ver("

Chrome插件Visual Event查看Dom元素绑定事件的利器

找这工具找了好久,统一找着了,开发人员不可多得的好东东,收藏做一下分享. 用Chrome插件Visual Event查看Dom绑定的事件 Visual Event简介 Visual Event是一个开源 Javascript 书签,能提供绑定在DOM元素上的事件调试信息.Visual Event能显示如下信息: 1.哪一个元素有事件绑定 2.某元素上绑定的事件类型 3.事件触发后运行的代码段 4.定义绑定函数的源文件和行号(仅限于WebKit和Opera浏览器) 除了对调试你自己的代码大有用途,

【JS 设计模式 】门面模式之DOM元素绑定事件

门面模式的作用:一是简化类的接口,通过用一个接口(函数或方法)来封装复杂的逻辑代码从而客户端可以使用一个接口来调用它:二是消除类与使用它的客户代码之间的耦合,使客户代码和复杂的逻辑代码分离,也就是耦合: ?在何种情况下会使用:1)为一个复杂子系统提供一个简单接口.2)提高子系统的独立性.3)在层次化结构中,使用Facade模式定义系统中每一层的入口,使它们各尽其责. 用绑定事件来举例门面模式,IE浏览器和其它(火狐.谷歌)浏览器在对html元素绑定事件上是有区别的. ie绑定代码: var bu

DOM元素绑定事件的参数说明

当绑定在DOM元素上的事件处理写在标签中时,有两个已知常量,其名称被占用,分别是:event:表示事件对象, this:表示元素本身注意:若调用的脚本方法需要用到这两个对象,必须作为参数传递进来 当绑定在DOM元素上的事件处理未写在标签中时,而是纯粹通过脚本绑定,那么:脚本方法第1个形参:自动表示事件对象, this:自动表示元素本身注意:脚本方法的第1个形参名称无论是写event,还是x,或者a,都表示为Event事件对象,若没有写形参名称,还可通过arguments[0]来获取该Event事