事件冒泡

#转载请留言联系

  • 什么是事件冒泡?

事件冒泡,指代在js中,被包含的子标签一旦触发了某种事件,那么父元素的同名事件也会被逐层触发,一直到没有父标签的html标签中。

  • 事件冒泡示例

创建一个大的框框,背景色为绿色。然后在大框框里创建一个小框框,背景色为红色。需求是当点大框框的内容时,大框框的背景色变成蓝色。当点小框框的内容时,小框框的背景色变成蓝色。

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .bigbox{
            width: 500px;
            height: 500px;
            background: green;
        }
        .littlebox{
            width: 200px;
            height: 200px;
            background: red;
        }
    </style>
    <script src="js/jquery-1.12.4.min.js"></script>
    <script>
        $(function(){
            $('.bigbox').on('click',function(event){
                $(this).css({"background":"blue"});
            })
            $('.littlebox').on('click',function(event){
                $(this).css({"background":"blue"});
            })
        })
    </script>
</head>
<body>
    <div class="bigbox">
        <div class="littlebox"></div>
    </div>
</body>
</html>

实验:当点击大框框时,背景颜色的确变成蓝色了,而且小框框的背景色保持不变,还是红色。但是!当点击小框框时,大框框小框框的背景颜色都变成蓝色了!这边是事件冒泡。子标签一旦触发了某种事件,那么父元素的同名事件也会被逐层触发,一直到没有父标签的html标签中。

  • 阻止事件冒泡

1.event.target

target 事件属性可返回事件的目标节点(触发该事件的节点),如生成事件的元素、文档或窗口。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .bigbox{
            width: 500px;
            height: 500px;
            background: green;
        }
        .littlebox{
            width: 200px;
            height: 200px;
            background: red;
        }
    </style>
    <script src="js/jquery-1.12.4.min.js"></script>
    <script>
        $(function(){
            $('.bigbox').on('click',function(event){
                $(event.target).css({"background":"blue"});
            })
            $('.littlebox').on('click',function(event){
                $(event.target).css({"background":"blue"});
            })
        })
    </script>
</head>
<body>
    <div class="bigbox">
        <div class="littlebox"></div>
    </div>
</body>
</html>

2.return false

示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .bigbox{
            width: 500px;
            height: 500px;
            background: green;
        }
        .littlebox{
            width: 200px;
            height: 200px;
            background: red;
        }
    </style>
    <script src="js/jquery-1.12.4.min.js"></script>
    <script>
        $(function(){
            $('.bigbox').on('click',function(event){
                $(this).css({"background":"blue"});
            })
            $('.littlebox').on('click',function(event){
                $(this).css({"background":"blue"});
                return false;
            })
        })
    </script>
</head>
<body>
    <div class="bigbox">
        <div class="littlebox"></div>
    </div>
</body>
</html>

3.stopPropagation

示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .bigbox{
            width: 500px;
            height: 500px;
            background: green;
        }
        .littlebox{
            width: 200px;
            height: 200px;
            background: red;
        }
    </style>
    <script src="js/jquery-1.12.4.min.js"></script>
    <script>
        $(function(){
            $('.bigbox').on('click',function(event){
                $(this).css({"background":"blue"});
            })
            $('.littlebox').on('click',function(event){
                $(this).css({"background":"blue"});
                event.stopPropagation()
            })
        })
    </script>
</head>
<body>
    <div class="bigbox">
        <div class="littlebox"></div>
    </div>
</body>
</html>
  • 事件冒泡的意义

那么,事件冒泡有什么意义呢?还只是一个累赘?其实事件冒泡大有用处!

在某种特殊场合下,我们可以通过给父元素添加事件,可以减少批量对子元素添加事件的性能消耗。例如,我们一个ul里面由5000个li,给每一个li添加事件,和给一个ul添加事件,性能的差距是5000倍!

示例(当点击标题是背景变成蓝色,其他标签变回底色):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="js/jquery-1.12.4.min.js"></script>
    <script>
        $(function(){
            $('.list').on('click',function(event){
                $(event.target).css({"background":"blue"}).siblings().css({"background":"white"});
            })
        })
    </script>
</head>
<body>
    <ul class="list">
        <li>第一个标题</li>
        <li>第二个标题</li>
        <li>第三个标题</li>
        <li>第四个标题</li>
        <li>第五个标题</li>
    </ul>
</body>
</html>
原文地址:https://www.cnblogs.com/chichung/p/9714459.html