首页 > 编程语言 >JavaScript 事件冒泡和事件捕获

JavaScript 事件冒泡和事件捕获

时间:2023-01-23 22:22:06浏览次数:47  
标签:事件处理 JavaScript 捕获 元素 冒泡 监听器 事件

事件冒泡指的是从触发元素开始,向父元素传播事件的过程。事件捕获则是相反,从父元素开始,向触发元素传播事件。

在 JavaScript 中,当一个事件发生时,会先进行事件捕获,然后再进行事件冒泡。在 DOM 中,所有元素都有一个 addEventListener 方法,可以用来添加事件监听器。这个方法有三个参数:事件类型、事件处理函数、和一个布尔值。如果布尔值是 true,则事件处理函数会在事件捕获阶段执行,如果是 false,则会在事件冒泡阶段执行。

事件冒泡和事件捕获在处理事件时,有着重要的区别。

事件冒泡中,当一个事件在子元素上触发时,会先在该子元素上执行事件处理函数,然后再向其父元素传播,直到文档的根元素。这意味着,如果在父元素上添加了事件监听器,那么在子元素上触发的事件也会在父元素上执行该监听器。

事件捕获中,当一个事件在子元素上触发时,会先从文档的根元素开始,向下传播到该子元素。这意味着,如果在父元素上添加了事件监听器,那么在子元素上触发的事件会先在父元素上执行该监听器。

一般来说,事件冒泡更常用,因为它更符合人类的直觉,也更容易理解和使用。

事件冒泡和事件捕获还有一个重要的区别就是可以在事件传播过程中被阻止。

在事件冒泡中,如果在子元素上触发的事件处理函数中调用了 event.stopPropagation() 方法,那么就可以阻止该事件继续向上传播。

在事件捕获中,如果在父元素上触发的事件处理函数中调用了 event.stopPropagation() 方法,那么就可以阻止该事件继续向下传播。

这两种方法都可以用来阻止事件的传播,但是在实际应用中要根据需求来选择使用哪一种。

另外还有一个叫做 event.preventDefault() 方法可以阻止事件的默认行为。如果需要阻止链接跳转,阻止表单提交等,就需要使用这个方法。

还有一些其他的细节需要注意:

  • 在事件冒泡中,如果在父元素上添加了事件监听器,那么在子元素上触发的事件会先在子元素上执行事件处理函数,然后再在父元素上执行事件处理函数。
  • 在事件捕获中,如果在父元素上添加了事件监听器,那么在子元素上触发的事件会先在父元素上执行事件处理函数,然后再在子元素上执行事件处理函数。
  • 事件传播过程中,如果在某个元素上调用了 event.stopPropagation() 方法,那么该事件就不会再继续传播。
  • 事件传播过程中,如果在某个元素上调用了 event.preventDefault() 方法,那么该事件的默认行为就不会执行。
  • 为了获徖更好的性能,应该尽量少地使用事件监听器。
  • 如果要在多个元素上使用相同的事件处理函数,可以使用事件委托,这样可以减少事件监听器的数量。

总结一下,事件冒泡和事件捕获是 JavaScript 中重要的事件处理机制,它们在事件传播过程中有着重要的作用。使用事件冒泡和事件捕获可以使用户更方便地处理事件,提高代码的可读性和可维护性。

当然,在实际开发中,我们可能会根据需求选择使用事件冒泡或事件捕获。在需要在父元素上捕获子元素的事件时,使用事件捕获;在需要在子元素上冒泡父元素的事件时,使用事件冒泡。

另外,在某些场景中,我们可能需要使用更高级的事件处理方式,例如双击事件、鼠标滚轮事件、键盘事件等。这些事件需要使用特定的事件类型和事件对象来进行处理。

对于这些高级事件,我们可以直接使用 DOM 元素的 addEventListener 方法来进行处理。例如,可以使用 "click" 事件类型来处理鼠标单击事件,使用 "mousewheel" 事件类型来处理鼠标滚轮事件。

需要注意的是,这些高级事件可能在不同浏览器之间有着不同的表现,所以在处理这些事件时需要对兼容性进行相应的处理。

事件冒泡和事件捕获是 JavaScript 中重要的事件处理机制,它们在事件传播过程中有着重要的作用。在开发过程中需要根据需求进行选择使用,并且注意兼容性的问题。

此外, 也可以使用 jQuery 类库来简化事件处理的流程,jQuery 提供了简单易用的 API 来进行事件的绑定和处理。它可以跨浏览器兼容性处理事件,使得事件处理变得更加简单。

例如, 使用 jQuery 的 .click() 方法可以绑定一个元素的单击事件,使用 .on() 方法可以绑定多个事件。可以使用 .off() 方法来取消事件绑定, 使用 .trigger() 方法来触发事件.

jQuery 也支持事件委托,可以通过在父元素上绑定事件,然后通过事件对象 event.target 属性来判断具体是哪个子元素触发了事件.

使用 jQuery 类库可以使事件处理变得更加简单易用,减少兼容性问题的处理。

标签:事件处理,JavaScript,捕获,元素,冒泡,监听器,事件
From: https://www.cnblogs.com/yuzhihui/p/17065624.html

相关文章

  • JavaScript
    JavaScript第三章--类型、值、变量3.10变量声明与赋值3.10.1let,const//let可以声明的同时赋值,也可以只声明,只声明的变量值为undefinedleti,num;letb=10;//co......
  • 冒泡排序函数(算法)
    比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重......
  • JavaScript学习笔记—冒泡排序
    数组内各元素按升或降序排序[9,1,3,2,8,0,5,7,6,4]思路1:比较相邻两个元素,然后根据大小来决定是否交换它们的位置例子:第1次排序:1,3,2,8,0,5,7,6,4,9第2次排......
  • JavaScript学习笔记—数组去重实例
    编写代码去除数组中重复的元素constarr=[1,2,1,3,2,2,4,5,5,6,7];//分别获取数组中的元素for(leti=0;i<arr.length;i++){//获取当前值后边的所有值f......
  • JavaScript学习笔记—复制
    9.复制(1)浅拷贝(shallowcopy)通常对对象的拷贝都是浅拷贝只对对象的浅层进行复制(只复制一层)如果对象中存储的数据是原始值,那么拷贝的深浅是不重要浅拷贝只会对对象本......
  • JavaScript 跨域问题
    一、什么是跨域跨域(Cross-originresourcesharing,CORS)是指在浏览器中,同源策略限制了来自不同域的脚本对每个网络资源的访问权限。同源策略限制了一个网页脚本只能......
  • JavaScript学习笔记—数组的方法
    1.非破坏性方法(1)Array.isArray():用来检查一个对象是否是数组console.log(Array.isArray([1,2,3,4]));//trueconsole.log(Array.isArray({name:"孙悟空"}));//fals......
  • JavaScript对象的创建方式有几种?怎么用?
    JavaScript对象的创建方式有几种?怎么用?对象是JavaScript的基本数据类型,对象不仅是字符串到值的映射还保持自有属性,JavaScript对象可以从一个称为原型的对象继承属性,对象的方......
  • JavaScript中的空值合并操作符【??】和可选链操作符【?.】的理解和使用
    参考:http://t.csdn.cn/5700Y??-空值合并操作符结构:eg:letres=num01??num02;??当左侧的变量为null或undefined的时,返回左侧num02否则返回自身num01(num01相当于nu......
  • JavaScript 循环引用
    JavaScript中的循环引用是指两个或多个对象之间相互引用的情况。这种情况下,这些对象就不能被垃圾回收机制正常回收,会导致内存泄漏。循环引用通常发生在对象之间相互包含......