浅谈浏览器的事件冒泡机制

  JS中事件执行的整个过程称之为事件流,分为三个阶段:事件捕获、事件目标处理函数、事件冒泡。

  当某个元素触发某个事件(如onclick),顶级对象document发出一个事件流,顺着DOM的树节点向触发它的目标节点流去,直到到达目标元素,这个层层递进、向下找寻目标点的过程为事件的捕获阶段,此过程中与事件相应的函数是不会被触发的。

  到达目标元素,便会执行绑定在此元素上的、与事件相应的函数,即事件目标处理函数阶段。

  最后,从目标元素起,再依次往顶层对象传递,途中如果有节点绑定了同名事件,这些事件所对应的函数会逐一被触发,此过程便称之为事件冒泡。

  通常情况下,事件相应的函数都是在冒泡阶段触发执行的,addEventListener的第三个参数默认false,表示冒泡时执行(为true时,函数在捕获阶段便会执行)。

  使用e.stopPropagation() 或 e.cancelBubble = true(IE)可以阻断事件向当前元素的父元素冒泡。

  

一个小例子

<div style="background-color: red;">
    <div style="background-color: green;">
        <div style="background-color: yellow;"></div>
    </div>
</div>
   
  var div =document.querySelectorAll(‘div‘);
  function fn1(){
        console.log(this);
    }
   function fn2(e){
        console.log(this);
        e.cancelBubble = true;
        e.stopPropagation();
    }

    div[0].addEventListener(‘click‘,fn1,false);
    div[1].addEventListener(‘click‘,fn1,false);
    div[2].addEventListener(‘click‘,fn2,false);

    div[0].addEventListener(‘click‘,fn1,true);
    div[1].addEventListener(‘click‘,fn1,true);
    div[2].addEventListener(‘click‘,fn1,true);

结果为 red—>green—>yellow—>yellow—>green

(前三个结果是事件捕获阶段执行函数输出的,在捕获阶段,从最高节点起,但凡绑定了click事件,便执行;之后进入冒泡阶段,由于div[1]身上阻止了事件冒泡,因此它的父级div[0]的click不会被触发,事件到div[1]便停止了。)

如果把阻止冒泡的行为添加在捕获阶段,如捕获阶段的div[1]身上,则只会依次输出捕获过程中触发click事件时div[0]、div[1]的函数执行结果,之后的捕获行为和冒泡行为将全部被阻断。

时间: 2024-08-05 16:15:26

浅谈浏览器的事件冒泡机制的相关文章

浅谈js的事件冒泡机制

很多人都听说过,js的事件冒泡机制,其实,这个说法还是比较生动形象的,就是一个水泡在水底下,冒泡到水面的过程. 那js的事件冒泡机制呢,就是一个DOM树,一级一级向上冒的过程,最终是到document这个根节点这里. 这里就有一个小细节,dom点击后,它所有的父级都会触发事件,每一级绑定的事件都会触发,这样是耗费事件和性能进行处理的,但是,如果我们把事件都绑定到document根节点,这样只需要在最后一级的时候,区别是那个dom触发的就行了,这个也叫事件委托. 其实这个场景适用于,子节点和众多父

浅谈js的事件冒泡和事件捕获

什么是事件? 事件是文档和浏览器窗口中发生的特定的交互瞬间. 事件是javascript应用跳动的心脏,也是把所有东西黏在一起的胶水,当我们与浏览器中web页面进行某些类型的交互时,事件就发生了. 事件可能是用户在某些内容上的点击,鼠标经过某个特定元素或按下键盘上的某些按键,事件还可能是web浏览器中发生的事情,比如说某个web页面加载完成,或者是用户滚动窗口或改变窗口大小. 事件流: 事件流描述的是从页面中接受事件的顺序,但有意思的是,微软(IE)和网景(Netscape)开发团队居然提出了两

浅谈浏览器http的缓存机制

