当前位置: 首页 > news >正文

【Javascript Day17】事件传播、事件对象

事件传播

<div style="background-color: rgba(0, 0, 255, 0.5);">
        <div style="background-color: rgba(255, 0, 0, 0.5);margin: 50px;">asdasd</div>
    </div>

    <!-- 事件传播,子元素被触发的事件,会基于标签结构向父元素传递,
                 并让父元素也触发对应的事件 
    -->
    <div class="box" onclick="fun1()">
        <div class="box">
            <div class="box">
                <div class="box" onclick="fun2()"></div>
            </div>
        </div>
    </div>
    <script>
        function fun1(){
            console.log(1);
        }
        function fun2(){
            console.log(2);
        }
    </script>

    <hr>
    <!-- 
        事件传播过程中的事件回调执行分为两种执行
            1. 冒泡:由子元素向父元素顺序,依次触发事件
                    默认事件回调的执行规则,元素的属性事件绑定只会触发冒泡规则
            2. 捕获:由父元素向子元素顺序,依次触发事件
                    元素只有通过 addEventListener("事件名",回调方法,true); 捕获绑定
    -->
    <div class="box" onclick="printName('div1')">div1
        <div class="box" onclick="printName('div2')">div2
            <div class="box" onclick="printName('div3')">div3
                <div class="box" onclick="printName('div4')">div4</div>
            </div>
        </div>
    </div>
    <script>
        function printName(arg){
            console.log(arg);
        }
    </script>

    <hr>
    <div class="box a">div1
        <div class="box a">div2
            <div class="box a">div3
                <div class="box a">div4</div>
            </div>
        </div>
    </div>
    <script>
        var boxAList = document.querySelectorAll(".a");
        for (let i = 0; i < boxAList.length; i++) {
            boxAList[i].addEventListener("click",function(){
                console.log("div"+(i+1));
                
            },true)
        }
    </script>

    <hr>
    <!-- 当父子元素事件绑定时,同时存在捕获和冒泡。优先执行捕获 -->
    <div class="box b">div0-捕获
        <div class="box b">div1-冒泡
            <div class="box b">div2-捕获
                <div class="box b">div3-冒泡</div>
            </div>
        </div>
    </div>
    <script>
        var boxAList = document.querySelectorAll(".b");
        for (let i = 0; i < boxAList.length; i++) {
            boxAList[i].addEventListener("click",function(){
                console.log("div"+i);
            },i%2==0);
            // i%2==0 true 捕获
            // i%2==0 false 冒泡
        }
    </script>


事件对象

<!--
        事件对象参数:记录事件触发时对应的相关信息
            + 标签属性方式完成事件绑定时,可以为方法提供一个全局关键字 event
              event关键字用于指代当前方法触发时(瞬时参数)的相关信息对象
    -->
    <!-- abc 是JS的全局变量,如果abc不存在,会报 abc is not defined -->
    <input type="button" value="点击(左键按下并松开)" onclick="printEventA('参数',abc,event)">
    <input type="button" value="鼠标左键单击" onmousedown="printEventA('参数',abc,event)">

    <script>
        var abc = "全局变量";

        function printEventA(arg,arg1,e){
            console.log("click",arg,arg1);
            console.log("事件对象:",e);
            console.log("事件类型:",e.type );
            console.log("事件触发对象:",e.target );
            console.log("事件的绑定对象:",e.currentTarget);
            console.log("鼠标事件对应指针坐标",e.x,e.y);
        }
    </script>

    <hr>
    <div class="box" onclick="printEventB(event,'outDiv')">
        <!-- <div class="box" onclick="printEventB(event,'inDiv')"></div> -->
        <div class="box"></div>
    </div>
    <script>
        function printEventB(e,name){
            // console.log(name,"==========>");
            // console.log("target",e.target);
            // console.log("currentTarget",e.currentTarget);
            // console.log("<===========",name);

            console.log(name);
            // 只有元素自身被点击时才会触发下述功能的调用 => 绑定的事件功能只有元素自己可以触发
            if( e.target===e.currentTarget ){
                console.log(name,"==========>");
                console.log("target",e.target);
                console.log("currentTarget",e.currentTarget);
                console.log("<===========",name);
            }
        }
    </script>

相关文章:

  • 基于C++重构muduo网络库搭建HTTP服务器项目设计及反思
  • ffmpeg 多路流处理在iOS的具体使用
  • OpenCV机器学习(6)朴素贝叶斯分类器(Naive Bayes Classifier)cv::ml::NormalBayesClassifier的使用
  • Java内存模型(JMM)深度解析:从并发问题到解决方案
  • Webpack 基础入门
  • 代码随想录第三十五天| 46. 携带研究材料(第六期模拟笔试) 416. 分割等和子集
  • 计算机网络基础知识
  • Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
  • 跟着AI学习vue3第三章
  • Meta 正在押注人形机器人领域
  • 【工具变量】上市公司网络安全治理数据(2007-2023年)
  • 华为昇腾 910B 部署 DeepSeek-R1 蒸馏系列模型详细指南
  • CSS盒模
  • 【实战】用飞书多维表格+AI DeepSeeker做股票量价分析
  • 什么是 LLM训练中的PPO和GRPO
  • MySQL:MySQL8.0 JSON类型使用整理,基于用户画像的案例
  • 计算机组成原理—— 外围设备(十四)
  • FreeRTOS第12篇:系统的“绿色通道”——中断管理与临界区
  • 假面与演员:到底是接口在使用类,还是类在使用接口?编程接口与物理接口的区别又是什么?
  • 欢乐力扣:旋转图像
  • 济南网站建设推广服务/关于进一步优化落实疫情防控措施
  • 网站建设 钱/上海宝山网站制作
  • 做中医诊所网站/上海网站建设制作
  • 故事网站模版/chrome官网
  • 使用wordpress的购物网站/东莞快速排名
  • 公司网站建设模块/餐饮培训