JavaScript事件监听之其它事件(页面加载事件、元素滚动事件、页面尺寸事件、M端事件)

news2025/2/23 13:42:04

目录

  • 1. 页面加载事件(load、DOMContentLoaded)
  • 2. 元素滚动事件(scroll)
  • 3. 页面尺寸事件
    • 3.1 resize
    • 3.2 获取元素宽高
    • 3.3 获取元素位置(offsetLeft和offsetTop、getBoundingClientRect)
  • 4. M端事件

1. 页面加载事件(load、DOMContentLoaded)

load事件:

  • 使用场景: 等外部资源(如图片、外部CSS和JavaScript等)加载完毕时才触发事件;或将javascript写在head中,等window加载完毕才触发事件,避免dom元素找不到
  • 绑定对象:window或img等

示例如下。javascript在head中,直接获取btn,添加监听事件是无效的,因为btn为null。所以给window添加load事件,等window的资源加载完毕,再去执行回调函数就可以点击按钮了

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no,maximum-scale=1.0,minimum-scale=1.0">
  <title>Title</title>

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

</head>
<body>

  <button>点我</button>
</body>
</html>

DOMContentLoaded事件

  • 使用场景:当初始的HTML文档被完全加载和解析完成之后,无需等待样式表、图像等完全加载,就触发事件。比load事件触发时间更早
  • 绑定对象:docment

示例如下。给docment添加DOMContentLoaded事件,等docment的html加载完毕,就去执行回调函数就可以点击按钮了

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no,maximum-scale=1.0,minimum-scale=1.0">
  <title>Title</title>

  <script>
    document.addEventListener('DOMContentLoaded', function () {
      const btn = document.querySelector('button')
      btn.addEventListener('click', function () {
        alert('html加载完毕我就可以点击了')
      })
    })
  </script>

</head>
<body>

  <button>点我</button>
</body>
</html>

2. 元素滚动事件(scroll)

scroll事件:

  • 使用场景:滚动条在滚动的时候持续触发的事件。如用户把页面滚动到某个区域后固定右侧导航栏
  • 绑定对象:window、document、某个滚动元素等
  • 获取滚动位置:向下滚动位置:元素.scrollTop;向右滚动位置:元素.scrollLeft。也可以对滚动位置的值直接进行修改,就可以完成类似回到顶部的效果
  • 也可以使用元素.scrollTo(x, y)滚动到指定的坐标。如window.scrollTo(0, 0)返回顶部
  • 获取html元素写法: document.documentElement

示例如下。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no,maximum-scale=1.0,minimum-scale=1.0">
  <title>Title</title>

  <style>

    html {
	  /* 让回到顶部这种效果,滚动条丝滑的滚动 */
	  scroll-behavior: smooth;
	}


    body {
      padding-top: 100px;
      height: 3000px;
    }

    div {
      display: none;
      width: 100px;
      height: 100px;
      background-color: pink;
    }

  </style>


</head>
<body>

  <div></div>

  <script>
    const div = document.querySelector('div')
    window.addEventListener('scroll', function () {
      const scrollTopValue = document.documentElement.scrollTop
      if (scrollTopValue >= 100) {
        div.style.display = 'block'

        if(scrollTopValue > 300) {
          document.documentElement.scrollTop = 0
        }
      } else {
        div.style.display = 'none'
      }
    })
  </script>
</body>
</html>

页面效果如下:

  1. 打开页面,页面空白,页面右侧有滚动条
  2. 当滚动条滚动达到100时,div盒子显示出来。如下图所示
  3. 当滚动条滚动达到300时,页面回到顶部,div盒子隐藏
    元素滚动事件效果

3. 页面尺寸事件

3.1 resize

会在窗口尺寸改变的时候触发事件

示例如下。当页面的宽度不断变化,控制台不停的打印页面的宽度数值

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no,maximum-scale=1.0,minimum-scale=1.0">
  <title>Title</title>
  