针对浏览器的http缓存的分析也算是老生常谈了,每隔一段时间就会冒出一篇不错的文章,其原理也是各大公司面试时几乎必考的问题. 之所以还写一篇这样的文章,是因为近期都在搞新技术,想"回归"下基础,也希望尽量总结的更详尽些. 那么你是否还需要阅读本篇文章呢?可以试着回答下面这个问题: 我们在访问百度首页的时候,会发现不管怎么刷新页面,静态资源基本都是返回 200(from cache): 随便点开一个静态资源是酱的: 哎哟有Response报头数据呢,看来服务器也正常返回了etag什么鬼的

浅谈浏览器的缓存机制

浏览器的缓存可分为HTTP缓存和离线缓存,下面将分别介绍 HTTP缓存 只有GET请求能被缓存,POST不能被缓存.Modified Time/ETag/Expires/Cache都是HTTP协议的缓存策略 先来一个例子 当我们第二次访问百度首页,在Chrome的Network面板中打开一个静态文件时会发现响应的status是:200 OK (from disk cache),不是应该返回304 Not Modified吗?如果你知道答案,那就可以忽略本文了. Cache-Control 简介

事件流及事件冒泡机制

事件流 "DOM2级事件"规定的事件流包括三个阶段: 事件捕获阶段(为截获事件提供了机会) 处于目标阶段(实际的目标接收到事件) 事件冒泡阶段(可以在这个阶段对事件做出响应) IE9.Opera.Firefox.Chrome 和 Safari 都支持 DOM 事件流:IE8 及更早版本不支持 DOM 事件流. 事件冒泡机制 a.在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回

解析Javascript事件冒泡机制

本资源引自: 解析Javascript事件冒泡机制 - 我的程序人生 - 博客频道 - CSDN.NET http://blog.csdn.net/luanlouis/article/details/23927347 ----------------------------------------------------------------------------------------------------------------------------------------- 1.

浅谈 HTML5 的 DOM Storage 机制 (转)

在开发 Web 应用时,开发者有时需要在本地存储数据.当前浏览器支持 cookie 存储,但其大小有 4KB 的限制.这对于一些 Ajax 应用来说是不够的.更多的存储空间需要浏览器本身或是插件的支持,如 Google Gears 和 Flash.不过开发人员需要通过检测当前浏览器所支持的插件类型来使用对应的接口. HTML5 中新引入了 DOM Storage 机制,通过使用键值对在客户端保存数据,并且提供了更大容量的存储空间.本文将详细论述 HTML5 对本地存储的支持,并对存储事件绑定和数

浅谈委托和事件(一)

浅谈委托和事件(一) 关于委托和事件,可能是.NET或者说是面向对象编程语言中的一个比较重要又比较难以理解的概念.关于这一话题,园子里的人也写了很多文章,最经典的可能就是张子阳的C#中的委托和事件这两篇文章了,之前也看过MSDN 上的WebCast深入 "委托和事件".可能和很多人一样,刚开始读的时候,觉得很清楚,但是过了一段时间好像又忘记了委托和事件的区别,知道很久以前,在一次面试中我被问到委托和事件有什么区别,一下子就说不清了. 所以这里稍微理一下,也算是自己的一个总结.当然,还是

这可能是最简明扼要的 js事件冒泡机制+阻止默认事件 讲解了

哎 js事件冒泡机制和阻止冒泡 阻止默认行为好像永远也整不清楚,记了忘 忘了记...醉了 这篇文章写完以后下次再忘记 就呼自己一巴掌,忘一次一巴掌 首先要明白两个概念--事件和事件流 事件指的是用户或浏览器自身执行的某种动作,又称为原始事件模型,例如onclick等 事件流指的是 从页面中接收事件的顺序,也就是说当一个事件产生时,这个事件的传播过程就叫做事件流. 事件冒泡: 从事件目标开始 一级级向上冒泡,到document为止--从里到外 IE 5:div--body--document; I