javascript-Web APLs (三)

 事件流

指的是事件完整执行过程中的流动路

 说明:假设页面里有个div,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段
  简单来说:捕获阶段是 从父到子 冒泡阶段是从子到父
  实际工作都是使用事件冒泡为主

事件捕获

DOM.addEventListener(事件类型,事件处理函数,是否使用捕获机制)

document.addEventListener('click',function(){
        alert('你好~~')
},true)
addEventListener第三个参数传入 true 代表是捕获阶段触发(很少使用)
  若传入false代表冒泡阶段触发,默认就是false
 若是用 L0 事件监听,则只有冒泡阶段,没有捕获

事件冒泡

当一个元素触发事件后,会依次向上调用所有父级元素的 同名事件

事件冒泡是默认存在的

  L2事件监听第三个参数是 false,或者默认都是冒泡
<div class="fa">
        <div class="son"></div>
    </div>
<script>
const fa = document.querySelector('.fa')
        const son = document.querySelector('.son')
        document.addEventListener('click',function(){
            alert('我是爷爷')
        },false)
        fa.addEventListener('click',function(){
            alert('我是父亲')
        },false)
        son.addEventListener('click',function(e){
            alert('我是儿子')
            
        })
</script>

当点击儿子文本框时,会依次弹出,我是儿子,我是父亲,我是爷爷

阻止冒泡

问题:因为默认就有冒泡模式的存在,所以容易导致事件影响到父级元素

前提:阻止事件冒泡需要拿到事件对象

事件对象.stopPropagation()

son.addEventListener('click', function(e){
        alert('我是儿子')
    //阻止冒泡,即点击儿子文本框时,就只弹出 我是儿子 ,就没了
e.stopPropagation()
})

注意:此方法可以阻断事件流动传播,不光在冒泡阶段有效,捕获阶段也有效 

我们某些情况下需要 阻止默认行为的发生,比如 阻止 链接的跳转,表单域跳转
<form action="http://www.baidu.com">
  <input type="submit" value="提交">
</form>
<script>
    const form = document.querySelector('form')
    form.addEventListener('click',function(e){
        //阻止表单默认提交行为
        e.preventDefault()
})
</script>

解绑事件

on事件方式,直接使用null覆盖偶就可以实现事件的解绑
语法:
//绑定事件
btn.onclick = function () {
    alert('点击了')
}
//L0 解绑事件
btn.onclick = null
addEventListener方式,必须使用:
removeEventListener(事件类型, 事件处理函数( 函数名 ), [获取捕获或者冒泡阶段])
例如:
function fn() {
    alert('点击了')
}
//绑定事件
btn.addEventListener('click',fn)
//L2 解绑事件
btn.removeEventListener('click',fn)
注意:匿名函数无法被解绑
鼠标经过事件区别:
mouseover 和 mouseout 会有冒泡效果
  mouseenter 和 mouseleave 没有冒泡效果 (推荐)
两种注册事件的区别
  传统on注册(L0)
  1.  同一个对象,后面注册的事件会覆盖前面注册(同一个事件)
  2.  直接使用null覆盖偶就可以实现事件的解绑
  3.  都是冒泡阶段执行的
  事件监听注册(L2)
  1.  语法: addEventListener(事件类型, 事件处理函数, 是否使用捕获)
  2.  后面注册的事件不会覆盖前面注册的事件(同一个事件)
  3.  可以通过第三个参数去确定是在冒泡或者捕获阶段执行
  4.  必须使用removeEventListener(事件类型, 事件处理函数, 获取捕获或者冒泡阶段)
  5.  匿名函数无法被解绑

 事件委托

利用事件流的特征解决一些开发需求的知识技巧
   优点:减少注册次数,可以提高程序性能
   原理:事件委托其实是利用 事件冒泡 的特点
父元素注册事件 ,当我们触发子元素的时候,会冒泡到父元素身上,从而触发父元素的事
 实现:事件对象.target. tagName 可以获得真正触发事件的元素
<ul>
    <li>第一个孩子</li>
    <li>第二个孩子</li>
    <li>第三个孩子</li>
    <p>点击时,不变色</p>
</ul>

<script>
    //需求:点击每个 li ,当前的li 文字变成红色 p不变色
