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

JS之防抖和节流

防抖 (debounce)

所谓防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。

ps: 重置普攻,百度翻译要输完停止一定时间后才翻译。

没有防抖和节流的缺点

  1. 函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。
  2. 浪费请求资源

策略
当事件被触发时,设定一个周期延时执行动作,若周期又被触发,则重新设定周期,直到周期结束,执行动作。
在后期有拓展了前缘防抖函数,即执行动作在前,设定延迟周期在后,周期内有事件被触发,不执行动作,且周期重新设定。

案例:停止输入后将输入的字符串翻转
在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>防抖 </title><style>* {margin: 0;padding: 0;}html,body {height: 100%;}body {display: flex;justify-content: center;align-items: center;}.container {display: flex;justify-content: space-around;width: 800px;height: 400px;padding: 20px;box-shadow: 0 0 8px #222;}.container div {width: 350px;height: 380px;padding: 8px;border: 1px solid #ccc;font-size: 18px;line-height: 20px;word-break: break-all;}.input-box {color: #368;outline: none;}.show-box {color: orange;}</style>
</head><body><div class="container"><div class="input-box" contenteditable></div><div class="show-box"></div></div><script>var oInput = document.querySelector('.input-box')var oShow = document.querySelector('.show-box')var timeOut;//这个timeOut必须是全局变量
oInput.addEventListener('input', function () {timeOut && clearTimeout(timeOut);timeOut = setTimeout(function () {oShow.innerText = translate(oInput.innerText);}, 500);
}, false);function translate(str) {return str.split("").reverse().join("");
}</script>
</body></html>

节流 (throttling)

所谓节流,就是指连续触发事件但是在 n 秒中只执行一次函数。**节流会稀释函数的执行频率。

对于节流,有多种方式可以实现 时间戳 定时器 束流等。

ps : 技能CD

应用场景:

  1. 鼠标连续不断地触发某事件(如点击),只在单位时间内只触发一次;

  2. 在页面的无限加载场景下,需要用户在滚动页面时,每隔一段时间发一次 ajax 请求,而不是在用户停下滚动页面操作时才去请求数据;

  3. 监听滚动事件,比如是否滑到底部自动加载更多,用throttle来判断;

策略:
固定周期内,只执行一次动作,若没有新事件触发,不执行。周期结束后,又有事件触发,开始新的周期。
特点
连续高频触发事件时,动作会被定期执行,响应平滑

计时器版

var oCon = $('.container');
var num = 0;
var valid = true;
oCon.addEventListener('mousemove', function () {if (!valid) {return false;}valid = false;setTimeout(function () {count();valid = true;}, 500);
}, false);function count() {oCon.innerText = num++;
}

时间戳版

var oCon = $('.container');
var num = 0;
var time = Date.now();
oCon.addEventListener('mousemove', function () {if (Date.now() - time < 600) {return false;}time = Date.now();count();
}, false);function count() {oCon.innerText = num++;
}

束流器版

一般用在游戏中,元素以不同频率运动

这样做的好处是可以把所有元素用同一个定时器来管理,用速差来做不同频率的运动

var oCon = $('.container');
var num = 0;
var time = 0;
oCon.addEventListener('mousemove', function () {time++;if (time % 30 !== 0) {return false;}console.log(time)count();
}, false);function count() {oCon.innerText = num++;
}

案例:同一个定时器中 红色小球运动两次 蓝色小球运动一次

在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>定时器运动 </title><style>* {margin: 0;padding: 0;}html,body {height: 100%;}div {position: absolute;width: 100px;height: 100px;border-radius: 50%;}.red {top: 100px;background-color: red;}.blue {background-color: blue;}</style>
</head><body><div class="red"></div><div class="blue"></div><script src="js/common.js"></script><script>var oRed = $('.red');var oBlue = $('.blue');var speed = 0;var counter = 0;var time;time = setInterval(function () {speed += .1;counter++;oRed.style.left = oRed.offsetLeft + speed+ 'px';if (counter % 2 === 0) {oBlue.style.left = oBlue.offsetLeft + speed+ 'px';}}, 1000 / 30);</script>
</body></html>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SQL FOREIGN KEY
  • 全网最适合入门的面向对象编程教程:12 类和对象的 Python 实现-Python 使用 logging 模块输出程序运行日志
  • [激光原理与应用-102]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 6 - 激光焊接系统的组成
  • 【密码学】分组密码概述
  • Rockchip RK3588 - Rockchip Linux SDK脚本分析
  • 探索C嘎嘎的奇妙世界:第十九关---STL(list的模拟实现)
  • Android studio之编译提示Could not find :umeng-asms-v1.2.1
  • 【MySQL数据库之概念性问题】
  • 重点区域分布式无人机探测防御系统详解
  • QUdpSocket 的bind函数详解
  • 14-57 剑和诗人31 - LLM/SLM 中的高级 RAG
  • Hospital Management Startup 1.0 SQL 注入漏洞(CVE-2022-23366)
  • Mongodb索引的删除
  • 源码编译安装 LAMP
  • 部署前端项目
  • ES6之路之模块详解
  • Git同步原始仓库到Fork仓库中
  • Java读取Properties文件的六种方法
  • php中curl和soap方式请求服务超时问题
  • Spring Cloud中负载均衡器概览
  • Vue.js 移动端适配之 vw 解决方案
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 从PHP迁移至Golang - 基础篇
  • 第十八天-企业应用架构模式-基本模式
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 服务器从安装到部署全过程(二)
  • 回顾 Swift 多平台移植进度 #2
  • 前端之React实战:创建跨平台的项目架构
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 嵌入式文件系统
  • 软件开发学习的5大技巧,你知道吗?
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • puppet连载22:define用法
  • ​queue --- 一个同步的队列类​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #职场发展#其他
  • (c语言)strcpy函数用法
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (TOJ2804)Even? Odd?
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)appium-desktop定位元素原理
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET与 java通用的3DES加密解密方法
  • @WebServiceClient注解,wsdlLocation 可配置
  • @软考考生,这份软考高分攻略你须知道
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务