07 DOM事件流&事件冒泡的处理

DOM事件流

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件流</title>
    <script>
    window.onload = function(){
        var oBtn = document.getElementById('btn');
        oBtn.addEventListener('click',function(){
            console.log('btn处于事件捕获阶段');
        }, true);
        oBtn.addEventListener('click',function(){
            console.log('btn处于事件冒泡阶段');
        }, false);

        document.addEventListener('click',function(){
            console.log('document处于事件捕获阶段');
        }, true);
        document.addEventListener('click',function(){
            console.log('document处于事件冒泡阶段');
        }, false);

        document.documentElement.addEventListener('click',function(){
            console.log('html处于事件捕获阶段');
        }, true);
        document.documentElement.addEventListener('click',function(){
            console.log('html处于事件冒泡阶段');
        }, false);

        document.body.addEventListener('click',function(){
            console.log('body处于事件捕获阶段');
        }, true);
        document.body.addEventListener('click',function(){
            console.log('body处于事件冒泡阶段');
        }, false);
    };
    </script>
</head>
<body>
    <a href="javascript:;" id="btn">按钮</a>
<!--1、addEventListener-->
<!--addEventListener 是DOM2 级事件新增的指定事件处理程序的操作,这个方法接收3个参数:-->
    <!--要处理的事件名、作为事件处理程序的函数和一个布尔值。-->
    <!--最后这个布尔值参数如果是true,表示在捕获阶段调用事件处理程序;-->
    <!--如果是false,表示在冒泡阶段调用事件处理程序。-->
<!--2、document、documentElement和document.body三者之间的关系:-->
<!--document代表的是整个html页面;-->
<!--document.documentElement代表的是`<html>`标签;-->
<!--document.body代表的是`<body>`标签;-->
<!--接着我们就来聊聊上面的例子中输出的结果为什么是这样:-->
<!--在标准的“DOM2级事件”中规定,事件流首先是经过事件捕获阶段,接着是处于目标阶段,最后是事件冒泡阶段。-->

    <!--控制台输出顺序如下-->
<!--首先在事件捕获过程中,document对象首先接收到click事件,然后事件沿着DOM树依次向下,一直传播到事件的实际目标,就是id为btn的a标签。-->
<!--接着在事件冒泡过程中,事件开始时由最具体的元素(a标签)接收,然后逐级向上传播到较为不具体的节点(document)。-->

</body>
</html>

事件冒泡的处理

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件冒泡的处理</title>
    <style type="text/css">
        .father{
            width: 300px;
            height: 300px;
            background-color: red;
        }

    </style>
</head>
<body>
    <div class="father">
        <button>按钮</button>
        <a href="http://www.baidu.com" style="display: block">百度一下</a>
        <a href="http://www.baidu.com" style="display: block" id="a1">百度一下</a>
        <a href="http://www.baidu.com" style="display: block" id="a2">百度一下</a>
    </div>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script type="text/javascript">
        $('.father button').click(function (event) {
            console.log(event);  // 原生js的事件对象
            alert($(this).text());
            //阻止冒泡事件 比如body html document 如果也有点击事件,将不会执行 所以这里body点击事件不会执行
            event.stopPropagation();
        });

        $('a:eq(0)').click(function (e) {
            // 因为全都没有阻止 所以 后面父盒子 body的点击都将被执行,然后再执行默认事件-跳转百度
            alert('没有阻止默认事件也没有阻止冒泡!');
        });

        $('#a1').click(function (e) {
            e.stopPropagation();  // 阻止冒泡
            e.preventDefault();  // 阻止默认事件 指的是a标签的跳转 表单的提交 阻止这些
            alert('点击a1!');
            return false;
        });

        $('#a2').click(function (e) {
            alert('点击a2!');
            // 上面的两个阻止方法也可以写成这样 既阻止默认事件又阻止冒泡
            return false;
        });

        $('.father').click(function(event){
                alert('父亲被点击了');
                console.log('哈哈哈哈哈');
            });

        $('body').click(function(){
                alert('body被点击了');
            })
    </script>
</body>
</html>

抽屉评论收起模型

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>抽屉评论收起</title>
    <style>
        .box{
            height:400px;
            width: 300px;
            border:1px solid red;
            position: relative;
            display: none;
        }
        .closex{
            position: relative;
            float:right;
            cursor: pointer;
        }
        .shouqi{
            position: absolute;
            bottom: 0;
            right:0;
        }
    </style>
</head>
<body>
    <button id="btn1">评论</button>
    <div class="box">
        <span class="closex">X</span>
        <button class="shouqi" id="btn2">收起</button>
    </div>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script type="text/javascript">
        $('#btn1').click(function (e) {
//            $('.box').css('display','block');
            $('.box').stop().slideToggle(200);
            e.stopPropagation();
        });

        $('.closex,.shouqi').click(function () {
//            $('.box').css('display','none');
            $('.box').stop().slideUp(200);
            e.stopPropagation();
        });

        $('.box').click(function () {
            return false;
        });

        $(document).click(function () {
            $('.box').stop().slideUp(200);
        })
    </script>
</body>
</html>
原文地址:https://www.cnblogs.com/znyyy/p/11119651.html