js-webApi 笔记2之DOM事件

目录

1、表单事件

 2、键盘事件

3、事件对象

4、排他思想

5、事件流 

 6、捕获和冒泡

 7、阻止默认和冒泡

8、事件委托

9、事件解绑

10、窗口加载事件

11、窗口尺寸事件

12、元素尺寸和位置

13、窗口滚动事件

14、日期对象

 15、节点

16、鼠标移入事件


1、表单事件

获取焦点   onfoucus
失去焦点    onblur

  <body><input type="text" /><script>// onfocus onblurconst ipt = document.querySelector('input')// 获取焦点ipt.addEventListener('focus', function () {console.log('获得焦点了!!!')})// 失去焦点ipt.addEventListener('blur', function () {console.log('失去焦点了!!!')})// js方法 focus() blur()ipt.focus()</script></body>

 2、键盘事件

input事件      输入内容就触发   实时获取文本框内容
keyup       键盘抬起

keydown   键盘按下   获取的是上一次的内容

    事件执行顺序    keydown ---->input ----->keyup
    
    获取用户输入的完整内容  keyup 或 input

 <body><textarea rows="10" cols="30" placeholder="请输入评论"> </textarea><script>const tarea = document.querySelector('textarea')// input事件 输入内容就触发tarea.addEventListener('input', function () {console.log('正在输入')console.log(tarea.value)})tarea.addEventListener('keyup', function () {console.log('keyup')console.log(tarea.value)}),tarea.addEventListener('keydown', function () {console.log('keydown')console.log(tarea.value)})// 顺序 keydown -> input -> keyup// 获取用户输入的完整内容 keyup 或input</script></body>

3、事件对象

