【学习笔记44】JavaScript的事件传播

news2024/11/29 10:37:32

JavaScript的事件传播

    • 一、事件传播
      • 1、事件传播的说明
      • 2、阻止事件传播
    • 二、目标冒泡捕获
      • 1、冒泡
      • 2、捕获
    • 三、事件委托
      • 1、事件委托的说明
      • 2、为什么要用事件委托
    • 四、阻止默认事件
      • 1、方法一
      • 2、方法二

一、事件传播

  • 在触发子元素的事件时, 会将行为传播给父级的同类型事件
  • 触发了子元素的点击事件时, 会将该行为传播给父级, 并触发父级的同类型事件
  • 在传递行为时, 会将行为一直向上传递, 如果父级有同类型事件, 那么触发该事件; 如果没有, 则继续往上传递
  • 阻止事件传播: e.stopPropagation()
        <div id="box1">
            <div id="box2"></div>
        </div>
        <style>
            #box1{
                width: 200px;
                height: 200px;
                background-color: cadetblue;
            }
            #box2{
                width: 100px;
                height: 100px;
                background-color: burlywood;
            }
        </style>

1、事件传播的说明

        // 获取标签对象
        var oBox1 = document.getElementById('box1');
        var oBox2 = document.getElementById('box2');
        var oBody = document.body;

        oBox1.onclick = function () {
            console.log('触发了box1的点击事件');
        }

        oBox2.onclick = function () {
            console.log('触发了box2的点击事件');
        }

        oBox1.oncontextmenu = function () {
            console.log('触发了box1的右键事件');
        }

        oBody.onclick = function () {
            console.log('触发了body的点击事件');
        }

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、阻止事件传播

       // 获取标签对象
        var oBox1 = document.getElementById('box1');
        var oBox2 = document.getElementById('box2');
        var oBody = document.body;

        oBox1.onclick = function (e) {
            // 阻止事件传播
            e.stopPropagation() 
            console.log('触发了box1的点击事件');
        }

        oBox2.onclick = function () {
            console.log('触发了box2的点击事件');
        }

        oBox1.oncontextmenu = function () {
            console.log('触发了box1的右键事件');
        }

        oBody.onclick = function () {
            console.log('触发了body的点击事件');
        }

在这里插入图片描述

二、目标冒泡捕获

  • 目标: 目标就是事件源
  • 传播时,会从目标传播到父级, body, html, document, window
        <div id="box1">
            <div id="box2"></div>
        </div>
        <style>
            #box1{
                width: 200px;
                height: 200px;
                background-color: cadetblue;
            }
            #box2{
                width: 100px;
                height: 100px;
                background-color: burlywood;
            }
        </style>

1、冒泡

  • 冒泡: 事件传播时, 从目标开始传播, 一直到到父级, body...window
  • window 默认的传播方式为 冒泡
        // 获取标签对象
        var oBox1 = document.getElementById('box1');
        var oBox2 = document.getElementById('box2');
        var oBody = document.body;

        oBox1.onclick = function () {
            console.log('触发了box1的点击事件');
        }

        oBox2.onclick = function () {
            console.log('触发了box2的点击事件');
        }

        oBox1.oncontextmenu = function () {
            console.log('触发了box1的右键事件');
        }

        oBody.onclick = function () {
            console.log('触发了body的点击事件');
        }

在这里插入图片描述

2、捕获

  • 捕获: 从最顶层开始, 逐层向下传递, 一直到目标
        // 获取标签对象
        var oBox1 = document.getElementById('box1');
        var oBox2 = document.getElementById('box2');
        var oBody = document.body;

        // 捕获
        oBox1.addEventListener('click', function(){
            console.log('触发了box1的点击事件');
        }, true)

        oBox2.addEventListener('click', function(){
           console.log('触发了box2的点击事件');
        }, true)

        oBody.addEventListener('click', function(){
             console.log('触发了body的点击事件');
        }, true)

在这里插入图片描述

解释说明

  1. addEventListener第三个参数默认值为false,代表传播方式为冒泡
  2. 如果想改变传播方式为捕获, 那么需要将第三个参数传递为true

三、事件委托

  1. 因为事件冒泡的存在, 所以点击子元素时, 一定会触发给父级
  2. 所以可以将子元素统一的事件, 都提交给父级
  3. e.target: 触发事件的事件源
        <ul>
            <li>1</li>
            <li>2</li>
            <li>3</li>
        </ul>
    <style>
        ul{
            list-style: none;
        }
        li{
            width: 200px;
            height: 100px;
            background-color: cornflowerblue;
            margin-bottom: 5px;
        }
    </style>

