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

Js — 节流及底层实现

节流:单位时间内,频繁触发事件,只执行一次

节流是频繁触发只执行首次;防抖是频繁触发只执行最后一次

节流实现方式:

  • lodash提供的节流函数_.throttle(func,[wait=0],[options=])

在wait秒内最多执行func一次

也就是说“在wait秒内不管触发多少次,都只调一次func

  • 定时器setTimeout

目标:鼠标在盒子上移动,不管移动多少次,每隔500ms才+1

_.throttle函数

<!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: 500px;height: 500px;background-color: #ccc;color: #fff;text-align: center;font-size: 100px;}</style>
</head><body><div class="box"></div><script src="lodash.min.js"></script><script>const box = document.querySelector('.box')let i = 1  // 鼠标移动函数function mouseMove() {box.innerHTML = i++}box.addEventListener('mousemove',_.throttle(mouseMove,3000))</script></body></html>

定时器(底层)

思路:

  • 声明一个定时器变量
  • 当鼠标每次滑动都先判断是否有定时器,如果有定时器则不开启新的定时器
  • 如果没有定时器则开启定时器,记得存到变量里面
    • 定时器里面调用执行的函数
    • 定时器里面要把定时器清空

<!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: 500px;height: 500px;background-color: #ccc;color: #fff;text-align: center;font-size: 100px;}</style>
</head><body><div class="box"></div><script src="lodash.min.js"></script><script>const box = document.querySelector('.box')let i = 1  // 鼠标移动函数function mouseMove() {box.innerHTML = i++}function throttle(fn,t){let timer = nullreturn function(){if(!timer){timer = setTimeout(function(){fn()//清空定时器timer=null},t)}}}//return个匿名函数,这样才能多次执行;否则是调用的话,它只会执行一次box.addEventListener('mousemove',throttle(mouseMove,3000))</script></body></html>

清空定时器为什么采用timer=null;而非clearTimeout(timer)

因为在setTimeout中是无法清除定时器的,因为定时器还在运作;不合理


http://www.mrgr.cn/news/69641.html

相关文章:

  • [CKS] K8S NetworkPolicy Set Up
  • 车-路-站-网”信息耦合的汽车有序充电
  • Springboot 微信小程序定位后将坐标转换为百度地图坐标,在百度地图做逆地址解析
  • conda 启动时添加执行脚本
  • LeetCode100之相交链表(160)--Java
  • vue计算属性 初步使用案例
  • GNN - Transformer 新突破 —— 解锁全局与局部的完美融合!
  • 08_docker网络
  • LeetCode 第 423 场周赛个人题解
  • 全国智能网联招标项目一周速览(2024年11月10日)
  • 基于Spring Boot的计算机课程管理:工程认证的实践
  • WPS Office Excel 转 PDF 后图片丢失的解决方法
  • go桌面框架Fyne最全api文档
  • 释放创作潜力!Flux 模型现已集成至 ComfyUI,快来体验!
  • 2024程序员,转行还是不转行,必须严肃想一想?(一条120W+阅读的讨论)
  • SpringCloudalibaba 集成 Knife4j 的时候出现多余的 前缀
  • Java | Leetcode Java题解之第554题砖墙
  • 动态规划(简单多状态 dp 问题 1.按摩师 2.打家劫舍 II 3. 删除并获得点数 4.粉刷房子 5.买卖股票的最佳时机(全系列))
  • php 之添加图片水印,根据比例计算水印的新尺寸
  • 【计网】实现reactor反应堆模型 --- 处理数据发回问题 ,异常处理问题
  • 【Linux】【线程操作与同步】汇总整理
  • 鸿蒙next版开发:ArkTS组件通用属性(图形变换)
  • AndroidStudio-视图基础
  • 链表的使用
  • 《Agent 工作流 2025》
  • AI与OCR:数字档案馆图像扫描与文字识别技术实现与项目案例