//事件委托,委托给父级
    //1.获取父元素
    const ul = document.querySelector('ul')
    ul.addEventListener('click',function(e){
//e.target 获得点击的对象, 假如说有些点击不想变色就要用 e.target.tagName === 'LI'
       if(e.target.tagName === 'LI'){
    e.target.style.color = 'red'
}
})
</script>

 其他事件

页面加载事件

有些时候需要等页面资源全部处理完了做一些事情
 老代码喜欢把 script 写在 head 中,这时候直接找 dom 元素找不到

事件名:load

  监听页面所有资源加载完毕: 给 window 添加 load 事件
//等待页面所有的资源加载完毕,就回去执行回调函数
<script>
window.addEventListener('load',function(){
    const btn = document.querySelector('button')
    btn.addEventListener('click',function(){
            alert('点击了')
})
})
</script>

<body>
        <button>点击</button>
</body>
注意:不光可以监听整个页面资源加载完毕,也可以针对某个资源绑定load事件
img.addEventListener('load',function(){
        //等待图片加载完毕,再去执行里面的代码
        alert('这图片好好看~~')

当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、图像等完全加载

事件名:DOMContentLoaded
监听页面DOM加载完毕:
  给 document 添加 DOMContentLoaded 事件
document.addEventListener('DOMContentLoaded', function(){
        //执行的操作
})

 元素尺寸与位置

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

11.Three.js使用indexeddb前端缓存模型优化前端加载效率

11.Three.js使用indexeddb前端缓存模型优化前端加载效率 1.简述 在使用Three.js做数字孪生应用场景时&#xff0c;我们常常需要用到大量模型或数据。在访问我们的数字孪生应用时&#xff0c;每次刷新都需要从web端进行请求大量的模型数据或其他渲染数据等等&#xff0c;会极大…

keepalive+mysql8双主

1.概述 利用keepalived实现Mysql数据库的高可用&#xff0c;KeepalivedMysql双主来实现MYSQL-HA&#xff0c;我们必须保证两台Mysql数据库的数据完全一致&#xff0c;实现方法是两台Mysql互为主从关系&#xff0c;通过keepalived配置VIP&#xff0c;实现当其中的一台Mysql数据库…

C++ 实现俄罗斯方块游戏

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

项目实战:基于Linux的Flappy bird游戏开发

一、项目介绍 项目总结 1.按下空格键小鸟上升&#xff0c;不按小鸟下落 2.搭建小鸟需要穿过的管道 3.管道自动左移和创建 4.小鸟撞到管道游戏结束 知识储备 1.C语言 2.数据结构-链表 3.Ncurses库 4.信号机制 二、Ncurses库介绍 Ncurses是最早的System V Release 4.0 (SVr4)中…

nginx上传文件超过限制大小、响应超时、反向代理请求超时等问题解决

1、文件大小超过限制 相关配置&#xff1a; client_max_body_size&#xff1a; Syntax:client_max_body_size size;Default:client_max_body_size 1m;Context:http, server, location 2、连接超时: proxy_read_timeout&#xff1a; Syntax:proxy_read_timeout time;Default…

C++ --- 多线程的使用

目录 一.什么是线程&#xff1f; 线程的特点&#xff1a; 线程的组成&#xff1a; 二.什么是进程&#xff1f; 进程的特点&#xff1a; 进程的组成&#xff1a; 三.线程与进程的关系&#xff1a; 四.C的Thread方法的使用&#xff1a; 1.创建线程&#xff1a; 2.join(…

基于Spring Boot的医疗陪护系统设计与实现(源码+定制+开发)病患陪护管理平台、医疗服务管理系统、医疗陪护信息平台

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

ViT面试知识点

文章目录 VITCLIPSAMYOLO系列问题 VIT 介绍一下Visual Transformer&#xff1f; 介绍一下自注意力机制&#xff1f; 介绍一下VIT的输出方式 介绍一下VIT做分割任务 VIT是将NLP的transformer迁移到cv领域&#xff0c;他的整个流程大概如下&#xff1a;将一张图片切成很多个pat…

【Comsol教程】计算流道中的流量

在进行微流控方面的仿真的时候可能需要计算某一流道中流量的大小&#xff0c;下面展示如何计算。 流量分为质量流量和体积流量&#xff0c;我们常采用体积流量。在COMSOL中有两种方法计算&#xff0c; 1.使用Comsol内置的函数 这里我使用的是蠕动流模块【spf】,定义了3个开放边…

LeetCode 3226. 使两个整数相等的位更改次数

. - 力扣&#xff08;LeetCode&#xff09; 题目 给你两个正整数 n 和 k。你可以选择 n 的 二进制表示 中任意一个值为 1 的位&#xff0c;并将其改为 0。 返回使得 n 等于 k 所需要的更改次数。如果无法实现&#xff0c;返回 -1。 示例 1&#xff1a; 输入&#xff1a; n …

项目升级到.Net8.0 Autofac引发诡异的问题

前两天把项目升级到.Net8.0了&#xff0c;把.Net框架升级了&#xff0c;其他一些第三方库升级了一部分&#xff0c;升级完以后项目跑不起来了&#xff0c;报如下错误&#xff1a; An unhandled exception occurred while processing the request. DependencyResolutionExcepti…

RabbitMQ 七种工作模式介绍

目录 1.简单模式队列 2.WorkQueue(⼯作队列) 3 Publish/Subscribe(发布/订阅) 4 Routing(路由模式) 5.Topics(通配符模式) 6 RPC(RPC通信) 7 Publisher Confirms(发布确认) RabbitMQ 共提供了7种⼯作模式供我们进⾏消息传递,接下来一一介绍它的实现与目的 1.简单模式队列…

自动化测试类型与持续集成频率的关系

持续集成是敏捷开发的一个重要实践&#xff0c;可是究竟多频繁的集成才算“持续”集成&#xff1f; 一般来说&#xff0c;持续集成有3种常见的集成频率&#xff0c;分别是每分钟集成、每天集成和每迭代集成。项目组应当以怎样的频率进行集成&#xff0c;这取决于测试策略&…

操作系统期中复习2-4单元

Chapter-2 第一个图形界面——Xerox Alto 早期操作系统&#xff1a;规模小&#xff0c;简单&#xff0c;功能有限&#xff0c;无结构(简单结构)。&#xff08;MS-DOS,早期UNIX&#xff09; 层次结构&#xff1a;最底层为硬件&#xff0c;最高层为用户层&#xff0c;自下而上构…

2-141 怎么实现ROI-CS压缩感知核磁成像

怎么实现ROI-CS压缩感知核磁成像&#xff0c;这个案例告诉你。基于matlab的ROI-CS压缩感知核磁成像。ROI指在图像中预先定义的特定区域或区域集合&#xff0c;选择感兴趣的区域&#xff0c;通过减少信号重建所需的数据来缩短信号采样时间&#xff0c;减少计算量&#xff0c;并在…

Android中同步屏障(Sync Barrier)介绍

在 Android 中&#xff0c;“同步屏障”&#xff08;Sync Barrier&#xff09;是 MessageQueue 中的一种机制&#xff0c;允许系统临时忽略同步消息&#xff0c;以便优先处理异步消息。这在需要快速响应的任务&#xff08;如触摸事件和动画更新&#xff09;中尤为重要。 在 An…

【tomcat系列漏洞利用】

Tomcat 服务器是一个开源的轻量级Web应用服务器&#xff0c;在中小型系统和并发量小的场合下被普遍使用。主要组件&#xff1a;服务器Server&#xff0c;服务Service&#xff0c;连接器Connector、容器Container。连接器Connector和容器Container是Tomcat的核心。一个Container…

【压力测试】如何确定系统最大并发用户数?

一、明确测试目的与了解需求 明确测试目的&#xff1a;首先需要明确测试的目的&#xff0c;即为什么要确定系统的最大并发用户数。这通常与业务需求、系统预期的最大用户负载以及系统的稳定性要求相关。 了解业务需求&#xff1a;深入了解系统的业务特性&#xff0c;包括用户行…

深入理解Redis的四种模式

Redis是一个内存数据存储系统&#xff0c;支持多种不同的部署模式。以下是Redis的四种主要部署模式。 1、单机模式 单机模式是最简单的部署模式&#xff0c;Redis将数据存储在单个节点上。这个节点包括一个Redis进程和一个持久化存储。单机模式非常适合小型应用程序或者开发和…

【多态】析构函数的重写

析构函数的重写&#xff08;面试常见题&#xff09; 基类的析构函数为虚函数&#xff0c;此时派生类析构函数只要定义&#xff0c;⽆论是否加virtual关键字&#xff0c;都与基类的析构函数构成重写。 虽然基类与派⽣类析构函数名字不同看起来不符合重写的规则&#xff0c;实际…