JavaScript 事件冒泡与捕获机制 --- 带动态图理解

 (1).事件捕获

从根元素往上传递  --- ---(由外到内)

(2).事件冒泡

从元素传递到它的根源素  --- --- (由内到外)

代码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<!-- js中方法需要加() 如captrueMode()  --><body><div class="buttonBox"><button class="captrue" onclick="captrueMode('捕获模式')">捕获模式</button><button class="bubbling" onclick="bubblingMode('冒泡模式')">冒泡模式</button><div>当前模式为:(<span id="activeShow"></span>)</div></div><div id="six">6<div id="five">5<div id="four">4<div id="three">3<div id="two">2<div id="one">1</div></div></div></div></div></div>
</body>
<script>// 获取元素var elementOne = document.getElementById('one');var elementTwo = document.getElementById('two');var elementThree = document.getElementById('three');var elementFour = document.getElementById('four');var elementFive = document.getElementById('five');var elementSix = document.getElementById('six');const elementArr = [elementOne, elementTwo, elementThree, elementFour, elementFive, elementSix];var modeFlag = false; // 默认 -- 冒泡模式// 改变模式提示文字方法const updateText = (text) => {return document.getElementById('activeShow').innerText = text;}// ! 模式效果操作函数封装const directionHandle = function (event) {operateHandle(event, this);}// 元素添加监听控制事件方法封装const addEventIsElement = function () {elementArr.forEach(item => item.addEventListener('click', directionHandle, modeFlag));}// 元素删除监听控制事件方法封装const removeEventIsElement = function () {elementArr.forEach(item => item.removeEventListener('click', directionHandle, modeFlag));}// 切换为捕获模式function captrueMode(mode) {removeEventIsElement();modeFlag = true, updateText(mode);addEventIsElement();}// 切换为冒泡模式function bubblingMode(mode) {removeEventIsElement();modeFlag = false, updateText(mode);addEventIsElement();}bubblingMode('冒泡模式'); // 默认切换为冒泡模式  var showTime = 0;var cancelShowTime = 1000;// ! 改变属性const updateClass = (thisDirection, isAccNumber = false) => {if (isAccNumber) { showTime += 1000, cancelShowTime += 1000; }setTimeout(() => { thisDirection.className = 'activeColor'; }, showTime);// 2ssetTimeout(() => { thisDirection.className = ''; }, cancelShowTime);}// !! 封装操作函数 --  xconst operateHandle = (event, thisDirection) => {if (modeFlag) {if (thisDirection.id === 'six') {showTime = 0;cancelShowTime = 1000;updateClass(thisDirection);} else {updateClass(thisDirection, true);}} else {if (event.srcElement.id === thisDirection.id) {showTime = 0;cancelShowTime = 1000;updateClass(thisDirection);} else {updateClass(thisDirection, true);}}}</script></html>
<style lang="css">#six {width: 1200px;height: 300px;border: 1px solid #000;text-align: center;margin: auto;position: absolute;top: 50%;left: 50%;transform: translate(-50%, -110%);background-color: #fff;}#five {width: 1000px;height: 250px;border: 1px solid #000;margin: auto;background-color: #fff;}#four {width: 800px;height: 200px;border: 1px solid #000;margin: auto;background-color: #fff;}#three {width: 600px;height: 150px;border: 1px solid #000;margin: auto;background-color: #fff;}#two {width: 400px;height: 100px;border: 1px solid #000;margin: auto;background-color: #fff;}#one {width: 200px;height: 50px;border: 1px solid #000;margin: auto;background-color: #fff;}.activeColor {background-color: red !important;}.captrue {width: 120px;height: 36px;}.buttonBox {width: 1200px;margin: auto;}.bubbling {width: 120px;height: 36px;}
</style>

(3). 事件委托

事件委托:在需要的时候把事件交给别的元素来做 --- ---

优点 :(1) 减少内存消耗 ---- ---- 不用在每个标签上添加事件,只需获取父元素下的元素,绑定事件即可完成全部操作。

            (2) 具有动态绑定的效果 ---- ---- 在获取全部元素的条件下,不管增加或者减少的情况下都是一样的

 示例:在页面加载完的时候给元素添加上事件,然后来实现操作

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>JavaScript</title>
</head><body><ul id="list" style="width: 100px;margin:0;float: left;"><li>1</li><li>2</li><li>3</li><li>4</li></ul><button style="float:left;" id="addli">添加一个 li</button><button style="float:left;" id="delli">删除一个 li</button><script>window.onload = function () { 在页面加载完的时候获取到需要的元素debuggervar the_ul = document.getElementById('list');var the_li = the_ul.getElementsByTagName('li');var sum = the_li.lengththe_ul.onclick = function (e) {console.log(e.target.innerHTML)};document.getElementById('addli').onclick = function () { 给需要的元素绑定上相应的事件var newli = document.createElement("li"); 逻辑处理newli.innerHTML = ++sum;the_ul.appendChild(newli);};document.getElementById('delli').onclick = function () { 给需要的元素绑定上相应的事件the_ul.firstElementChild.remove();逻辑处理};}</script>
</body></html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/219648.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Windows 11/10 上恢复已删除文本文件的 4 种方法

您是否不小心从桌面上删除了文本文件&#xff1f;不用担心。您可以在 Windows 上恢复已删除的文本文件&#xff01; 对于那些有大量工作要做的人来说&#xff0c;便利贴无疑是一种福音。便利贴能够立即记下任何内容并使其可见&#xff0c;而不会占用太多屏幕空间&#xff0c;因…

vue写了这么久了您是否知道:为什么data属性是一个函数而不是一个对象?

一、实例和组件定义data的区别 vue实例的时候定义data属性既可以是一个对象&#xff0c;也可以是一个函数 const app new Vue({el:"#app",// 对象格式data:{foo:"foo"},// 函数格式data(){return {foo:"foo"}} })组件中定义data属性&#xff…

Vue 项目关于在生产环境下调试

前言 开发项目时&#xff0c;在本地调试没问题&#xff0c;但是部署到生产会遇到一些很奇怪的问题&#xff0c;本地又没法调&#xff0c;就需要在生产环境/域名下进行调试。 在这里介绍一个插件Vue force dev ,浏览器扩展里下载 即便是设置了Vue.config.devtoolsfalse 只要安…

【Spark面试】Spark面试题答案

目录 1、spark的有几种部署模式&#xff0c;每种模式特点&#xff1f;&#xff08;☆☆☆☆☆&#xff09; 2、Spark为什么比MapReduce块&#xff1f;&#xff08;☆☆☆☆☆&#xff09; 3、简单说一下hadoop和spark的shuffle相同和差异&#xff1f;&#xff08;☆☆☆☆☆…

音视频技术开发周刊 | 324

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 467亿参数MoE追平GPT-3.5&#xff01;爆火开源Mixtral模型细节首公开&#xff0c;中杯逼近GPT-4 今天&#xff0c;Mistral AI公布了Mixtral 8x7B的技术细节&#xff0c;不…

为开发者设计的幻灯片演示工具Slidev

什么是 Slidev &#xff1f; Slidev 是专为程序员打造的演示文稿工具。该项目是基于 Web 的幻灯片制作和演示工具&#xff0c;让用户可以使用 纯文本 Markdown 语法制作幻灯片&#xff0c;支持导出为 PDF 或 PNG 格式的文件&#xff0c;或以单页面展示幻灯片。对于大多数不擅长…

如何使用ArcGIS Pro裁剪影像

对影像进行裁剪是一项比较常规的操作&#xff0c;因为到手的影像可能是多种范围&#xff0c;需要根据自己需求进行裁剪&#xff0c;这里为大家介绍一下ArcGIS Pro中裁剪的方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的影像和行政区…

C语言—小小圣诞树

这个代码会询问用户输入圣诞树的高度&#xff0c;然后根据输入的高度在控制台上显示相应高度的圣诞树。 #include <stdio.h>int main() {int height, spaces, stars;printf("请输入圣诞树的高度: ");scanf("%d", &height);spaces height - 1;st…

Postman介绍和快速使用