</head>
<body>

  <script>
    window.addEventListener('resize', function () {
      let w = document.documentElement.clientWidth
      console.log(w)
    })
  </script>
</body>
</html>

3.2 获取元素宽高

  • clientWidth和clientHeight:获取元素的自身宽高 + padding(不包含border,margin,滚动条等)。如果盒子隐藏则结果为0。只读属性
  • offsetWidth和offsetHeight:获取元素的自身宽高 + padding + border + 滚动条(不包含margin等)。如果盒子隐藏则结果为0。只读属性

示例如下。改变div的内容长度或改变padding值,clientWidth都会变化,但改变border值,clientWidth不会变化

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no,maximum-scale=1.0,minimum-scale=1.0">
  <title>Title</title>

  <style>
    div {
      display: inline-block;
      height: 50px;
      background-color: pink;
      padding: 10px;
      border: 10px solid red;
    }
  </style>

</head>
<body>
  <div>123456789</div>

  <script>
    const div = document.querySelector('div')
    console.log(div.clientWidth)
  </script>
</body>
</html>

3.3 获取元素位置(offsetLeft和offsetTop、getBoundingClientRect)

  • offsetLeft和offsetTop:只读属性,获取元素距离自己定位父级元素的左、上距离。如果父元素没定位,则不断往上找,都没有则以文档左上角为准
    offsetLeft和offsetTop

示例:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no,maximum-scale=1.0,minimum-scale=1.0">
  <title>Title</title>

  <style>
    div {
      position: relative;
      width: 200px;
      height: 200px;
      background-color: pink;
      margin: 100px;
    }

    p {
      position: absolute;
      width: 100px;
      height: 100px;
      background-color: purple;
      margin: 50px;
    }
  </style>

</head>
<body>
  <div>
    <p></p>
  </div>
  <script>
    const div = document.querySelector('div')
    const p = document.querySelector('p')
    console.log(div.offsetLeft)
    console.log(p.offsetLeft)
  </script>
</body>
</html>

页面效果如下。控制台打印如下:
offsetLeft和offsetTop效果

  • getBoundingClientRect: 方法返回元素的大小及其相对于视口的位置

示例:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no,maximum-scale=1.0,minimum-scale=1.0">
  <title>Title</title>

  <style>
    body {
      height: 2000px;
    }

    div {
      width: 200px;
      height: 200px;
      background-color: pink;
      margin: 100px;
    }
  </style>

</head>
<body>
  <div></div>
  <script>
    const div = document.querySelector('div')
    console.log(div.getBoundingClientRect())
  </script>
</body>
</html>

效果如下。将页面往下滑动:

  • left/x: 盒子左边距视口左边的距离
  • right: 盒子右边距视口左边的距离
  • top/y: 盒子上边距视口上边的距离
  • bottom: 盒子下边距视口上边的距离
    getBoundingClientRect效果

4. M端事件

移动端有自己独特事件,比如最常见的touch(触屏事件/触摸事件),Android和IOS都有,touch对象代表一个触摸点

常见的触摸事件如下:

  • touchstart: 手指触摸到一个DOM元素时触发
  • touchmove: 手指在一个DOM元素上滑动时触发
  • touchend: 手指从一个DOM元素上移开时触发

示例如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>test title</title>

  <style>
    div {
      width: 200px;
      height: 200px;
      background-color: pink;
    }
  </style>

</head>
<body>
  <div></div>

  <script>
    const div = document.querySelector('div')
    div.addEventListener('touchstart', function () {
      console.log('开始触摸屏幕了')
    })
    div.addEventListener('touchmove', function () {
      console.log('一直在屏幕上滑动')
    })
    div.addEventListener('touchend', function () {
      console.log('离开屏幕了')
    })

  </script>
</body>
</html>

效果如下。按住屏幕,然后在屏幕上滑动,最后离开屏幕。控制台打印的消息如下
M端事件效果

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

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

相关文章

MyBatis二级缓存开启条件

