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(){//执行的操作
})

 元素尺寸与位置

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

恋爱脑学Rust之Box与RC的对比

在遥远的某个小镇&#xff0c;住着一对年轻的恋人&#xff1a;阿丽和小明。他们的爱情故事就像 Rust 中的 Rc 和 Box 智能指针那样&#xff0c;有着各自不同的「所有权」和「共享」的理解。 故事背景 阿丽和小明准备共同养一株非常珍贵的花&#xff08;我们称之为“心之花”&…

【uni-app】创建自定义模板

1. 步骤 打开自定义模板文件夹 在此文件夹下创建模板文件&#xff08;注意后缀名&#xff09; 重新点击“新建页面” 即可看到新建的模板 2. 注意事项 创建的模板必须文件类型对应&#xff08;vue模板就创建*.vue文件, uvue模板就创建*.uvue文件&#xff09;

推荐一款功能强大的数据库开发管理工具:SQLite Expert Pro

SQLite Expert Professional是一个功能强大的工具&#xff0c;旨在简化SQLite3数据库的开发。 它是SQLite的一个功能丰富的管理和开发工具&#xff0c;旨在满足所有用户从编写简单SQL查询到开发复杂数据库的需求。 图形界面支持所有SQLite功能。 它包括一个可视化查询构建器&a…

【制造业&仓库】流水线能源设备检测系统源码&数据集全套:改进yolo11-DCNV2-Dynamic

改进yolo11-CAA-HSFPN等200全套创新点大全&#xff1a;流水线能源设备检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.01 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图…

FreeRTOS学习9——补充 API函数详解(创建、删除任务函数 和 挂起、恢复任务函数,空闲任务函数)

API函数详解(创建任务函数 和 删除任务函数) 创建函数 xTaskCreate() 作用&#xff1a;创建任务 ​ 函数 xTaskCreate()在 task.c 文件中有定义&#xff0c;具体的代码如下所示&#xff1a; BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,const char * const pcName,…

Vue2.0 通过vue-pdf-signature@4.2.7和pdfjs-dist@2.5.207实现PDF预览

1.安装依赖 npm install pdfjs-dist2.5.207 --savenpm install vue-pdf-signature4.2.7 --save2.在.vue文件中 script 部分引入 <script> import * as PDFJS from pdfjs-dist PDFJS.GlobalWorkerOptions.workerSrc require(pdfjs-dist/build/pdf.worker.js);//解决pdf…

kafka-console-ui的简介及安装使用

kafka-console-ui的简介及安装使用 一、kafka-console-ui的简介二、安装kafka-console-ui2.1 源码安装2.2 docker安装 三、kafka-console-ui功能使用3.1、功能特性3.2、 功能介绍3.2.1 集群3.2.2 topic3.2.3 消费组3.2.4 Acl3.2.5 运维 一、kafka-console-ui的简介 kafka-cons…

MySQL(上)

一、SQL优化 1、如何定位及优化SQL语句的性能问题&#xff1f;创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因&#xff1f; 对于性能比较低的sql语句定位&#xff0c;最重要的也是最有效的方法其实还是看sql的执行计划&#xff0c;而对于mysql来说&a…

贪心算法---java---黑马

贪心算法 1)Greedy algorithm 称之为贪心算法或者贪婪算法&#xff0c;核心思想是 将寻找最优解的问题分为若干个步骤每一步骤都采用贪心原则&#xff0c;选取当前最优解因为未考虑所有可能&#xff0c;局部最优的堆叠不一定得到最终解最优 贪心算法例子 Dijkstra while …

操作系统——计算机系统概述——1.4操作系统结构

目录 操作系统的体系结构 大内核&#xff08;宏内核/单内核&#xff09;&#xff1a; 微内核&#xff1a; 分层法 模块化 操作系统的体系结构 大内核&#xff08;宏内核/单内核&#xff09;&#xff1a; 将操作系统的主要功能模块都作为系统内核&#xff0c;运行在核心态。…

