原生js中的防抖节流笔记

2024-08-24 03:36
文章标签 笔记 js 原生 节流 防抖

本文主要是介绍原生js中的防抖节流笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

防抖,单位时间内,频繁触发,只执行最后一次

效果演示

  • 优化前,不断触发,浪费性能
    请添加图片描述

  • 优化后,只在指定时间内触发
    请添加图片描述

演示代码

import debounce from "/node_modules/lodash-es/debounce.js";
const oBox = document.getElementById("box");
let index = 0;
function move() {this.innerHTML = index++;
}//默认进来调用一次
move.call(oBox);
//使用防抖
oBox.addEventListener("mousemove", debounce(move, 1000));
//不使用防抖
// oBox.addEventListener("mousemove", move);//自己封装的防抖
function _debounce(fn, delay) {clearTimeout(this.timeId);this.timeId = setTimeout(() => {move.call(this);}, 1000);
}
 #box{width: 100px;height: 100px;background: red;color:#fff;text-align: center;cursor: pointer;}
<div id="box"></div>

封装优化

function _debounce(fn, delay) {//默认进来调用一次move.call(oBox);return function () {clearTimeout(fn.timeId);fn.timeId = setTimeout(() => {move.call(this);}, delay);};
}

节流,单位时间内,频繁触发,只执行第一次,期间触发不执行,500s再执行
窗口大小改变时的布局调整:当用户快速调整窗口大小时,节流可以确保在每个时间段内只执行一次布局调整操作,避免过度渲染。
滚动事件的处理:滚动事件可能会非常频繁地触发,节流可以限制滚动事件处理器的执行频率,提高性能。
使用场景: 比如: 监听滚动条,每隔一段时间计算一次位置

请添加图片描述

在定时器里面是无法清除定时器的,这是一个bug,在定时器外面可以清除,所以必须手动重置为null

封装节流

oBox.addEventListener("mousemove", _throttle(move, 500));function _throttle(fn, delay) {//默认进来调用一次fn.call(oBox);const mowTime = Date.now();return function () {if (fn.timeId) return;fn.timeId = setTimeout(() => {fn.call(this);// 在定时器里面是无法清除定时器的,这是一个bug,在外面可以清除clearTimeout(fn.timeId);// fn.timeId = null;}, delay);};
}
function _throttle2(fn, delay) {let now = Date.now();// 第一次进来,直接执行fn.call(oBox);// 第二次进来,判断是否超过了规定时间// 超过了规定时间,执行return function () {const t = Date.now() - now - delay;if (t >= 0) {fn.call(this);now = Date.now();}};
}

请添加图片描述
不手动重置定时器,触发是没反应的

总结

在这里插入图片描述

这篇关于原生js中的防抖节流笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101333

相关文章

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

JS 实现复制到剪贴板的几种方式小结

《JS实现复制到剪贴板的几种方式小结》本文主要介绍了JS实现复制到剪贴板的几种方式小结,包括ClipboardAPI和document.execCommand这两种方法,具有一定的参考价值,感兴趣的... 目录一、Clipboard API相关属性方法二、document.execCommand优点:缺点:

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

使用Vue.js报错:ReferenceError: “Vue is not defined“ 的原因与解决方案

《使用Vue.js报错:ReferenceError:“Vueisnotdefined“的原因与解决方案》在前端开发中,ReferenceError:Vueisnotdefined是一个常见... 目录一、错误描述二、错误成因分析三、解决方案1. 检查 vue.js 的引入方式2. 验证 npm 安装3.

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom