事件冒泡原理自我理解以及使用

【JavaScript 中的事件冒泡和事件捕获有什么区别?】 事件冒泡和事件捕获是 JavaScript 事件模型中的两个重要概念,理解它们的区别和工作原理对于正确处理 DOM 事件至关重要。本文将深入探讨事件冒泡和事件捕获的概念、区别以及在实际开发中的应用。JavaScript、事件冒泡、事件捕获、事件传播、事件委托、DOM 事件、addEventListener、事件处理、事件流、前端开发、前端面试、前端基础、前端进阶、前端工程化、前端开发最佳实践WindowDocumentHTMLBodyTarget Element 二、事件冒泡 2.1 事件冒泡的定义 输出: 阅读详情

首先,这是我自己在学习过程中对于时间冒泡原理的理解,如果有不对的地方,读者尽可提出,不断学习。

一:事件冒泡和阻止冒泡以及使用场景:

1.事件冒泡,就是元素自身的事件被触发后,如果父元素有相同的事件,如onclick事件,那么元素本身的触发状态就会传递,也就是冒到父元素,父元素的相同事件也会一级一级根据嵌套关系向外触发,直到document/window,冒泡过程结束。

2.比如:

<div class="box" styel="width:200px; height: 200px;background_color:'#ddd'">

<div class="box1" styel="width:200px; height: 200px;background_color:'#000'>

<div class="box2" styel="width:200px; height: 200px;background_color:'#eee'></div>

</div>

</div>

<script>

document.querySelector(".box").onclick=function(){

alert("我是box")

}

document.querySelector(".box1").onclick=function(){

alert("我是box1")

}

document.querySelector(".box2").onclick=function(){

alert("我是box2")

}

document.onclick=function(){

alert("我是document")

}

</script>

此时触发box2中的额onclick事件,会依次弹出“我是box2” 我是box1 我是box1 我是document。这就是事件冒泡。

3.但是事件冒泡在某些应用场景产生一些问题,就是我们不需要触发的事件,由于冒泡的原因,也会运行。所以在这个时候要取消事件冒泡。直接粘图(不知道用什么工具直接粘贴代码,带原格式的。。。)

    box.onmouseover = function (event) {
        // 阻止冒泡
        event = event || window.event;
        if(event && event.stopPropagation){
            event.stopPropagation();
        }else{
            event.cancelBubble = true;
        }
    }

4.那么事件冒泡和组织冒泡什么时候会用到呢?

记着只要是能够触发事件冒泡的情况下,就考虑取消事件冒泡,或者直接利用事件冒泡。

在这里,有一个例子,可以实现阻止事件冒泡来实现,就是模态框的显示和隐藏:(模态框不懂自行参考)。

    <div class="mask">
        <div class="login" id="login"></div>
    </div>
    <a href="#">注册</a>
    <a href="#">登陆</a>
    <script>
        //1.给登录绑定事件
        var mask = document.getElementsByClassName("mask")[0];
        var a = document.getElementsByTagName("a")[1];
        a.onclick = function (event) {
            //显示模态框
             ele.style.display = "block";
            //阻止冒泡
            event = event || window.event;
            if(event && event.stopPropagation){
                event.stopPropagation();
            }else{
                event.cancelBubble = true;
            }
        }
        //2.给document绑定事件,因为可以冒泡,只要判断,点击的不是login,那么隐藏模态框
           document.onclick = function (event) {
            // 获取点击按钮后传递过来的值。
            event = event || window.event;
            //兼容获取事件触动时,被传递过来的对象
           var aaa = event.target || event.srcElement;
            var aaa = event.target?event.target:event.srcElement;
            console.log(event.target);
            //判断目标值的ID是否等于login,如果等于不隐藏盒子,否则隐藏盒子。
            if(aaa.id !== "login"){
                mask.style.display = "none";
            }
            alert("123")
        }
    </script>

解释:因为document和a都绑定了onclick事件,而且是嵌套的关系,当点击a标签的时候,会造成事件冒泡,既会显示mask模态框,又会弹出“123”的弹出框,所以我们要组织事件的冒泡。如上。

然后判断点击的对象target是不是mask,如果不是mask,就运行mask.style.display="none",模态框消失。

二:事件委托:

1.刚开始接触事件委托概念的时候,很是懵逼,搞不懂到底是一个怎样的委托过程,怎么实现的,但是学到一定程度回过头来,也感觉很好理解。

个人认为事件冒泡存在的意义,就是在事件运行过程中,避免使用循环遍历的方式去给每个同级元素触发相同的事件,而优化性能。要知道,元素量无限大,循环遍历是个噩梦,这也是网站性能优化的一个方面,就是尽量减少使用循环遍历。好了,简单说说我对事件委托理解,实例是摘抄过来的:

如果要实现列表中,当鼠标over的时候,给每个li添加背景:一般想到的方法就是循环遍历添加,如下:

<ul id="ul">
	<li>aaaaaaaa</li>
	<li>bbbbbbbb</li>
	<li>cccccccc</li>
</ul>
window.onload = function(){
	var oUl = document.getElementById("ul");
	var aLi = oUl.getElementsByTagName("li");

	for(var i=0; i<aLi.length; i++){
		aLi[i].onmouseover = function(){
			this.style.background = "red";
		}
		aLi[i].onmouseout = function(){
			this.style.background = "";
		}
	}
}
在元素个数不多的情况下可以使用,但元素很多的时候,不建议使用,建议使用冒泡的事件委托:原理如下:

window.onload = function(){
	var oUl = document.getElementById("ul");
	var aLi = oUl.getElementsByTagName("li");

/*
这里要用到事件源:event 对象,事件源,不管在哪个事件中,只要你操作的那个元素就是事件源。
ie:window.event.srcElement
标准下:event.target
nodeName:找到元素的标签名
*/
	oUl.onmouseover = function(ev){
		var ev = ev || window.event;
		var target = ev.target || ev.srcElement;
		//alert(target.innerHTML);
		if(target.nodeName.toLowerCase() == "li"){
		target.style.background = "red";
		}
	}
	oUl.onmouseout = function(ev){
		var ev = ev || window.event;
		var target = ev.target || ev.srcElement;
		//alert(target.innerHTML);
		if(target.nodeName.toLowerCase() == "li"){
		target.style.background = "";
		}
	}
}
只要判断over或者out的对象,nodeName是不是"li",是的话就添加或者去掉背景。

2.还有一种情况:就是新添加的元素:

我们通常会使用Document.createElement("li");创建新的元素,然后再appendChild添加到父标签中。但是有这样一种情况,我是循环遍历给每个li标签绑定了鼠标悬停现实背景色的事件,但这样,新添加的元素就不会被循环到,因为添加之前已经循环停止了:所以:使用事件委托,就很好的解决了这个问题:

window.onload = function(){
	var oUl = document.getElementById("ul");
	var aLi = oUl.getElementsByTagName("li");
	var oBtn = document.getElementById("btn");
	var iNow = 4;

	oUl.onmouseover = function(ev){
		var ev = ev || window.event;
		var target = ev.target || ev.srcElement;
		//alert(target.innerHTML);
		if(target.nodeName.toLowerCase() == "li"){
		target.style.background = "red";
		}
	}
	oUl.onmouseout = function(ev){
		var ev = ev || window.event;
		var target = ev.target || ev.srcElement;
		//alert(target.innerHTML);
		if(target.nodeName.toLowerCase() == "li"){
		target.style.background = "";
		}
	}
	oBtn.onclick = function(){
		iNow ++;
		var oLi = document.createElement("li");
		oLi.innerHTML = 1111 *iNow;
		oUl.appendChild(oLi);
	}
}


事件冒泡VS事件捕获 阅读详情

相关推荐

前端开发:JS的事件冒泡和事件捕获详解

在前端开发过程中,关于JS原生的核心内容使用是日常工作中的常态,关于底层和原理的掌握使用,尤其是在性能优化方面甚为重要。作为前端开发的进阶内容,在实际开发过程中事件发生的顺序称为事件流,当触发某个事件的时候会引起一系列的连锁反应,但是当业务场景中页面功能嵌套了某几个元素来处理同一个事件,那么哪个事件会先被触发?这就需要了解事件传播当顺序。

