网页性能优化04-函数节流

2024-09-02 15:48

本文主要是介绍网页性能优化04-函数节流,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

函数节流(throttle)

1-函数节流介绍

  • 1.先理解什么是js中的高频事件
    • 高频事件 : 触发频率极高的事件。例如 滚动条事件onscroll 鼠标移动onmousemove 网页大小变化onresize等
      • 高频触发:事件本身不是高频的,但是用户可以通过很快的手速来触发。例如用户疯狂快速点击 抢购按钮(onclick,onmousedown)

在这里插入图片描述

  • 2.高频事件的危害

    • a.浪费资源,降低网页速度,甚至导致浏览器卡死:由于高频事件触发非常频繁,可能1秒钟会执行几十次甚至上百次,如果在这些函数内部,又调用了其他函数,尤其是操作了DOM (DOM操作耗性能且可能导致浏览器出现回流) ,不仅仅会降低整个网页的运行速度,甚至会造成浏览器卡死,崩溃。
    • b.网络堵塞 : 如果在高频事件中,进行了重复的ajax请求,可能会导致请求数据出现混乱,并且还占用服务器带宽增加服务器压力 (间接增加服务器成本)
  • 3.函数节流介绍(throttle)

    • 函数节流:限制事件处理函数的执行周期。
      • 例如:鼠标点击事件,限制0.5s内只能被触发一次。 无论你点击有多快,0.5s也只会执行一次。

2-函数节流解决思路

限制事件处理函数的执行周期

  • 1.声明变量 记录上一次 触发时间 (默认为0,保证事件第一次无条件触发)
  • 2.触发时间时:判断现在的时间 和 上一次时间 的间隔是否大于 节流间隔
  • 3.成功触发后 : 将现在的时间 变成 下一次时间 的参考时间
    • 现任女友已经结束了, 她已经成为下一任女友 故事里的 前任女友
//函数节流1 : 声明变量记录上一次事件触发时间var lastTime = 0;//1.1 鼠标移动事件var i = 0;window.onmousemove = function () {//函数节流2 : 判断触发时间间隔 (0.5秒 = 500ms)var currentTime = new Date().getTime(); //当前时间if (currentTime - lastTime > 500) {//事件处理函数i++;console.log('鼠标移动事件被触发' + i + '次');//函数节流3 : 事件成功触发之后,当前时间 成为 下一次触发间隔参考时间//说人话:现任女友已经结束了, 她已经成为下一任女友 故事里的 前任女友 lastTime = currentTime;};};

在这里插入图片描述

3.万能节流函数的封装

  • 为什么要封装万能的节流函数
    • 在上一个小节中,我们的重点是介绍函数节流的思路。但是在实际开发中,每一个节流函数的事件处理都是不一样的,他们可能是鼠标移入、鼠标移出、鼠标移动。 每一个案例需要的节流间隔也不同
/**
* @description: 函数节流
* @param {type} fn: 事件处理函数
* @param {type} timeout: 节流间隔
* @return: 
*/
function throttle(fn, timeout) {/*核心技术介绍 1. 函数节流需要使用变量来存储  上一次触发时间2. 这个变量如果是局部变量 : 则函数完毕会被回收。 如果是全局变量:则会造成全局变量污染3.解决方案 : 利用函数本身也是对象,使用函数本身的静态成员来存储 上一次触发时间*///给throttle添加静态成员lastTimeif(!throttle.lastTime){/* 为什么一定要有这一步呢?因为函数对象的属性不存在时,默认取值会得到undefined,而undefined在做数学计算的时候会转成number类型得到NaN. Number(undefined) 结果是NaN。无法计算*/throttle.lastTime = 0;};//1.记录当前时间var currentTime = new Date().getTime();//2.判断触发时间间隔if (currentTime - throttle.lastTime > timeout) {fn();//3.将当前时间作为 下一次触发时间 参考时间throttle.lastTime = currentTime;};
};
//1.2 滚动条事件
var j = 0;
window.onscroll = function () {//节流函数 : 滚动条 0.5s 只会执行一次throttle(function () {j++;console.log('滚动事件被触发' + j + '次');}, 500);
};//2. 高频触发 :事件本身触发不频繁, 但是用户可以通过疯狂触发来实现高频
var btn = document.querySelector('#btn');
var p1 = document.querySelector('#p1');
var k = 0;
btn.onclick = function () {//节流函数 : 按钮1s 只能点击一次throttle(function () {k++;p1.innerText = '点击事件被触发' + k + '次';}, 1000);
};

这篇关于网页性能优化04-函数节流的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k