事件对象:当事件发生后,浏览器会把当前事件相关的信息会封装成一个对象
获取: 事件处理程序的第一个形参
 常用事件对象属性     e.target---->事件源     e.key---->按键字符串

   e.key    判断按的是什么键
 

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><div class="box">1223</div><textarea rows="10" cols="30" placeholder="请输入评论"> </textarea><script>const tarea = document.querySelector('textarea')const box = document.querySelector('.box')/*事件对象:当事件发生后,浏览器会把当前事件相关的信息会封装成一个对象获取: 事件处理程序的第一个形参常用事件对象属性 e.target -> 事件源  e.key -> 按键字符串 */box.addEventListener('click', function (e) {console.log(e.target) // box})// input事件 输入内容就触发tarea.addEventListener('input', function () {console.log('正在输入')console.log(tarea.value)})tarea.addEventListener('keyup', function () {console.log('keyup')console.log(tarea.value)}),tarea.addEventListener('keydown', function (e) {console.log('keydown')console.log(e.key)if (e.key === 'Enter') {console.log('你按的是enter')}})// 顺序 keydown -> input -> keyup// 获取用户输入的完整内容 keyup 或input</script></body>
</html>

4、排他思想

排他思想就是清除其他人的样式,只给自己设置

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>.box {display: flex;}.box div {width: 100px;height: 40px;background-color: skyblue;margin: 20px;text-align: center;line-height: 40px;}</style></head><body><div class="box"><div>div1</div><div>div2</div><div>div3</div><div>div4</div></div><script>// 需求 点击某个div div背景色变成红色// 1 获取所有divconst divs = document.querySelectorAll('.box > div')// 2 循环绑定事件for (let i = 0; i < divs.length; i++) {divs[i].addEventListener('click', function () {//把其余的div背景色去掉 对当前点击的div设置// 先干掉所有人-> 让所有的div背景色清空for (let j = 0; j < divs.length; j++) {divs[j].style.backgroundColor = ''}// 再对自己设置// divs[i].style.backgroundColor = '#f00'this.style.backgroundColor = '#f00'})}</script></body>
</html>

5、事件流 

事件流->事件完整执行过程中的流动路径

捕获阶段->目标阶段->冒泡阶段

window->document->html->body->div->body->html->document->window

  捕获阶段:document-- >html-->body-->div-->span

 目标阶段: sapn

 冒泡阶段: span-- > div-- > body-- > html-- > document

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div class="box"></div><div class="son">son</div><script>const box=document.querySelector('.box')const son=document.querySelector('.son')//捕获阶段   truewindow.addEventListener('click',function() {console.log('window')},true)document.addEventListener('click',function() {console.log('document')},true)document.documentElement.addEventListener('click',function() {console.log('html')},true)document.body.addEventListener('click',function() {console.log('body')},true)box.addEventListener('click',function() {console.log('box')},true)son.addEventListener('click',function() {console.log('son')})son.addEventListener('click',function() {console.log('son')},true)// 冒泡  false   默认冒泡window.addEventListener('click',function() {console.log('window')})document.addEventListener('click',function() {console.log('document')})document.documentElement.addEventListener('click',function() {console.log('html')})document.body.addEventListener('click',function() {console.log('body')})box.addEventListener('click',function() {console.log('box')})</script>
</body>
</html>

 6、捕获和冒泡

捕获和冒泡:

js里不会同时出现捕获和冒泡阶段,只能出现一个

传统事件 onclick只有冒泡阶段 传统事件中如果给一个元素添加多个相同的事件时会出现覆盖

事件监听addEventListener(事件类型,事件处理程序,布尔值)

事件监听可以给元素添加多个相同的事件,会自上而下按顺序执行

如果布尔值为空或false时,是冒泡阶段 为true时是捕获阶段

 7、阻止默认和冒泡

阻止默认和冒泡:

e.preventDefault() 阻止默认行为

e.stopPropagation() 阻止冒泡行为

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.father {width: 500px;height: 400px;background-color: pink;}.son {width: 200px;height: 200px;background-color: yellowgreen;}</style>
</head><body><div class="father"><div class="son"></div></div><a href="http://www.baidu.com">百度</a><script>var father = document.querySelector('.father')var son = document.querySelector('.son')var a = document.querySelector('a')// e.preventDefault() 阻止默认行为a.addEventListener('click', function (e) {e.preventDefault()})//  e.stopPropagation() 阻止冒泡行为son.addEventListener('click', function (e) {// alert('我是1')alert('我是儿子')e.stopPropagation()})father.addEventListener('click', function () {alert('我是爸爸')}, false)</script>
</body></html>

8、事件委托

事件委托:给父元素添加事件来处理子元素,原理是使用冒泡 ,点击谁谁的背景颜色发生改变

e.target

ul li 中 给li设置背景颜色,给ul设置事件来设置li,提高了代码程序的性能

鼠标位置:clientX/Y    相对于可视窗口的X,Y轴的坐标

pageX/Y     是相对于页面的坐标

screenX/Y   相对于屏幕的位置

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><ul><li>iii</li><li>bbb</li><li>ccc</li><li>sss</li></ul><script>const ul=document.querySelector('ul')ul.addEventListener('click',function(e) {e.target.style.backgroundColor='pink'})</script></body>
</html>

9、事件解绑

  <button>dom1</button><button>dom2</button>

对dom 0 级进行解绑

    const btn=document.querySelectorAll('button')btn[0].onclick=function() {alert('dom1')btn[0].onclick='null'  //解绑dom 0 级}

对dom 2级进行解绑

   const btn=document.querySelectorAll('button')function f(){alert('dom2')btn[1].removeEventListener('click',f) //dom2 级 解绑}btn[1].addEventListener('click',f)

10、窗口加载事件

window加载事件:等页面元素全部加载完成才执行onload里面的代码

窗口加载   onload 文档全部加载完毕包括css图片js等资源

window.addEventListener( 'load' , function ( ){ } )

DOMContentLoaded 当dom元素加载完毕就执行,不必等其他资源加载完(加载速度快)

window.addEventListener( 'DOMContentLoaded' , function ( ){ } )

11、窗口尺寸事件

window.addEventListener( ' resize',function( ) {console.log('窗口大小改变了');console.log(document.documentElement.clientWidth)  //获取屏幕尺寸})

12、元素尺寸和位置

元素尺寸或位置     client   offset   尺寸             scroll  位置

    clientWidth    内容宽+左右 padding
    clientHeight   内容高+上下 padding

    offsetWidth    带边框的 clientWidth            内容宽+左右padding+左右border

    
     scrollWidth     实际内容区域(包括隐藏的内容)

     offsetLeft / offsetTop 

     offsetLeft   距离参照物(以最近的带有定位的祖先元素,没有则参照物文档)左侧距离
 

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>* {padding: 0;margin: 0;}.wrapper {width: 300px;height: 300px;background-color: red;padding: 20px;border: 6px dashed black;margin-left: 100px;position: relative;}.wrapper .box {width: 100px;height: 100px;background-color: blue;margin: 0 auto;border: 2px solid green;padding: 10px;overflow: hidden;white-space: nowrap;}</style></head><body><div class="wrapper"><div class="box">内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容</div></div><script>const wrapper_box=document.querySelector('.wrapper')const box=document.querySelector('.box')console.log(wrapper_box.clientWidth)//340console.log(wrapper_box.clientHeight)//340console.log(box.clientHeight)//120console.log(box.clientWidth)//120console.log('=======================')console.log(wrapper_box.offsetWidth)//352console.log(wrapper_box.offsetHeight)//352console.log(box.offsetHeight)//123console.log(box.offsetWidth)//123console.log('===========================')console.log(box.scrollWidth)//596console.log(box.offsetTop)//20console.log(box.offsetLeft)//108</script></body>
</html>

13、窗口滚动事件

window.addEventListener( 'scroll', function( ) {console.log(document.documentElement.scrollTop)//页面被卷去的尺寸})

14、日期对象

方法:

getFullYear 获取四位年份

getMonth 获取月份,取值为 0 ~ 11

getDate 获取月份中的每一天,不同月份取值也不相同

getDay 获取星期,取值为 0 ~ 6

getHours 获取小时,取值为 0 ~ 23

getMinutes 获取分钟,取值为 0 ~ 59

getSeconds 获取秒,取值为 0 ~ 59

时间戳是指1970年01月01日00时00分00秒起至现在的总秒数或毫秒数,它是一种特殊的计量时间的方式。

获取时间戳的方法,分别为 getTime 和 Date.now 和 +new Date()  

    // 1. 实例化const date = new Date()// 2. 获取时间戳console.log(date.getTime())
// 还有一种获取时间戳的方法console.log(+new Date())// 还有一种获取时间戳的方法console.log(Date.now())

 15、节点

查找节点


    1.通过节点关系查找元素     元素.parentNode

    2.子节点     元素.children      伪数组    本质是对象  {0:... ,1:***, length : 20}

    元素.childNodes    所有儿子,包括文本节点    可以获取文本换行

    3.兄弟节点
    previousSibling   了解   打印的是文本(比如换行)
    previousElementSibling    上一个兄弟
    nextElementSibling    下一个兄弟

插入节点

  • createElement 动态创建任意 DOM 节点

  • cloneNode 复制现有的 DOM 节点,传入参数 true 会复制所有子节点

  • appendChild 在末尾(结束标签前)插入节点

  • insertBefore 在父节点中任意子节点之前插入新节点

  • prepend(添加的元素)     在父元素的第一个子元素之前添加    每次在前面加

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>.box {margin: 50px auto;width: 300px;position: relative;}img {width: 300px;}.box span {font-size: 20px;position: absolute;right: 0;top: 0;display: block;width: 30px;height: 30px;text-align: center;cursor: pointer;}</style></head><body><div class="box"><img src="./3.webp" alt="" /><span class="close">✖️</span></div><ul><li>中国</li><li>韩国</li><li>朝鲜</li><li>缅甸</li></ul><textarea name="" id="" cols="30" rows="10"></textarea><button>发布评论</button><ul class="comment"></ul><script>// 节点操作 (增  删  改  查)//通过节点关系查找元素 父亲  1  元素.parentNodedocument.querySelector('.close').addEventListener('click', function () {this.parentNode.style.display = 'none'})// 2 获取子节点 元素.childrenconst ul = document.querySelector('ul')console.log(Array.isArray(ul.children))console.log(ul.children) // 伪数组 本质是对象 {0:...,1:***, length:20}console.log(ul.childNodes) // 了解   所有儿子 包括文本节点for (let i = 0; i < ul.children.length; i++) {console.log(ul.children[i])}// 3 兄弟节点const country = document.querySelector('ul  li:nth-child(2)')console.log(country.previousSibling) // 了解console.log(country.previousElementSibling) // 上一个兄弟console.log(country.nextElementSibling) // 下一个兄弟// 获取相关元素const tarea = document.querySelector('textarea')const btn = document.querySelector('button')const comment = document.querySelector('.comment')// 注册事件btn.addEventListener('click', function () {// 1 获取文本域内容let txt = tarea.value.trim()if (txt === '') return// 检测敏感词汇 sblet index = txt.indexOf('sb')while (index !== -1) {txt = txt.replace('sb', '**')index = txt.indexOf('sb')}// 2 创建元素const li = document.createElement('li')li.innerHTML = txt// 3 把li添加到ul// comment.appendChild(li)comment.append(li)//comment.prepend(li) // 在父元素的第一个子元素之前添加// 4 清空文本域tarea.value = ''})</script></body>
</html>

删除节点

     元素.remove( )

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><div class="box"><ul><li>111</li><li>222</li></ul></div><button>删除</button><script>// 删除元素 元素.remove()const ul = document.querySelector('ul')// ul.children[1].remove() '自杀' -> DOM树上不存在该元素// ul.removeChild(ul.children[1]) 父亲删除孩子// ul.children[1].style.display = 'none' // -> 元素隐藏,DOM树上还存在document.querySelector('button').addEventListener('click', function () {const r = confirm('你确定要删除吗?') // 提示确认框r && ul.children[1].remove()})</script></body>
</html>

16、鼠标移入事件

 mouseover   会冒泡

mouseenter   不会冒泡
移动端
touchstart   触摸开始
touchmove   触摸移动
touchend   触摸结束
 

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>.box {width: 300px;height: 300px;background-color: red;}.son {width: 140px;height: 140px;background-color: skyblue;margin: auto;}</style></head><body><div class="box"><!-- <div class="son"></div> --></div><script>// mouseennter(推荐用) mouseover// const box = document.querySelector('.box')// const son = box.children[0]// box.addEventListener('mouseenter', function () {//   alert('父亲')// })// son.addEventListener('mouseenter', function () {//   alert('儿子')// })let startX = 0document.querySelector('.box').addEventListener('touchstart', function (e) {startX = e.changedTouches[0].pageXconsole.log('触摸开始')})document.querySelector('.box').addEventListener('touchmove', function (e) {const diff = e.changedTouches[0].pageX - startXconsole.log(diff > 0 ? '右滑' : '左滑')console.log('一直触摸')})document.querySelector('.box').addEventListener('touchend', function () {console.log('触摸结束')})</script></body>
</html>

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

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

相关文章

【信息安全】浅谈IDOR越权漏洞的原理、危害和防范:直接对象引用导致的越权行为

前言 ┌──────────────────────────────────┐ │ 正在播放《越权访问》 - Hanser │ ●━━━━━━─────── 00:00 / 03:05 │ ↻ ◁ ❚❚ ▷ ⇆ └───────────────────────────────…

vite+vue3+electron开发环境搭建

环境 node 18.14.2 yarn 1.22 项目创建 yarn create vite test01安装vue环境 cd test01 yarn yarn dev说明vue环境搭建成功 安装electron # 因为有的版本会报错所以指定了版本 yarn add electron26.1.0 -D安装vite-plugin-electron yarn add -D vite-plugin-electron根目…

杭州-区块链前瞻性论坛邀请函​

2023密码与安全前瞻性论坛邀请函 生成合法节点或非法节点&#xff0c;测试共识协议

若依框架数据源切换为pg库

一 切换数据源 在ruoyi-admin项目里引入pg数据库驱动 <dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.2.18</version> </dependency>修改配置文件里的数据源为pg spring:d…

【AD封装】芯片IC-SOP,SOIC,SSOP,TSSOP,SOT(带3D)

包含了我们平时常用的芯片IC封装&#xff0c;包含SOP,SOIC,SSOP,TSSOP,SOT&#xff0c;总共171种封装及精美3D模型。完全能满足日常设计使用。每个封装都搭配了精美的3D模型哦。 ❖ TSSOP和SSOP 均为SOP衍生出来的封装。TSSOP的中文解释为&#xff1a;薄的缩小型 SOP封装。SSO…

TableUtilCache:针对CSV表格进行的缓存

TableUtilCache:针对CSV表格进行的缓存 文件结构 首先来看下CSV文件的结构&#xff0c;如下图&#xff1a; 第一行是字段类型&#xff0c;第二行是字段名字&#xff1b;再往下是数据。每个元素之间都是使用逗号分隔。 看一下缓存里面存储所有表数据的字段 如下图&#xff…

Consistency Models 阅读笔记

Diffusion models需要多步迭代采样才能生成一张图片&#xff0c;这导致生成速度很慢。Consistency models的提出是为了加速生成过程。 Consistency models可以直接一步采样就生成图片&#xff0c;但是也允许进行多步采样来提高生成的质量。 Consistency models可以从预训练的扩…

AI创作系统ChatGPT网站源码/支持DALL-E3文生图/支持最新GPT-4-Turbo模型+Prompt应用

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

tomcat8.5处理get请求时,控制台输出中文乱码问题的解决

问题描述 控制台输出中文乱码 版本信息 我使用的是tomcat8.5 问题解决 配置web.xml 注&#xff1a;SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前&#xff0c;否则无效 <!--配置springMVC的编码过滤器--> <filter><filter-name>CharacterEn…

紫色调城市和奔跑人物剪影背景工会工作总结汇报PPT模板

这是一套紫色调城市和奔跑人物剪影背景工会工作总结汇报PPT模板&#xff0c;共33页&#xff1b; PPT模板封面&#xff0c;使用了蓝天白云、城市剪影、奔跑人物剪影背景图片。中间填写工会工作总结汇报PPT标题。界面色彩丰富充满活力。 PowerPoint模板内容页&#xff0c;由31张…

麒麟 ZYJ 服务器软件适配 参考示例

一、zyj 环境简介 1. ZYJ 概述 国产化 SMZYJ 是由国家 BM 主管部门鉴定并批准生产使用的国内自主开发的 整机 JM 国标设备&#xff0c;设备采用了自主设备基础硬件&#xff08;飞腾、国科微等&#xff09;、安全硬 件自主固件&#xff08;昆仑等&#xff09;自主 SM 专用操作…

Unity中Shader立方体纹理Cubemap

文章目录 前言一、什么是立方体纹理二、立方体纹理的生成方式1、使用6个面的生成方式2、使用单张图片的生成方式 三、Cubemap的采样方式四、在Unity中看一下Cubemap五、在Shader中&#xff0c;对立方体纹理进行采样使用1、我们在属性面板定义一个Cube类型的变量来存放立方体纹理…

LeetCode【4】寻找两个正序数组中位数

题目&#xff1a; 思路&#xff1a; https://blog.csdn.net/a1111116/article/details/115033098 代码&#xff1a; public double findMedianSortedArrays(int[] nums1, int[] nums2) {int[] ints Arrays.copyOf(nums1, nums1.length nums2.length);System.arraycopy(nums2…

【Unity】XML文件的解析和生成

目录 使用XPath路径语法解析 使用xml语法解析 XML文件的生成 XML文件是一种常用的数据交换格式&#xff0c;它以文本形式存储数据&#xff0c;并使用标签来描述数据。解析和生成XML文件是软件开发中常见的任务。 解析XML文件是指从XML文件中读取数据的过程。在.NET中&#…

图数据库Neo4J 中文分词查询及全文检索(建立全文索引)

Neo4j的全文索引是基于Lucene实现的&#xff0c;但是Lucene默认情况下只提供了基于英文的分词器&#xff0c;下篇文章我们在讨论中文分词器&#xff08;IK&#xff09;的引用&#xff0c;本篇默认基于英文分词来做。我们前边文章就举例说明过&#xff0c;比如我要搜索苹果公司&…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(五)

公共字段自动填充 1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3 步骤三 1.4 功能测试 1.1 问题分析 在前面我们已经完成了后台系统的员工管理功能和菜品分类功能的开发&#xff0c;在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修…

社区分享|杭银消费金融基于MeterSphere开展接口自动化测试

杭银消费金融有限公司&#xff08;以下简称“杭银消费金融”&#xff09;成立于2015年12月&#xff0c;是经中国银保监会批准&#xff0c;由杭州银行作为主发起人&#xff0c;联合滴滴出行、中国银泰等企业组建的持牌消费金融机构&#xff0c;注册资本为25.61亿元。杭银消费金融…

Python武器库开发-flask篇之Get与Post(二十五)

flask篇之Get与Post(二十五) 在Flask中通过request对象请求相关的数据,在正常的网页请求的过程中&#xff0c;有两种请求的方式&#xff0c;Get和Post Get请求 我们现在来看看在Flask中是如何以Get方式得到我们想要的值的&#xff0c;通过request.args可以获取Get请求中的所…

深入理解网络协议:通信世界的基石

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在当今数字化时代&#xff0c;网络协议是连接世…