事件冒泡和捕获

这篇具有很好参考价值的文章主要介绍了事件冒泡和捕获。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.理解事件冒泡和事件捕获

在JS中,我们管事件发生的顺序叫“事件流”,当触发某个事件时,会发生一系列的连锁反应

<div class="grandpa">
	我是爷爷div
	<p class="son">
	我是儿子p
	  <a class="grandson" href="#">我是孙子a</a>
  </p>
</div>

如果给每个标签都绑定一个事件,当点击<a>标签时,会发现绑定在<div>和<p>标签上的事件也会被触发,这是为什么呢?为了解答这个问题,微软和网景公司提出了两种不同的概念:事件捕获 与 事件冒泡

(1)事件捕获:由微软公司提出来的,事件从文档根节点(Document 对象)流向目标节点,途中会经过目标节点的各个父级节点,并在这些节点上触发捕获事件,直至到达事件的目标节点

(2)事件冒泡:由网景公司提出,与事件捕获相反,事件会从目标节点流向文档根节点,途中会经过目标节点的各个父级节点,并在这些节点上触发捕获事件,直至到达文档的根节点。整个过程就像水中的气泡一样,从水底向上运动

Tips:上面提到的目标节点指的是触发事件的节点

后来,W3C 为了统一标准,采用了一个折中的方式,即将事件捕获与事件冒泡合并,也就是现在的“先捕获后冒泡”,如下图所示:

事件冒泡和捕获

2.事件捕获(event capturing)

在事件捕获阶段,事件会从 DOM 树的最外层开始,依次经过目标节点的各个父节点,并触发父节点上的事件,直至到达事件的目标节点。以上图中的代码为例,如果单击其中的<a>标签,

则该事件将通过document -> div -> p -> a的顺序传递到<a>标签。

事件冒泡和捕获

 拓展:

element.addEventListener(event, function, useCapture)

addEventListener方法用来为一个特定的元素绑定一个事件处理函数,有三个参数,分别是"没有on的事件类型"、"事件处理函数"、"控制事件阶段",第三个参数是boolean类型,默认是false,表示在事件冒泡的阶段调用事件处理函数,像上面代码中传入true,就表示在事件捕获的阶段调用事件处理函数。

3.事件冒泡(event bubbling)

事件冒泡正好与事件捕获相反,事件冒泡是从目标节点开始,沿父节点依次向上,并触发父节点上的事件,直至文档根节点,就像水底的气泡一样,会一直向上

事件冒泡和捕获

  4.阻止事件捕获和冒泡

了解了事件捕获和事件冒泡后会发现,这个特性并不友好,例如我们在某个节点上绑定了事件,本想在点击时触发这个事件,结果由于事件冒泡,这个节点的事件被它的子元素给触发了。我们要如何阻止这样的事情发生呢?

JS中提供了stopPropagation() 方法来阻止事件捕获和事件冒泡的发生,语法格式如下:

event.stopPropagation();

注意:stopPropagation()会阻止事件捕获和事件冒泡,但是无法阻止标签的默认行为,例如点击链接任然可以打开对应网页。

事件冒泡和捕获

 此外,可以使用stopImmediatePropagation()方法来阻止同一节点的同一事件的其它事件处理程序,例如:为某个节点定义了多个点击事件,当事件触发时,这些事件会按定义顺序依次执行,如果其中一个事件处理程序中使用了 stopImmediatePropagation() 方法,那么剩下的事件处理程序将不再执行。

语法格式如下:

event.stopImmediatePropagation();

示例:

事件冒泡和捕获

 文章来源地址https://www.toymoban.com/news/detail-485616.html

5.阻止默认操作

某些事件具有与之关联的默认操作,例如:当单击某个链接时,会自动跳转到指定的页面,当单击提交按钮时,会将数据提交到服务器等。如果不想这样的默认操作发生,可以使用 preventDefault() 方法来阻止,其语法格式如下:

event.preventDefault();

示例:

事件冒泡和捕获

注意:IE9 及以下的版本不支持 preventDefault() 方法,对于 IE9 及以下的浏览器可以使用 event.returnValue = false;

 

