JavaScript:Web APIs(三)

本篇文章的内容包括:

一,事件流
二,移除事件监听
三,其他事件
四,元素尺寸与位置

一,事件流 

事件流是什么呢?

事件流是指事件执行过程中的流动路径。 

我们发现,一个完整的事件执行过程中有两部分组成:捕获阶段和冒泡阶段。

这两个阶段很好理解,捕获阶段就是从外到内的去执行同名事件,假设存在父子div并且同时绑定点击事件,当我们点击子div时会先执行父div的事件再去执行子div的事件。冒泡阶段就是反过来,先执行子元素的事件,再执行父元素的事件。 

元素.addEventListener('click', 回调函数, 是否使用捕获)

我们可以使用上述方法来改变事件是否捕获,一般使用冒泡阶段,或者干脆冒泡阻断,让每个元素的事件独立起来。那我们该怎么阻止冒泡呢? 

阻止冒泡

阻止冒泡,我们只需要获取事件对象e,再调用e的stopPropagation 方法来专门阻止事件传播。

<body>
<div class="father">
父盒子
<div class="son">子盒子</div>
</div>
<script>
// 事件流
const father = document.querySelector('.father')
const son = document.querySelector('.son')
// 1. 事件冒泡
// 点击父盒子
father.addEventListener('click', function () {
alert('father')
})
// 点击子盒子
son.addEventListener('click', function (e) {
alert('son')
// 1.1 先获取事件对象
// 1.2 事件对象.stopPropagation() 注意是个方法
 e.stopPropagation()
})
</script>
</body>

需要注意的是

mouseover 和 mouseout 会有冒泡效果
mouseenter 和 mouseleave 没有冒泡效果 (推荐)

我们如果不使用事件委托的话,基本上都是把冒泡效果阻断的,所以推荐没有冒泡的事件来使用。

那么,事件委托是什么呢?

委托,简单理解就是把事情丢给别人干,设想一下,如果子元素特别多,而我们又需要给每个子元素添加相同的事件,这时我们就只能使用for循环来绑定事件了,但是对一个网页来说,for循环是比较浪费的, 我们想到了冒泡,如果我们给它的父元素绑定事件,要知道,子元素其实都是拥有事件的,只是没有事件执行函数,所以这是满足冒泡的,当我们点击任何一个子元素,它都会产生事件(父元素的),我们称这个过程叫做事件委托

<body>
<ul>
<li>第1个孩子</li>
<li>第2个孩子</li>
<li>第3个孩子</li>
<li>第4个孩子</li>
<li>第5个孩子</li>
</ul>
 <script>
// 需求: 点击每个小li都会有弹窗效果
// 1. 获取父元素ul
const ul = document.querySelector('ul')
// 2. 给ul注册点击事件
ul.addEventListener('click', function (e) {
// alert('我会弹窗')
// 3. 利用事件对象.target 得到目标元素
// console.log(e.target)
// e.target.style.color = 'pink'
// 需求2:点击哪个小li,对应的li变色
// console.dir(e.target.tagName) 可以得到目标元素的标签名
if (e.target.tagName === 'LI') {
e.target.style.color = 'pink'
}
})
</script>

上述代码用到了很多事件对象的知识,在上篇文章,我们只是简单了解了一下事件对象。

事件对象到底是什么呢?

事件对象简单来说就是用来描述事件发生间的属性,比如e(事件对象一般用e来表示).target就是指目标元素,在上述代码中就是指你点击的元素,这里包括父元素ul也包括li子元素,e.target.tagName就是指目标元素的标签名。e还有很多属性可以使用,这里就不赘述了。

阻止事件默认行为 

阻止事件默认行为,拆分一下名词你就理解了,事件默认行为就是某些元素自带的行为,比如表单元素,它就自带提交到url上,而阻止事件默认行为就是阻止自带的事件。

事件对象.preventDefault()

<body>
<form action="">
姓名: <input type="text" name="username">
<button>提交</button>
</form>
<a href="http://www.baidu.com">点击跳转</a>
<script>
// 阻止默认行为
const form = document.querySelector('form')
const input = document.querySelector('[name=username]')
form.addEventListener('submit', function (e) {
// 如果input表单的值为空则不允许提交
if (input.value === '') {
// return 无法阻止提交事件
e.preventDefault() // 阻止提交事件
}
})
document.querySelector('a').addEventListener('click', function (e) {
e.preventDefault()
})
 </script>
</body

事件解绑

ele.removeEventListener(事件, 事件执行函数) 