MyBatis缓存为俩层体系。分为一级缓存和二级缓存。 一级缓存&#xff1a; 一级缓存默认开启&#xff0c;一级缓存的作用域是SqlSession级别的&#xff0c;这意味着当你更换SqlSession之后就不能再利用原来的SqlSession的一级缓存了。不同的SqlSession之间的一级缓存是隔离的。…

基础概念解析:SOCKS5代理究竟是什么?SOCKS5代理ip使用场景有哪些?

在当今数字化时代&#xff0c;网络安全和隐私保护已成为我们日常生活中不可忽视的问题。随着网络攻击手段的日益复杂&#xff0c;如何安全地访问互联网资源成为了一个亟待解决的问题。SOCKS5代理作为一种先进的网络协议&#xff0c;为我们提供了解决这一问题的有效方案。 本文…

实用的 C 盘搬家软件

一、简介 1、一款专门用于 Windows 系统的文件夹移动工具&#xff0c;它允许用户将程序或游戏的安装文件夹从一台驱动器移动到另一台驱动器&#xff0c;或者同一个驱动器内的不同路径&#xff0c;而无需重新安装或破坏现有的程序安装。 二、下载 1、下载地址&#xff1a; 官网链…

3-1RT-Thread时钟管理

这里写自定义目录标题 时钟节拍是RT thread操作系统的最小时间单位。 第一个功能&#xff0c;rt tick值自动加1&#xff0c;在RT thread当中通过RT_USING_SMP定义了多核和单核的场景。第二个功能&#xff0c;检查当前线程的时间片&#xff0c;首先获取当前线程&#xff0c;将当…

AI 写高考作文丨10 款大模型 “交卷”,实力水平如何?

前言 在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已不再是遥不可及的未来科技&#xff0c;而是逐渐融入我们日常生活的实用工具。从智能语音助手到自动驾驶汽车&#xff0c;从智能家居系统到精准医疗诊断&#xff0c;AI技术正以其强大的计算能力和数…

端午搞个零花钱,轻松赚取创业的第一桶金!2024最受欢迎的创业项目,2024新的创业机会

好好的端午节&#xff0c; 净给我添堵&#xff01; 本来我打算在端午节愉快的玩耍&#xff0c; 结果一大早起床却看到舍友在给一堆设备充电&#xff0c; 然后装的整整齐齐&#xff0c; 满满一书包。 我好奇他小子这是要干嘛&#xff1f; 不会是打算今天回去给亲朋好友准备…

Centos7 安装配置SFTP

Centos7安装配置SFTP 更新源安装 OpenSSH 服务启动服务设置为开机自启动新建一个用户 (sftpuser为你要设置的用户的用户名)编辑配置文件设置sftp用户的根目录重启SSH服务代码实现 由于最近工作中需要实现动态上传文件到帆软服务器&#xff0c;但是帆软没有提供相关API&#xff…

Allegro限制走线区域和元器件摆放区域

一、Line to Shape 当你的板框是线条形式时&#xff0c;先将线条闭合成shape&#xff0c;点击Shape–>Compose Shape,选择如下参数&#xff0c;再逐一选中分散线条&#xff0c;选择完毕右键Done即可 二、Z-Cope使用 点击Edit–>Z-Cope&#xff0c;选择如下参数&…

Django项目上线-报错汇总

Django项目上线-报错汇总 下列报错基本都是Python环境相关 pip install 报错 WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. debian运行pip报错ssl module in Python is not available - z417 - 博…

SM481,SM432和利时DCS备件

SM481,SM432和利时DCS备件。POU名只能包含字母、数字、下划线&#xff0c;第一个字符必须是字母或者下划线&#xff0c;且遵循以下原则&#xff1a;SM481,SM432和利时DCS备件。关于重名&#xff0c;不能与变量名、变量组名、POU文件夹名、任务名、SM481,SM432和利时DCS备件。工…

OpenCompass 大模型评测平台C-Eval 基准任务评估实战