Postman 是什么&#xff1f; Postman 是一个流行的API&#xff08;Application Programming Interface&#xff09;开发工具&#xff0c;它使得开发者可以很容易地创建、测试、共享和文档化API。Postman 提供了一个友好的用户界面&#xff0c;来发送HTTP请求&#xff0c;接收响…

容器技术:从虚拟机到轻量级容器的革命

一、引言 首先&#xff0c;什么是容器&#xff1f; 容器是一种沙盒技术&#xff0c;主要目的是为了将应用运行在其中&#xff0c;与外界隔离&#xff1b;及方便这个沙盒可以被转移到其它宿主机器。本质上&#xff0c;它是一个特殊的进程。通过名称空间&#xff08;Namespace&a…

解析视频美颜SDK的算法:美肤、滤镜与实时处理

如今&#xff0c;美颜技术在视频处理中扮演着关键的角色&#xff0c;为用户提供更加精致的视觉体验。本文将深入探讨视频美颜SDK的算法&#xff0c;聚焦于美肤、滤镜与实时处理等方面&#xff0c;揭示背后的科技奥秘。 一、美肤算法的魅力 视频美颜的一个核心功能就是美肤&am…

实现el-table操作列点击弹出echarts

代码&#xff1a; <el-table-column :width"90"><template #default"scope"><el-popover placement"left-end" width"550" trigger"click"><div><div style"font-size: 18px; margin-left…

Kotlin 笔记 -- Kotlin 语言特性的理解(二)

都是编译成字节码&#xff0c;为什么 Kotlin 能支持 Java 中没有的特性&#xff1f; kotlin 有哪些 Java 中没有的特性&#xff1a; 类型推断、可变性、可空性自动拆装箱、泛型数组高阶函数、DSL顶层函数、扩展函数、内联函数伴生对象、数据类、密封类、单例类接口代理、inter…

音频I2S

前言 基于网上资料对相关概念做整理汇总&#xff0c;部分内容引用自文后文章。 学习目标&#xff1a;简单了解相关概念、相关协议。 1 概述 数字音频接口DAI&#xff0c;即Digital Audio Interfaces&#xff0c;顾名思义&#xff0c;DAI表示在板级或板间传输数字音频信…

1265. 数星星(树状数组/蓝桥杯)

题目&#xff1a; 输入样例&#xff1a; 5 1 1 5 1 7 1 3 3 5 5输出样例&#xff1a; 1 2 1 1 0 思路&#xff1a; 树状数组 代码&#xff1a; #include<cstdio> #include<iostream> using namespace std; const int N32010; int n; int tr[N],level[N];int lo…

Linux 基本语句_16_Udp网络聊天室

代码&#xff1a; 服务端代码&#xff1a; #include <stdio.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdlib.h> #include <unistd.h> #include <string…

云基础软件深化合作,云轴科技ZStack与麒麟软件战略签约

12月8日&#xff0c;云轴科技ZStack与麒麟软件战略合作签约仪式在北京举行&#xff0c;双方对过往紧密合作表达了充分肯定&#xff0c;并就进一步联合技术创新、打造重点行业标杆和持续赋能客户达成高度共识。云轴科技创始人&CEO张鑫和麒麟软件高级副总经理谢文征共同见证双…

教师考编需要什么条件

教师考编&#xff0c;了解考编需要什么条件是非常重要的。接下来&#xff0c;我来介绍几点教师考编的条件。 需要具备相应的学历背景。一般来说&#xff0c;考编需要具备本科或以上学历&#xff0c;并且所学专业与所报考的岗位相关。在某些特殊情况下&#xff0c;如报考幼儿园教…

sap table 获取 valuation class MBEW 查表获取

参考 https://www.tcodesearch.com/sap-tables/search?qvaluationclass

【️接口和抽象类的区别,如何选择?】

✅接口和抽象类的区别&#xff0c;如何选择&#xff1f; ✅ 接口和抽象类的区别✅方法定义✅修饰符✅构造器✅继承和实现✅单继承 、 多实现✅职责不同 ✅什么是模板方法模式&#xff0c;有哪些应用呢&#xff1f;✅典型理解✅示例&#x1f4a1;思考 ✅你在工作中是如何使用设计…