理解事件冒泡

一、什么是事件冒泡

事件是用于触发js代码的某种状态或行为,是html实现与js交互的桥梁。事件必须被安装在某个对象上,比如浏览器或文档中的元素,否则事件就无法存在。设想如果不把click()或mousemove()这样的事件绑定到某个对象(事件目标event target)上,那么无论鼠标怎么点怎么滑,网页都不会有任何反应。于是问题来了,当某个事件发生的时候,浏览器如何判断这个事件发生在谁身上呢?比如点击son区域,那究竟是点的son,还是Dad,还是Grandpa?由于html中存在大量嵌套关系,因此必须规定某种顺序去查询究竟是谁绑定了这个事件,从而才能触发相应的js。这个顺序被称为“事件流”,而事件冒泡就是事件流的一种类型。

二、事件流的三种类型

1、事件冒泡。从事件发生的最具体的节点开始,沿着DOM树向上依次查询,直到body、html和document。仍以上图为例,如果Grandpa绑定了一个click事件,点击Grandpa中间区域,浏览器并不是直接触发Grandpa的事件,浏览器只知道son被点中了,于是开始查询:son有没有绑定click、Dad有没有绑定click、Grandpa有没有绑定click……document有没有绑定click。在同一条DOM血缘关系链上所有元素都会被检查一遍,其中所有的click都会被触发。

2、事件捕获。与事件冒泡刚好相反,不具体展开。

3、DOM事件流。DOM事件流规定了三个阶段:捕获,目标和冒泡。至于为啥要这样设计,在《JavaScript高级程序设计》和《JavaScript权威指南》中我都没查到。因此有待进一步考证。

三、事件委托

利用事件冒泡,将事件绑定在父元素上,这样所有子元素都可以利用父元素的事件来触发js代码的执行,这就是事件委托(或称为事件代理)。相比于给每个元素单独添加同样的事件,这么做的好处是内存消耗更小。

四、阻止冒泡

使用stopPropagation()可以阻截事件冒泡。

如果不阻止,点击son区域,浏览器会依次弹出三个框,阻止冒泡后,就只会出现一次:

五、哪些事件支持冒泡,哪些不支持

待续……

时间: 2024-11-05 21:34:57

理解事件冒泡的相关文章

JS事件冒泡机制以及委托方法,以及vue中的stop

要理解事件冒泡机制,就得先了解事件. 浏览器是事件驱动型的,根据用户的行为触发不同的事件,根据事件执行相应的操作.我们较为熟悉的事件有三大类型:鼠标键盘事件.页面事件.表单相关事件. 鼠标键盘事件:onclick.ondbclick.onmousedown.onmouseup.onmouseover.onmousemove.onmouseout.onkeypress.onkeydown.onkeyup: 页面事件:onload.onunload.onresize.onerror.onabort:

深入理解JavaScript事件冒泡

一.什么是事件冒泡 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window). 打个比方说:你在地方法院要上诉一件案子,如果地方没有处理此类案件的法院,地方相关部门会帮你继续往上级法院上诉,比如从市级到省级,

理解js事件冒泡事件委托事件捕获

js事件冒泡 javascript的事件传播过程中,当事件在一个元素上出发之后,事件会逐级传播给先辈元素,直到document为止,有的浏览器可能到window为止,这就是事件冒泡现象. <div id="col">    <p>        <a id="btn" href="#">button</a>    </p></div> <script> let b

事件捕获和事件冒泡理解

之前总是单纯的记得事件冒泡和事件捕获相反,一个从下至上,另一个从上至下,但是却没有弄明白他们的执行顺序,导致昨晚笔试CVTE出了类似这么一道题不会做. 对于DOM和DOM2级事件这两个区别就不详细解释了,网上大把资料. 这里仅针对该题目进行事件捕获和事件冒泡顺序进行理解. 首先要明白DOM2级事件规定的事件流包含3个阶段,事件捕获阶段.处于目标阶段.事件冒泡阶段. 下面贴题目代码(仅核心部分)进行详细解释,首先 addEventListener方法有三个参数,分别是事件监听类型,事件执行函数和是

理解阻止浏览器默认事件和事件冒泡cancelBubble

一.阻止浏览器默认事件 1.先举个例子说什么是 浏览器的默认事件 : 比如有一个输入框,当我按下字母a,就会在输入框显示字母a.就是浏览器本该发生的事情.小孩子一出生就会汲取母乳一样的道理,这些都是先天,默认好的了. 2.看个demo,阻止浏览器默认的右键弹出菜单,而且弹出自己自定义的菜单.代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style type=&

事件冒泡及事件委托的理解(JQuery Dom操作)

jQuery事件冒泡: click mouseenter 等事件没有绑定 也会触发,只是触发后没有任何结果 子元素触发事件后,会把触发事件传递给父元素,那么父元素也会被触发. 不管有没有绑定事件,都会触发事件,只是没有结果,事件冒泡传递还是会发生 系统自动产生的event事件对象 function传的第一个参数就是event事件对象 1 event.stopPropagation(); // 阻止事件冒泡 2 event.preventDefault() // 阻止默认行为 比如submit阻止

关于事件捕获和事件冒泡

这篇随笔主要是写关于事件冒泡和事件捕获的一些关联,主要是从<JavaScript高级程序设计>这本书第13章总结扩展而来,今天主要是想扩展对书本里面P358页以及加深一下理解. 一.先说一下定义: 事件冒泡阶段:从最具体的元素,即目标事件位置往文档的根节点方向回溯,从内向外冒泡事件对象(所有浏览器都支持). 事件捕获阶段:先由文档的根节点document往事件触发对象,从外向内捕获事件对象(DOM2级事件要求时间从document对象开始传播,但是IE9,Safari,Chrome,Opera

解析Javascript事件冒泡机制(转) 本文转自:http://blog.csdn.net/luanlouis/article/details/23927347

本文转自:http://blog.csdn.net/luanlouis/article/details/23927347 1. 事件 在浏览器客户端应用平台,基本生都是以事件驱动的,即某个事件发生,然后做出相应的动作. 浏览器的事件表示的是某些事情发生的信号.事件的阐述不是本文的重点,尚未了解的朋友,可以访问W3school教程 进行了解,这将有助于更好地理解以下的内容 . 2. 冒泡机制 什么是冒泡呢? 下面这个图片大家应该心领神会吧,气泡从水底开始往上升,由深到浅,升到最上面.在上升的过程中

Javascript事件冒泡,没有想象中那么糟糕

Javascript事件冒泡,没有想象中那么糟糕  提到js事件,我们可能第一时间反应的就是“如何阻止事件冒泡”:但是事件冒泡真的是如我们想象的那么糟糕吗? 1. Event 对象  Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 2. 事件句柄 (Event Handlers)  指能够使 HTML 事件触发浏览器中的行为,比如点击(onclick).鼠标悬浮(onfocus)等 3. 什么是事件冒泡  一个对象(event.srcEle