全沾软贱开发攻城狮 1万+

什么是事件冒泡

什么是事件冒泡 事件冒泡就是指父元素和子元素有相同的事件,当触发子元素事件时,会向上冒泡,同时也会触发父元素事件 事件冒泡的三个阶段 1、捕获阶段:从window对象传导到目标节点(上层传到底层)称为“捕获阶段”,捕获阶段不会响应任何事件; 2、目标阶段:在目标节点上触发称为“目标阶段”; 3、冒泡阶段:从目标节点传导回window对象(从底层传回上层),称为“冒泡阶段”; 事件冒泡的原理 事件委托原理就是利用事件冒泡机制把里层所需要响应的事件绑定到外层 ...

v_jinfuwu的博客 9914

深信服PT1-AF实验考试

深信服PT1-AF实验考试实验练习可以去深信服的在线实验平台(链接如下):深信服在线实验平台 (sangfor.com.cn)实验考试其实就是把所有的每一部分实验综合了起来以下内容仅做参考,不确保一样。

m0_72019240的博客 7119

前端面试之事件捕获、时间冒泡总结

1、DOM 事件流 以程序的角度说,流是具有方向的数据。 事件流所描述的就是从页面中接受事件的顺序。 事件捕获:它认为当某个事件发生时,父元素应该更早接收到事件,具体元素则最后接收到事件。 事件冒泡:事件冒泡即事件开始时,由最具体的元素接收(也就是事件发生所在的节点),然后逐级传播到较为不具体的节点。 DOM事件流包括三个阶段: 事件捕获阶段:事件从最上一级标签开始往下

汤又歌的私人博客 4632

lvds接口_LVDS,接口,时序讲解,非常好的文章

欢迎FPGA工程师加入官方微信技术群点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群1.1.1 LVDS接口分类1.1.1.1 单路6bit LVDS这种接口电路中,采用单路方式传输,每个基色信号采用6位数据,共18位RGB数据,因此,也称18位或18bit LVDS接口。此,也称18位或18bit LVDS接口。1.1.1.2 双路6bit LVDS这种接口电...

weixin_39639286的博客 1904

【机器人】线性方程最小二乘解法对机械臂DH参数进行标定

1.前言 看了一篇文章,觉得里面的DH参数标定法讲的很清晰,便使用Matlab复现了一下,效果还可以,特写此文记录。 2.原理 2.1.误差最佳值的最小二乘计算 有研究结果表明:几乎95%的机器人位置误差都是由机器人内部运动学的不准确描述引起的,所以对DH模型参数进行标定是很有必要的。 DH参数物理含义:选自《机器人学、机器视觉与控制-Matlab基础》 当DH参数确定后,我们...

要恰饭得嘛 1万+

解释事件冒泡和事件捕获的原理,并说明它们之间的区别与使用场景

事件冒泡和事件捕获是什么?能做什么?看完这篇你就明白了

weixin_53291256的博客 6477

【从零开始学习 UVM】1.1、UVM 概述 —— Preface

【从零开始学习 UVM】1.1、UVM 概述 —— Preface

努力,加油每一天鸭~ 826

事件冒泡

事件的冒泡(Bubble) 所谓的冒泡指的就是事件的向上传导,当后代元素上的事件被触发时,其祖先元素的相同事件也会被触发 在开发中大部分情况冒泡都是有用的,如果不希望发生事件冒泡可以通过事件对象来取消冒泡 是看代码,从里往上冒泡,要想取消冒泡,是设置two不冒泡 一.有用的冒泡 <style> #one{ width: 50px; height...

xiaoxingxingzai的博客 1201

基于 51 单片机的智能手势控制小车设计与实现