就是事件绑定的逆过程,加一个remove就可以了。

二,其他事件 

load事件 

有些时候,我们的的HTML页面会因为js代码的位置而出现中不到元素的情况,这是因为load事件的问题,当js代码运行的时候,如果所需的元素还没加载,那么就会报错了。

监听页面所有资源加载完毕:
window.addEventListener('load', function() {
// xxxxx
})
当初始的 HTML 文档被完全加载和解析完成之后就触发,而无需等待样式表、图像等完全加载
事件名:DOMContentLoaded
document.addEventListener('DOMContentLoaded', function() {
// xxxxx
})

 

元素滚动事件

元素滚动时触发的事件

  • scrollTop属性表示元素在垂直方向上已经滚动的像素数。
  • scrollLeft属性可以用来检测水平滚动的距离,尽管在大多数网站设计中垂直滚动更常见。
  • clientHeightclientWidth分别表示元素的视口高度和宽度,不包括滚动条、边框等。
  • scrollHeightscrollWidth表示元素的总滚动内容的高度和宽度,包括不可见的部分。

 

window.addEventListener('scroll', function() {
// xxxxx
}) 

// 获取可滚动的元素
let scrollableElement = document.querySelector('.box');

// 添加滚动事件监听器
scrollableElement.onscroll = function() {
  console.log('正在滚动');
  
  // 示例:检查是否滚动到底部
  if (this.scrollTop + this.clientHeight >= this.scrollHeight) {
    console.log('已滚动到元素底部');
    // 在这里执行滚动到底部时的操作,比如加载更多内容
  }

 

 

页面尺寸事件

当页面大小改变时触发的事件 

window.addEventListener('resize', function() {
// xxxxx
})

 

 

 

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

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

相关文章

MySQL技能树学习——数据库组成

数据库组成&#xff1a; 数据库是一个组织和存储数据的系统&#xff0c;它由多个组件组成&#xff0c;这些组件共同工作以确保数据的安全、可靠和高效的存储和访问。数据库的主要组成部分包括&#xff1a; 数据库管理系统&#xff08;DBMS&#xff09;&#xff1a; 数据库管理系…

围绕伦理困境进行深入讨论伦理困境分析与解决方案提出及个人反思

遵循一般咨询伦理的六原则&#xff08;自主、有益、无害、公正、诚信、诚实&#xff09;对五个选项&#xff08;A 评估&#xff0c;B 收益&#xff0c;C 后果&#xff0c;D 责任&#xff0c;E 教育&#xff09;进行评估&#xff0c;可以得出以下结论&#xff1a; A. 评估&…

数据结构与算法-单向环形链表与约瑟夫问题

1.简介 单向环形链表&#xff0c;闭合的形成一个环。 单向环形链表的一个应用场景是约瑟夫问题。 约瑟夫问题为&#xff1a;设编号为1&#xff0c;2&#xff0c;…&#xff0c;n的n个人围坐一圈&#xff0c;约定编号为k(1<k<n)的人从1开始报数&#xff0c;数到m的那个人…

C语言-------实现贪吃蛇小游戏

目录 一、预备知识 1.1 Win32 API介绍 Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外&#xff0c; 它同时也是一个很大的服务中心&#xff0c;调用这个服务中心的各种服务&#xff08;每一种服务就是一个函数&#xff09;&#xff0c;可以帮应用程…

如何在latex中使用第三方字体

最近想到一个问题&#xff1a;如何在 LaTeX \LaTeX LATE​X中使用第三方字体。 这个问题其实挺基础的&#xff0c;但是因为小白的 LaTeX \LaTeX LATE​X水平&#xff0c;应该说五六年了&#xff0c;毫无进步。 所以确实还是需要解决一下这个基础的问题。 小白最近使用的是TeXs…

Python | Leetcode Python题解之第65题有效数字

题目&#xff1a; 题解&#xff1a; from enum import Enumclass Solution:def isNumber(self, s: str) -> bool:State Enum("State", ["STATE_INITIAL","STATE_INT_SIGN","STATE_INTEGER","STATE_POINT","STATE_…

基于 Spring Boot 博客系统开发(五)

基于 Spring Boot 博客系统开发&#xff08;五&#xff09; 本系统是简易的个人博客系统开发&#xff0c;为了更加熟练地掌握 SprIng Boot 框架及相关技术的使用。&#x1f33f;&#x1f33f;&#x1f33f; 基于 Spring Boot 博客系统开发&#xff08;四&#xff09;&#x1f…

408数据结构-二叉树的概念、性质与存储结构 自学知识点整理

前置知识&#xff1a;树的基本概念与性质 二叉树的定义 二叉树是一种特殊的树形结构&#xff0c;其特点是每个结点至多只有两棵子树&#xff08;即二叉树中不存在度大于 2 2 2的结点&#xff09;&#xff0c;并且二叉树是有序树&#xff0c;左右子树不能互换。 与树类似&#…

fastdfs安装

fastdfs安装步骤 一 、原理 FastDFS是一个开源的轻量级分布式文件系统&#xff0c;由跟踪服务器&#xff08;tracker server&#xff09;、存储服务器&#xff08;storage server&#xff09;和客户端&#xff08;client&#xff09;三个部分组成&#xff0c;主要解决了海量数…

Flutter笔记:Widgets Easier组件库(10)快速处理承若型对话

Flutter笔记 使用Widgets Easier组件库快速处理承若型对话 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://…

光固化打印--问题记录

平面翘起 原因&#xff1a;角度平&#xff0c;缺支持 解决&#xff1a; 45度角度摆放底部平面起皮 原因&#xff1a;缺少支撑&#xff0c;原始结构支持无法支撑平面。 解决&#xff1a;增加支撑

【数学 排列组合】1643. 第 K 条最小指令

本文涉及知识点 数学 排列组合 LeetCode1643. 第 K 条最小指令 Bob 站在单元格 (0, 0) &#xff0c;想要前往目的地 destination &#xff1a;(row, column) 。他只能向 右 或向 下 走。你可以为 Bob 提供导航 指令 来帮助他到达目的地 destination 。 指令 用字符串表示&am…

Mybatis之Sqlsession、Connection和Transaction三者间的关系

前言 最近在看Mybatis的源码&#xff0c;搜到这篇文章Sqlsession、Connection和Transaction原理与三者间的关系&#xff0c;debug之后发现有不少疑惑&#xff0c;于是按照原文整理了一下&#xff0c;记录下debug中的一些困惑点。 对于我们开发来讲&#xff0c;不管跟任何关系…

2024五一数学建模C题完整论文讲解(含完整python代码及几十个特征表、处理表、结果表)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024五一数学建模C题煤矿深部开采冲击地压危险预测完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 C题论文…

【Docker学习】docker version查看版本信息

就像很多应用一样&#xff0c;docker也使用version来查看版本信息。但因为docker包含有不少独立组件&#xff0c;version的作用范围会更广一些。 用法1&#xff1a; docker --version 描述&#xff1a; 输出安装的Docker CLI 的版本号。关于Docker CLI&#xff0c;请访问。 实操…

数字电路-5路呼叫显示电路和8路抢答器电路

本内容涉及两个电路&#xff0c;分别为5路呼叫显示电路和8路抢答器电路&#xff0c;包含Multisim仿真原文件&#xff0c;为掌握FPGA做个铺垫。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易&#xff01; 目录&#xff1a; 一、5路呼叫显…

如何免费体验 gpt2-chatbot

如何免费体验 gpt2-chatbot 就在五一假期期间&#xff0c;一个神秘模型在没有任何官方文件的情况下突然发布。发布后不到 12 小时就立即引起人工智能爱好者和专家们的关注。这个名为“gpt2-chatbot”的神秘新模型凭借其令人印象深刻的能力轰动全球。有人猜测它可能是 OpenAI 的…

Python爬取豆瓣电影Top250数据

任务 爬取豆瓣电影top250中的影片名称、影片海报、年份、地区、类型、评分、评价人数、总体评价&#xff0c;并输出到douban_top250.xlsx文件中 环境 Python 3.8 requests bs4 openpyxl 源码 # 创建一个新的Excel工作簿 workbook openpyxl.Workbook() # 获取默认的工作表…

新版security demo(二)前端

写这篇博客&#xff0c;刚好换了台电脑&#xff0c;那就借着这个demo复习下VUE环境的搭建。 一、前端项目搭建 1、安装node 官网下载安装即可。 2、安装脚手架 npm install -g vue-cli 使用脚手架搭建一个demo前端项目 vue init webpack 项目名称 3、安装依赖 这里安装…

OpenCV(三)—— 车牌筛选

本篇文章要介绍如何对从候选车牌中选出最终进行字符识别的车牌。 无论是通过 Sobel 还是 HSV 计算出的候选车牌都可能不止一个&#xff0c;需要对它们进行评分&#xff0c;选出最终要进行识别的车牌。这个过程中会用到两个理论知识&#xff1a;支持向量机和 HOG 特征。 1、支…