1. 引言 在人工智能迅速发展的今天&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在多个领域展现出了巨大的潜力和应用价值。然而&#xff0c;如何评价这些模型的性能&#xff0c;了解它们的优缺点&#xff0c;成为了一个重要课题。OpenCompass&#xff0c;一个由上海…

【Java】解决Java报错:ArrayIndexOutOfBoundsException

文章目录 引言1. 错误详解2. 常见的出错场景2.1 直接访问数组越界2.2 循环中的索引错误2.3 多维数组的错误访问 3. 解决方案3.1 检查数组长度3.2 正确使用循环3.3 多维数组的正确访问 4. 预防措施4.1 使用增强型 for 循环4.2 编写防御性代码4.3 单元测试 结语 引言 在Java编程…

C++学习插曲:“name“的初始化操作由“case“标签跳过

问题 "name"的初始化操作由"case"标签跳过 问题代码 case 3: // 3、删除联系人string name;cout << "请输入删除联系人姓名&#xff1a;" << endl;cin >> name;if (isExistPerson(&abs, name) -1){cout << "…

Linux--进程间通信(system V共享内存)

目录 1.原理部分 2.系统调用接口 参数说明 返回值 1. 函数原型 2. 参数说明 3. 返回值 4. 原理 5. 注意事项 3.使用一下shmget&#xff08;一段代码&#xff09; 4.一个案例&#xff08;一段代码) 1.简单封装一下 2.使用共享内存 2.1挂接&#xff08;shmat&#x…

netty+springboot+vue聊天室(需要了解netty)

先看看这个使用websocket实现的聊天室&#xff0c;因为前端是使用websocket&#xff0c;和下面的demo的前端差不多就不解释实现原理&#xff0c;所以建议还是看看(要是会websocket的大佬请忽略) springbootwebsocketvue聊天室 目录 一、实现内容二、代码实现1.后端2.前端源码…

java基础语法整理 ----- 上

java基础语法 一、变量二、数据类型三、标识符四、键盘录入五、判断语句1. 三种格式2. 练习题 六、switch语句七、循环八、循环控制语句九、方法 一、变量 1.什么是变量&#xff1a; 在程序运行过程中&#xff0c;其值可以发生改变的量从本质上讲&#xff0c;变量是内存中的一…

Java--命令行传参

1.有时你希望运行一个程序时再传递给它消息&#xff0c;这要靠传递命令行参数给main&#xff08;&#xff09;函数实现 2.选中文件右键找到如图选项并打开 3.在文件地址下输入cmd空格符号&#xff0c;再按回车调出命令窗口 4.如图一步步进行编译&#xff0c;在向其传入参数&…

Web自动化测试-掌握selenium工具用法,使用WebDriver测试Chrome/FireFox网页(Java

目录 一、在Eclipse中构建Maven项目 1.全局配置Maven 2.配置JDK路径 3.创建Maven项目 4.引入selenium-java依赖 二、Chrome自动化脚本编写 1.创建一个ChromeTest类 2.测试ChromeDriver 3.下载chromedriver驱动 4.在脚本中通过System.setProperty方法指定chromedriver的…

PowerDesigner遍历导出所有表结构到Excel

PowerDesigner遍历导出所有表到Excel 1.打开需要导出表结构到Excel的pdm文件 2.点击Tools|Execute Commands|Edit/Run Script菜单或按下快捷键Ctrl Shift X打开脚本窗口&#xff0c;输入示例VBScript脚本&#xff0c;修改其中的Excel模板路径及工作薄页签&#xff0c;点Run…

【嵌入式】智能系统优化:【C++】驱动的【机器学习】与【数据挖掘】技术

目录 一、嵌入式系统简介 二、C在嵌入式系统中的优势 三、机器学习在嵌入式系统中的挑战 四、C实现机器学习模型的基本步骤 五、实例分析&#xff1a;使用C在嵌入式系统中实现手写数字识别 1. 数据准备 2. 模型训练与压缩 3. 模型部署 六、优化与分析 1. 模型优化 模…