【MyBatis源码】BoundSql分析

基础 BoundSql是对SQL语句及参数信息的封装&#xff0c;它是SqlSource解析后的结果。Executor组件并不是直接通过StaticSqlSource对象完成数据库操作的&#xff0c;而是与BoundSql交互。BoundSql是对Executor组件执行SQL信息的封装&#xff0c;具体实现代码如下&#xff1a; …

本地部署bert-base-chinese模型交互式问答,gradio

首先下载bert-base-chinese&#xff0c;可以在 Huggingface, modelscope, github下载 pip install gradio torch transformers import gradio as gr import torch from transformers import BertTokenizer, BertForQuestionAnswering# 加载bert-base-chinese模型和分词器 mod…

【题】C#-数组:二维数组

1. 将1~10000赋值给一个二维数组(100行100列) int[,] array new int[100,100]; int index 1; for(int i 0;i < array.GetLength(0);i){for(int j 0;j < array.GetLength(1);j){array[i,j] index;index;} }2. 将二维数组的右上半部分置零 int[,] array new int[4,…

你还在用一串数字访问你的系统吗?

大家还记得第一次启动SpringBoot应用并在浏览器访问是如何进行的吗&#xff1f;在SpringBoot启动后&#xff0c;我们会看到如图所示&#xff1a; SpringBoot内置tomcat以端口8080启动&#xff0c;然后根据指引&#xff0c;我们在浏览器输入&#xff1a; http://127.0.0.1:8080…

ffmpeg视频滤镜:膨胀操作-dilation

滤镜介绍 dilation 官网链接 > FFmpeg Filters Documentation 膨胀滤镜会使图片变的更亮&#xff0c;会让细节别的更明显。膨胀也是形态学中的一种操作&#xff0c;在opencv中也有响应的算子。此外膨胀结合此前腐蚀操作&#xff0c;可以构成开闭操作。 开操作是先腐蚀…

Unity中的屏幕坐标系

获得视口宽高 拖动视口会改变屏幕宽高数值 MousePosition 屏幕坐标系的原点在左下角&#xff0c;MousePosition返回Z为0也就是纵深为0的Vector3 但是如果鼠标超出屏幕范围不会做限制&#xff0c;所以可能出现负数或者大于屏幕宽高的情况&#xff0c;做鼠标拖拽物体时需要注…

基于SpringBoot的学生读书笔记共享的设计与实现

一、项目背景 计算机的普及和互联网时代的到来使信息的发布和传播更加方便快捷。用户可以通过计算机上的浏览器访问多个应用系统&#xff0c;从中获取一些可以满足用户需求的管理系统。网站系统有时更像是一个大型“展示平台”&#xff0c;用户可以选择所需的信息进入系统查看…

【数据结构】二叉树——层序遍历

层序遍历 一、层序遍历二、层序遍历&#xff08;递归&#xff09;三、层序遍历&#xff08;非递归&#xff09;四、总结 一、层序遍历 层序遍历是一种广度优先遍历 以图上二叉树为例&#xff0c;层序遍历就是按照二叉树的深度一层一层进行遍历 遍历顺序&#xff1a; A B C D …

react使用Fullcalendar

前言&#xff1a; 最近在做项目时&#xff0c;遇到了需要用日历的项目。一开始考虑使用antd的日历组件。后来 调研技术库&#xff0c;发现了fullcalendar 库。经过对比 fullcalendar 更强大&#xff0c;更灵活。 其实 antd的日历组件 也不错&#xff0c;简单的需求用他也行。…

Golang--函数、包、defer、系统函数、内置函数

1、何为函数 函数作用&#xff1a;提高代码的复用型&#xff0c;减少代码的冗余&#xff0c;提高代码的维护性 函数定义&#xff1a;为完成某一功能的程序指令(语句)的集合,称为函数。 语法&#xff1a; func 函数名(形参列表)(返回值类型列表){ //执行语句 //…… return …