• event_3:DOM事件流:捕获阶段 -> 目标阶段 -> 冒泡阶段


    知识梳理

    // 1 在实际工作中,很少用到捕获阶段,我们更关注摸排阶段
    
    // 2 有些事件没有冒泡的,比如:onblur onfocus onmouseenter onmouseleave

    // 3 事件冒泡会带来一些麻烦,但是也可以巧妙的做一些事情

    一  基础理论

    1)DOM事件流

    当一个HTML元素产生一个事件时,该事件会在元素节点与根结点之间的路径传播,路径所经过的结点都会收到该事件。这个过程称为DOM事件流
      

    2)事件流的三个阶段

    1)捕获阶段:事件从Document节点自上而下向目标节点传播的阶段;
    2)目标阶段:真正的目标节点正在处理事件的阶段;
    3)冒泡阶段:事件从目标节点自下而上向Document节点传播的阶段。
      

    二  代码验证

    // JS只能执行 捕获 或者 冒泡 其中的一个阶段
    // onclick 和 attachEvent 只能得到冒泡阶段
    // addEventListener() 捕获和冒泡都可以得到 [ 用这个做实验 ]

    1)捕获阶段

    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>捕获阶段</title>
    </head>
    <body>
    <dav id="father">
        <div style=" 50px; height: 50px; background: #B3181C" id="son">盒子</div>
    </dav>
    <script>
        var father = document.getElementById('father');
        var son = document.getElementById('son');
        //addEventListener的第三个参数是 true 则处于捕获阶段
        son.addEventListener('click',function () {
            alert('son')
        },true);
        father.addEventListener('click',function () {
            alert('father');
        },true);
        document.body.addEventListener('click',function () {
            alert('body');
        },true);
        document.documentElement.addEventListener('click',function () {
            alert('html');
        },true);
        document.addEventListener('click',function () {
            alert('document');
        },true);
    </script>
    </body>
    </html>
    //依次弹出 document -> html -> body -> father -> son
    证明了捕获执行顺序

    2)冒泡阶段

    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>冒泡阶段</title>
    </head>
    <body>
    <dav id="father">
        <div style=" 50px; height: 50px; background: #B3181C" id="son">盒子</div>
    </dav>
    <script>
        var father = document.getElementById('father');
        var son = document.getElementById('son');
        //addEventListener的第三个参数是 false 或 省略 则处于冒泡阶段
        son.addEventListener('click',function () {
            alert('son')
        },true);
        father.addEventListener('click',function () {
            alert('father');
        },true);
        document.body.addEventListener('click',function () {
            alert('body');
        },true);
        document.documentElement.addEventListener('click',function () {
            alert('html');
        },true);
        document.addEventListener('click',function () {
            alert('document');
        },true);
    </script>
    </body>
    </html>
    //依次弹出 son -> father -> body -> html -> document
    代码证明了 冒泡执行顺序

  • 相关阅读:
    数据挖掘与R语言,数据分析,机器学习
    Linux下bash中关于日期函数date的格式及各种用法
    大数据之机器学习(11)
    unsolved 2 db2 issues
    时间是一剂良药,是制作“知识食物”不可或缺的材料
    b,B,KB,MB,GB
    学习数据结构要再学一遍c语言,害,加油吧
    栈(stack)
    堆(heap)
    js计算器(一)
  • 原文地址:https://www.cnblogs.com/fuyunlin/p/14437030.html
Copyright © 2020-2023  润新知