1、事件委托的说明

        // 获取标签对象
        var oUl = document.querySelector('ul');

        oUl.addEventListener('click', function(event){
            
            console.log(event.target.nodeName);
        })

在这里插入图片描述

        // 获取标签对象
        var oUl = document.querySelector('ul');

        oUl.addEventListener('click', function(event){
            // 判断
            if(event.target.nodeName === 'LI'){
                console.log('点击了li');
            }
        })

在这里插入图片描述

2、为什么要用事件委托

  1. 动态的添加了li时, 新加的li没有绑定上事件, 需要动态添加完成后重新绑定事件, 这样操作比较麻烦,所以此时可以利用事件委托
  2. li 的点击事件必须委托给父级点击事件
        // 获取标签对象
        var oUl = document.querySelector('ul');
        var oLi = [...document.querySelectorAll('li')];

        // 创建一个Li节点
        var newLi = document.createElement('li');
        newLi.innerText = '我是通过JS创建的';

        oUl.appendChild(newLi);

        // 此时页面只有3个li, 所以新插入的li没有点击事件
        oLi.forEach(function (item, index) {
            item.onclick = function () {
                console.log(index + 1)
            }
        })

在这里插入图片描述

在这里插入图片描述

四、阻止默认事件

    <!-- a标签默认是跳转页面 -->
    <a href="xxx">点击跳转</a>

1、方法一

  • return false; 阻止a标签跳转
        var oA = document.querySelector('a');
        oA.onclick = function (e) {
            return false
        }

