zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    Jessica's Reading Problem POJ
    FatMouse and Cheese HDU
    How many ways HDU
    Humble Numbers HDU
    Doing Homework again
    Stacks of Flapjacks UVA
    Party Games UVA
    24. 两两交换链表中的节点
    面试题 03.04. 化栈为队
    999. 可以被一步捕获的棋子数
  • 原文地址:https://www.cnblogs.com/znyyy/p/11119651.html
Copyright © 2011-2022 走看看