智能手势控制小车以STC89C52RC 单片机为控制核心,通过手势识别模块采集用户手势指令,经单片机处理后驱动电机执行前进、后退、左转、右转等动作。该项目融合了传感器技术、单片机编程和电机驱动技术,具有成本低、易实现、互动性强的特点,适合作为嵌入式系统入门实践案例。本项目成功实现了基于 51 单片机的智能手势控制小车,通过 APDS-9960 模块采集手势信号,经单片机处理后驱动电机完成基本动作,验证了 “传感器 + 单片机 + 执行器” 的嵌入式系统设计思路。

weixin_42300449的博客 178

《拉依达的嵌入式\驱动面试宝典》—操作系统篇(二)

《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选

拉依达不拉跨的博客 472

【JavaScript】事件冒泡详解

事件冒泡(Event Bubbling)是指当某个元素上的事件被触发时,该事件会向父级元素传递,直到传递到document对象的过程。在此过程中,所有绑定在这些父级元素上的相同类型的事件处理程序都会依次被触发。这个传递过程就像气泡从水底逐渐向上升一样,因此被称为"冒泡"。事件冒泡是 JavaScript 中非常重要的事件模型,通过它,开发者可以简化事件处理逻辑,尤其是在动态内容和复杂交互中。理解事件冒泡的工作机制和应用场景可以帮助你编写更加高效、易维护的代码。

lph159的博客 4641

科研绘图系列:基因突变瀑布图统计以及可视化

科研绘图系列:基因突变瀑布图统计以及可视化

专注生信领域 1655

深入理解事件冒泡:原理、行为及应用

事件冒泡是JavaScript事件处理模型中的一个重要特性,它描述了事件在DOM树中从目标元素向上传播的行为。理解事件冒泡的原理、行为以及如何控制它,对于优化事件处理、实现事件委托和构建高效的交互应用具有关键作用。通过合理利用事件冒泡,开发者可以在减少代码复杂度、提高性能的同时,实现更加灵活和强大的事件处理机制。在实际开发中,需要根据具体的应用场景,灵活运用事件冒泡及其相关的控制方法,以达到最佳的开发效果。

你若盛开,清风自来 1284

彻底解析 DDIC_TYPE_INCONSISTENCY:从 ABAP ST22 连环 Dump 到 SE14 一键修复

听上去像内核级的致命故障,实则更多源于日常运维的细枝末节。只要掌握的排查三板斧,结合严格的变更流程与周期性的字典体检,再严重的 Dump 也能化险为夷。希望本文的案例与步骤能帮助读者在下一次遇到类似问题时,既能快速止血,也能追根溯源,避免重蹈覆辙。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 629

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JS中阻止冒泡事件的三种方法