2、方法二

  • preventDefault();拦截之后, 取消了a标签的默认跳转功能
        var oA = document.querySelector('a');
        oA.onclick = function (e) {  
            e.preventDefault()
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/41518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习1综述

文章目录一、综述学习环境&#xff1a;二、机器学习方法的分类1、监督学习&#xff1b;2、非监督学习&#xff1b;3、半监督学习&#xff1b;4、增强学习&#xff1b;三、机器学习方法分类2、批量学习&#xff08;离线学习&#xff09;Batch Learing&#xff1b;3、参数学习&am…

二叉树的递归问题

目录 一、相同的树 二、另一棵树的子树 三、翻转二叉树 四、平衡二叉树 五、对称二叉树 一、相同的树 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是…

【毕业设计-课程设计】-超声波测距

资源链接在文章最后,订阅查看获取全部内容及资料,如需可私信提供硬件。 目 录 1 绪论 2 1.1 项目研究背景及意义 2 2 总体设计方案及论证 2 2.1 总体方案设计 2 3 硬件实现及单元电路设计 3 3.1 主控制模块 3 3.2 电源设计 4 3.3 超声波测试模块 4 3.3.1 超声波的特性 5 3.3…

【Python】顺序、条件、循环语句

文章目录一. 顺序语句二. 条件语句1. 什么是条件语句2. 缩进和代码块3. 空语句 pass4. 练习三. 循环语句1. while 循环2. for 循环一. 顺序语句 默认情况下&#xff0c;Python 的代码执行顺序&#xff0c;是从上到下依次执行的&#xff1a; 执行结果一定为 “123”&#xff0…

【工具门户】Backstage配置使用PostgreSQL(三)

先决条件 If the database is not hosted on the same server as the Backstage app, the PostgreSQL port needs to be accessible (the default is 5432 or 5433) PostgreSQL数据库默认端口为5432或5433,如果数据库与Backstage应用不在同一台机器上,需开放PostgreSQL端口…

MyBatis框架一二级缓存含代码演示

目录 1.什么是缓存? 2. Mybatis的一级缓存 2.1实验一: 2.2实验二: 3.Mybatis的二级缓存 3.1 二级缓存需要配置才可以使用: 3.2 实验开始&#xff01;&#xff01; 4.总结 1.什么是缓存? 缓存就是数据交换的缓冲区&#xff08;称作Cache&#xff09;&#xff0c;当某一…

学习Python中turtle模块的基本用法(2:基本绘图函数测试)

个人感觉turtle模块中的绘图函数是按人手拿着画笔一笔一画地画图的思路定义的&#xff0c;这与C#中的GDI函数、html5中canvas的绘图函数及Tkinter中Canvas的绘图函数的定义思路存在差异&#xff0c;但也能完成后面绝大部分的绘图功能&#xff08;目前看到的turtle文章及帮助文档…

安装OpenGL

提示错误信息&#xff1a; (base) C:\Users\Tina\PycharmProjects\FunnyToys-main>conda install opengl Collecting package metadata (current_repodata.json): done Solving environment: failed with initial frozen solve. Retrying with flexible solve. Collecting…

python 栈空间不足异常 Process finished with exit code: -1073741571

问题现象 在pycharm使用debug模式调试代码时&#xff0c;异常退出&#xff0c;且错误码为-1073741571。除了错误码外&#xff0c;并没有看到其它报错。 分析 查阅资料&#xff1a; Process finished with exit code -1073741571 (0xC00000FD) when trying to implement ab…

AxureRP9的新特性介绍和技巧分享

AxureRP自去年8月第一个测试版本发布以来&#xff0c;已经一年多了&#xff0c;官方版本已经发布了近半年&#xff0c;但这个版本的用户声誉是褒贬不一的。许多用户反馈了他们对新版本的喜欢和肯定&#xff0c;但一些老用户仍然不愿意接受它&#xff0c;甚至保持抵制。 根据我…

【Hack The Box】linux练习-- Tabby

HTB 学习笔记 【Hack The Box】linux练习-- Tabby &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月22日&#x1f334; &#x1f36…

【数据结构】基础:二叉树

【数据结构】基础&#xff1a;二叉树基础 摘要&#xff1a;本文将会介绍二叉树的基础内容&#xff0c;首先引入树的概念&#xff0c;了解树的基本概念与性质&#xff0c;再对二叉树的概念和性质进行分析&#xff0c;最后对其方法进行实现&#xff0c;最重要的是理解对于二叉树方…

世界65个国家贸易开放度数据 2005-2019年

一、数据介绍 数据名称&#xff1a;UNtrade数据库 数据年份&#xff1a;2005-2019年 数据范围&#xff1a;世界65个国家 数据来源&#xff1a;各地方统计局 部分数据如下&#xff1a; 二、参考文献 用途&#xff1a;研究人民币实际汇率与贸易差额之间的关系等。 [1]卢向…

R语言文本挖掘tf-idf,主题建模,情感分析,n-gram建模研究

数据集中的Usenet公告板包括新汽车&#xff0c;体育和密码学等主题。最近我们被客户要求撰写关于主题建模的研究报告&#xff0c;包括一些图形和统计输出。我们对20个Usenet公告板的20,000条消息进行分析。 相关视频&#xff1a;文本挖掘&#xff1a;主题模型&#xff08;LDA&a…

SpringBoot SpringBoot 原理篇 2 自定义starter 2.1 记录系统访客独立IP访问次数案例介绍

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇2 自定义starter2.1 记录系统访客独立IP访问次数案例介绍2.1.1 介绍2.1.2 需求…

SpringCloud 组件Gateway服务网关【断言工厂过滤器工厂】

目录 1&#xff1a;断言工厂 2&#xff1a;过滤器工厂 2.1&#xff1a;路由过滤器的种类 2.2&#xff1a;请求头过滤器 2.3&#xff1a;默认过滤器 2.4&#xff1a;总结 1&#xff1a;断言工厂 路由断言工厂Route Predicate Factory 路由配置包括&#xff1a; 1. 路由…

C++_串口编程_官方示例:监视通信事件

这是微软官方的一个例子&#xff0c;这个例子中&#xff0c;如果不做修改&#xff0c;那么他是可以异步运行的&#xff0c;会出现一个错误&#xff1a;官方也说了一下&#xff0c;但是不太好懂&#xff0c;我拷贝过来放在这里&#xff0c;作为参考。 如果无法立即完成重叠的操作…

1_MyBatis入门

原生JDBC实现CURD的问题 1 编码繁琐 2 需要我们自己将结果集映射成对象 3 性能不太好 连接池 缓存 4 SQL语句和java代码的耦合度特别高 5 … … MyBatis 本是Apache的一个开源项目iBatis, 2010年这个项目由Apache Software Foundation 迁移到了Google Code&#xff0c;且改名为…

python学习笔记(10)

目录 第八章 函数 1.模块化程序设计&#xff08;模块化---封装、复用、可替代&#xff09; 2.定义函数 3.函数调用 4.return语句 5.函数参数 6.变量作用域 7.函数的递归调用 8.匿名函数 9.迭代器 10.生成器 11.装饰器 第八章 函数 1.模块化程序设计&#xff08;…

【线性表】—不带头单向非循环链表的增删查改

小菜坤日常上传gitee代码&#xff1a;https://gitee.com/qi-dunyan&#xff08;所有的原码都放在了我上面的gitee仓库里&#xff09; 数据结构知识点存放在专栏【数据结构】后续会持续更新 ❤❤❤ 个人简介&#xff1a;双一流非科班的一名小白&#xff0c;期待与各位大佬一起努…