到了这里,关于事件冒泡和捕获的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JS事件冒泡与JS事件代理(事件委托)

    通俗来讲,当触发(点击或者触摸之类的做法)有父元素的子元素的时候,事件会从事件源(被点击的子元素)开始逐级向上传播,触发父级元素的点击事件,一直会传到window。如果在某一层想要中止冒泡,使用 event.stopPropagation() 。下面见详细的代码: 我们可以发现,当点

    2024年02月09日
    浏览(47)
  • uniapp阻止事件冒泡

    在 UniApp 中,阻止事件冒泡的方式与普通的前端开发类似,可以使用 @click.stop 或 @tap.stop 事件修饰符来阻止事件的进一步传播。 以下是在 UniApp 中阻止事件冒泡的示例:   在上面的示例中,当点击内部按钮时,通过 @click.stop 修饰符阻止了事件冒泡,因此不会触发外部按钮的点

    2024年02月08日
    浏览(38)
  • Vue中阻止事件冒泡

    vue中阻止时间冒泡: @click.stop : 阻止事件冒泡 @click.prevent : 阻止事件默认行为 @click.self : 事件只作用在元素本身,而不是其子元素。

    2024年02月13日
    浏览(39)
  • uniapp点击事件阻止冒泡(实用)

    代码展示 效果图 点击事件1,输出内容:(使用的点击事件:@click.   点击事件2,输出内容:(使用的点击事件:@click.stop)  点击事件3,输出内容:(使用的点击事件:@click) 备注:事件的@click.stop防止了事件冒泡,所以不会答应click1 应用场景  当同一个页面出现多个点击

    2024年02月15日
    浏览(40)
  • 微信小程序阻止事件冒泡

    微信开发文档 | 事件详解、事件绑定 微信开发文档上提供了不同的事件绑定方法: 1. bindtap:普通事件绑定 2. catchtap:绑定并阻止事件冒泡 3. mut-bind :互斥事件绑定 如下方示例,在使用catchtap绑定事件后,当用户点击image时,事件不会向上冒泡,就不会触发view绑定的点击事件

    2024年02月09日
    浏览(40)
  • C#开发winform&wpf后台捕获鼠标移动事件

    做 WPF和winform的时候,可以在界面上设置鼠标移动事件来检测鼠标移动,如果项目为后期改造这样做的话改动量很大,今天通过另外一种后台调用windows api的方式进行快速捕获和触发,提高开发效率分享给大家。

    2024年02月16日
    浏览(46)
  • 微信小程序基础知识--图片跳转,事件跳转,冒泡事件

    一、 图片携带的跳转 首页 错误 1.1    指定路径 导航组件 指定跳转的路径  并进行参数的传递? 传递数据的名称 ur1 指定跳转路径  传递id 1.2  js文件中显示跳转的id信息 详情页的js中  从服务器中读取的数据  并由console.log 表示出来的 1.3  常用跳转的方法    展示上图设

    2024年02月09日
    浏览(51)
  • vue项目遇见事件冒泡如何处理

      Win 10 element-ui  \\\"2.8.2\\\" Vue 2.9.6 如下图,当我们点击页面某个元素时,会产生点击事件,事件由外到内,逐层递进(事件捕获阶段,途中的1-2-3-4),当目标元素捕捉到目标事件时,会响应事件,并由内到外,逐层往外传递(事件冒泡阶段,图中的4-5-6-7),这便是事件冒泡。正式

    2023年04月09日
    浏览(22)
  • 微信小程序阻止事件冒泡【看这里】

    微信小程序阻止事件冒泡 将子类的点击事件 bindtap 写成 catchtap bindtap :子元素使用bindtap绑定事件后,执行的时候,会冒泡到父元素(触发父元素上绑定的bingtap事件) catchtap :不会冒泡到父元素上,阻止事件冒泡 uniapp阻止事件冒泡 将子类的点击事件 @click 写成 @click.stop 利用

    2024年02月11日
    浏览(44)
  • 在微信小程序中怎样阻止冒泡事件?

    在微信小程序当中,当两个包含的视图都使用了bindtap函数来绑定点击事件的话,就会发生冒泡事件(即点击内部事件时将同时触发外部事件),如果我们要想阻止冒泡事件的发生,将被包含在内部的bindtap该为catchtap即可,下面请看具体事例。 如下图所示,红色框子部分绑定

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包