当前位置: 首页 > news >正文

前端防抖和节流

前端防抖和节流

概述

防抖: 防止抖动,个人字面理解此处防的不是页面的抖动,而是用户手抖。为了防止用户快速且频繁的触发事件而导致多次执行事件函数,这样的场景有很多,比如监听滚动、鼠标移动事件onmousemove、频繁点击表单的提交按钮等等。
节流: 节约流量,为了节约流量,页面在一个时间周期内,只触发一次动作。所以节流的目的时稀释函数的执行频率。
防抖动和节流本质是不一样的。防抖动是多次触发但只会执行一次,节流是多次触发但周期内只会执行一次

防抖实现

<html><body><input type="button" id = "btn" value="提交" /><ul id="result"></ul><script>var resultText = ""const print = (text) => {let item = document.createElement('li')item.innerText = textdocument.getElementById("result").appendChild(item)}// 创建debounce防抖函数const debounce = (func, wait) => {let timeout = null;// 此时func的this指向是window// 如果func内部想修改this指向当前函数的调用者,就必须存储this,之后借助apply修改func的this指向。// 因此借助闭包缓存调用者的thislet context = null; let args = null;// 通过定时器延迟执行事件函数let run = () => {timeout = setTimeout(() => {// 通过 apply 修改func的this指向,并让func获取真正的事件函数(即防抖函数return出来的函数)的参数,之后执行funcfunc.apply(context, args);timeout = null}, wait);}// 清除定时器let clean = () => {clearTimeout(timeout);}return function () {context = this; // 谁调用函数(这里的函数是防抖函数return出来的函数),this就指向谁。args = arguments; // arguments 是一个对应于传递给函数的参数的类数组对象,可以获取函数的参数(这里的函数是防抖函数return出来的函数)。console.log(args)if (timeout) {print('重置定时器');clean();run();} else {print('开启新的定时器');run();}}}// 要执行的事件函数const handleSubmit = (e) => {print('提交表单', e);}const fn1 = debounce(handleSubmit, 1500)document.getElementById("btn").addEventListener("click", fn1)</script>
</body></html>

节流实现

<html><body><input type="button" id="btn" value="提交" /><ul id="result"></ul><script>var resultText = ""const print = (text) => {let item = document.createElement('li')item.innerText = textdocument.getElementById("result").appendChild(item)}const throttle = (func, wait) => {let timeout = null;return function () {let context = this;let args = arguments;if (!timeout) {timeout = setTimeout(() => {timeout = null;func.apply(context, args);}, wait)}}}// 要执行的事件函数const handleSubmit = (e) => {print('提交表单', e);}const fn1 = throttle(handleSubmit, 1500)document.getElementById("btn").addEventListener("click", fn1)</script>
</body></html>
http://www.lryc.cn/news/171971.html

相关文章:

  • [pai-diffusion]pai的easynlp的clip模型训练
  • 期权如何交易?期权如何做模拟交易?
  • 【新书推荐】大模型赛道如何实现华丽的弯道超车 —— 《分布式统一大数据虚拟文件系统 Alluxio原理、技术与实践》
  • Calendar对象获取当前周的bug
  • 嵌入式环境buildroot的espeak配置与编译
  • 物理机环境搭建-linux部署nginx
  • 删除安装Google Chrome浏览器时捆绑安装的Google 文档、表格、幻灯片、Gmail、Google 云端硬盘、YouTube网址链接(Mac)
  • 硬件故障诊断:快速定位问题
  • IP代理与加速器:理解它们的区别与共同点
  • Java中List转字符串的方法
  • PyTorch实战:实现MNIST手写数字识别
  • 【计算机网络】深入理解TCP协议二(连接管理机制、WAIT_TIME、滑动窗口、流量控制、拥塞控制)
  • springboot整合sentinel完成限流
  • signal(SIGPIPE, SIG_IGN)
  • GAN学习笔记
  • layui框架学习(45: 工具集模块)
  • 车道检测:Decoupling the Curve Modeling and Pavement Regression for Lane Detection
  • 【扩散生成模型】Diffusion Generative Models
  • 美联储加息步伐“暂停”!BTC凌晨力守27000美元!
  • 微信小程序与idea后端如何进行数据交互
  • Java 学习路线分享 maven 是什么?
  • 实战演练 | Navicat 常用功能之转储与运行 SQL 文件
  • MySQL的备份与恢复
  • Python中的函数未定义的错误
  • AG35学习笔记(二):安装编译SDK、CMakeLists编译app、Scons编译server
  • 多台服务器sessionId共享
  • 如何在Gazebo中实现多机器人编队仿真
  • 迅为iTOP-iMX6QPLUS-Android6.0下uboot添加网卡驱动
  • sql server 触发器的使用
  • 使用亚马逊云服务器在 G4 实例上运行 Android 应用程序