冒泡事件:比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发。这一过程被称为事件冒泡。 <div class="box"> <button class="btn">按钮</button> </div> <script type="text/javascript"> $('.btn').click(functio...

小小前端 7万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

js 事件冒泡和事件捕获

一块: 事件流描述的是从页面接收事件的顺序。  IE的事件是冒泡事件流,  而firefox的事件流是捕获事件流。  1.事件冒泡  IE的事件流叫做事件冒泡,即事件从最具体的元素到不具体的元素。  好比气泡从水底下一直向上冒泡,像dom树一样,一直到根元素。  2.事件捕获  即从不具体的元素到具体的元素 事件传递有两种方式:冒泡与捕获。 事件传递定义了元素事件触发的顺序。 如果你将 &l...

前端技术的学习整理 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

最容易理解的 js事件冒泡原理

前些时间有位大佬问到“js冒泡原理”,平时也只是用冒泡处理各种特效和功能,这里给大家详细介绍下js冒泡原理 事件冒泡自如其名 就是会逐层向上的触发,与之相对的是 事件捕获 首先我们要知道什么是DOM DOM可以理解为是一个树形结构,在DOM模型中,HTML元素是有层次的。当一个HTML元素上产生一个事件时,该事件会在DOM树中元素节点与根节点之间按特定的顺序传播,路径所经过的节点都...

qq_40467180的博客 1542

JavaScript DOM事件流事件捕获事件冒泡

事件 在讲事件流之前,我们先来了解一下事件。 JavaScript与HTML之间的交互是通过事件来实现的。事件:就是文档或浏览器窗口中发生的一些特定的交互瞬间。我们可以使用侦听器(或事件处理程序)来预订事件,以便事件发生时执行相应的代码。说白了,就是当我们对页面上的某些元素进行某些操作(比如鼠标单击)时产生一些特定的行为。比如鼠标单击一个按钮然后弹出一个对话框。这里就涉及到了按钮的click事件,产生的行为就是弹出了一个对话框。 事件最早是在IE3和Netscape Navigator2 中出现的,当

lixiaosenlin的专栏 7906

深入解析JavaScript事件冒泡的底层原理

事件冒泡(Event Bubbling)是事件流中的一个重要阶段,它描述了事件从目标元素开始,逐级向上传播到`window`对象的过程。事件冒泡机制允许开发者在事件到达目标元素后,继续在祖先元素上处理事件。理解事件冒泡的底层原理对于编写高效、可靠的事件处理程序至关重要。本文将深入探讨事件冒泡的机制、实现方式以及如何在实际开发中利用事件冒泡来优化事件处理

你若盛开,清风自来 1011

事件冒泡和捕获

事件冒泡和捕获

weixin_58155690的博客 6615

事件流、事件冒泡、事件捕捉、事件委托

一:概念 事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件。 事件冒泡刚好相反,是从触发事件的那个节点一直到document,是自下而上的去触发事件。 事件委托:利用了事件冒泡的原理,在下方通过实例讲解 补充:绑定事件方法(addEventListener)的第三个参数,就是控制事件触发顺序是否为事件捕获。true,事件捕获;false,事件冒泡。默认false,即事

神以灵的博客 8378

js事件冒泡和事件捕获

事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题。 <div id="outer"> <p id="inner">Click me!</p> </div> 上面的代码中一个div元素中有一个p子元素,如果两个元素都有一个click的处理函数,那么我们怎么才能知道哪一个函数首先被触发呢? 为了解决这个问题,微软和网景提出了两种完全相反的概念。 1.事件冒泡 微软提出了名为事件冒泡的事件流。这个事件流是

qq_45149366的博客 5557

你真的理解事件绑定、事件冒泡和事件委托吗?

一文了解Web API中的事件绑定、事件冒泡、事件委托引言正文一、事件绑定1、事件和事件绑定时什么?2、事件是如何实现的?二、事件冒泡1、事件模型2、事件模型解析(1)捕获阶段(2)目标阶段(3)冒泡阶段3、addEventListener语法4、事件冒泡和事件捕获举例(1)事件冒泡(2)事件捕获(3)事件捕获VS事件冒泡三、事件代理(事件委托)四、总结和回顾结束语 引言 事件,是JS Web API比较重要的一个知识点。我们平常所看到的网页,肯多内容都要用到事件。比如说一个点击、一个下拉、一个滚动,都要用

moandaylab 776

事件捕获、冒泡的工作原理

事件捕获、冒泡的工作原理什么是事件流什么是事件冒泡?什么是事件捕获图解 什么是事件流 事件流是指从页面中接收事件的顺序。也就是说,当一个事件产生时,这个事件的传播过程就是事件流。 什么是事件冒泡? IE中的事件流叫事件冒泡。事件冒泡是指事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点(文档)。对于HTML来说,当一个元素产生一个事件时,它会把这个事件传递给它的父元素,父元素接收到之后,还要继续传递给它的上一级元素,就这样一直传播到document对象(一些浏览器会传播到window对象)。

shao_xuan_的博客 1709

关于dom 事件冒泡、捕获 dom事件三个阶段

本文主要解决两个问题: 什么是事件流 DOM事件流的三个阶段 起因 温故了一下我的《JavaScript高级程序设计》的时候,翻到DOM事件那一章,(说实话,现在无论是什么框架你都离不开操作DOM啊,毕竟这是你展示的最基本元素,就像人的细胞)。想起了dom事件流原理,好多人不明白,只知道click mouseout等实用场景,真要理解和更进一步的前端是要

小北哥哥和北妈 1万+
上一篇: git版本控制工具常用指令以及github
下一篇: 关于学习过程中小知识点的总结与归纳
L_YNAN
博客等级 码龄9年 4粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值