JavaScript入门之事件流及事件冒泡

JS事件流与冒泡详解
本文深入解析JavaScript中事件流的概念,包括事件冒泡与捕获机制,通过实例演示事件冒泡的过程及其可能带来的影响,并提供阻止事件冒泡的方法。

什么是JS的事件流

当某个事件执行时(子元素和父元素都绑定了相同的事件)从子元素向父元素触发或者从父元素向子元素触发整个过程称为事件流
子元素向父元素触发称为事件的冒泡
父元素向子元素触发称为事件的捕获
当冒泡和捕获同时存在时会先触发事件捕获

事件冒泡

当子元素和父元素都绑定了相同的事件时执行完子元素的事件函数后会继续执行父元素的事件函数直到执行到document的事件函数才会停止

冒泡例子

CSS代码

#warp{
	  width: 400px;
	  height: 400px;
	  background: skyblue;
	  margin: 50px auto;
}
#box{
   	  width: 200px;
      height: 200px;
      margin: 0 auto;
      background: hotpink;
}

HTML代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <title></title>
    <meta charset="UTF-8">
    <meta name="author" content="YXGR">
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
    <div id="warp"> <div id="box"> </div> </div>
</body>
</html>

JavaScript代码

var box = document.getElementById("box");
var warp = document.getElementById("warp");

box.onclick = function () {
   	console.log("box");
}
warp.onclick = function () {
  	 console.log("warp");
}
document.onclick = function () {
   	console.log("document");
}

当点击了box元素时控制台分别输出了 box warp document
当点击了warp元素时控制台分别输出了warp document
当点击了document时控制台之输出了document

冒泡带来的影响

当我们希望各个元素的事件独立执行时冒泡会干扰我们的效果
例如我想点击某个元素的时候让指定元素显示当点击页面空白位置的时候让该元素隐藏

#warp{
	  width: 400px;
	  height: 400px;
	  background: skyblue;
	  margin: 50px auto;
	  display:none;
}
#box{
   	  width: 200px;
      height: 200px;
      margin: 0 auto;
      background: hotpink;
}

HTML代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <title></title>
    <meta charset="UTF-8">
    <meta name="author" content="YXGR">
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
    <div id="warp">

    </div>
    <div id="box">

    </div>
</body>
</html>

JavaScript代码

var box = document.getElementById("box");
var warp = document.getElementById("warp");

box.onclick = function () {
    warp.style.display = "block";
}
document.onclick = function () {
    warp.style.display = "none";
}

此时点击box之后warp并不会显示出来原因是当点击box之后执行了box的事件函数让warp显示出来了
紧接着事件冒泡到了document上触发了document的事件函数warp立马又隐藏了

阻止事件冒泡

当事件冒泡带来了我们不希望出现的bug时就需要去阻止事件冒泡
CSS和HTML代码不变下面是JavaScript代码

var box = document.getElementById("box");
var warp = document.getElementById("warp");

box.onclick = function (eve) {
    var e = eve || event;
    e.stopPropagation?e.stopPropagation():e.cancelBubble = true;
    //e.stopPropagation()只在高版本浏览器有效(IE8以上)IE8以下使用e.cancelBubble = true
    warp.style.display = "block";
}
document.onclick = function () {
    warp.style.display = "none";
}

事件冒泡并不是所有场景下都需要阻止的有时候利用事件冒泡可以达到一些特殊的效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值