冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件。
我们在平时的开发过程中,肯定会遇到在一个div(这个div可以是元素)包裹一个div的情况,但是呢,在这两个div上都添加了事件,如果点击里面的div我们希望处理这个div的事件,但是呢,我们不希望外层的div的事件也执行,这时候我们就要用到阻止冒泡。
通俗点来说吧,你在家里看电视,躲在自己的小房间,但是你不希望声音传到隔壁父母的耳朵里,这时候,你可能躲在被窝里,或者墙壁的隔音效果很好,阻隔声音可以理解为阻止冒泡。
请看下面一个示例
参考代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery.min.js"></script>
<style>
#content {
width: 140px;
border: 1px solid blue;
}
#msg {
width: 100px;
height: 100px;
margin: 20px;
border: 1px solid red;
}
</style>
<script type="text/javascript">
$(function () {
// 为内层div绑定click事件
$("#msg").click(function () {
alert("我是小div");
});
// 为外层div元素绑定click事件
$("#content").click(function () {
alert("我是大div");
});
// 为body元素绑定click事件
$("body").click(function () {
alert("我是body");
});
});
</script>
</head>
<body>
<div id="content">
外层div
<div id="msg">
内层div
</div>
</div>
</body>
</html>
当点击小div时,会触发大div与body 的点击事件。点击大div时会触发body的点击事件。
如何防止这种冒泡事件发生呢?
把代码改成如下情况:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery.min.js"></script>
<style>
#content {
width: 140px;
border: 1px solid blue;
}
#msg {
width: 100px;
height: 100px;
margin: 20px;
border: 1px solid red;
}
</style>
<script type="text/javascript">
$(function () {
// 为内层div绑定click事件
$("#msg").click(function (event) {
alert("我是小div");
event.stopPropagation() //阻止事件冒泡
});
// 为外层div元素绑定click事件
$("#content").click(function (event) {
alert("我是大div");
event.stopPropagation() //阻止事件冒泡
});
// 为body元素绑定click事件
$("body").click(function (event) {
alert("我是body");
event.stopPropagation() //阻止事件冒泡
});
});
</script>
</head>
<body>
<div id="content">
外层div
<div id="msg">
内层div
</div>
</div>
</body>
</html>
也可以采用方法避免事件冒泡
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery.min.js"></script>
<style>
#content {
width: 140px;
border: 1px solid blue;
}
#msg {
width: 100px;
height: 100px;
margin: 20px;
border: 1px solid red;
}
</style>
<script type="text/javascript">
$(function () {
// 为内层div绑定click事件
$("#msg").click(function (event) {
alert("我是小div");
return false
});
// 为外层div元素绑定click事件
$("#content").click(function (event) {
alert("我是大div");
return false
});
// 为body元素绑定click事件
$("body").click(function (event) {
alert("我是body");
return false
});
});
</script>
</head>
<body>
<div id="content">
外层div
<div id="msg">
内层div
</div>
</div>
</body>
</html>
但是这两种方式是有区别的。
return false
不仅阻止了事件往上冒泡,而且阻止了事件本身。event.stopPropagation()
则只阻止事件往上冒泡,不阻止事件本身。