JavaScript 防抖和节流详解

yizhihongxing

JavaScript 防抖和节流详解

前言

在 JavaScript 开发中,我们经常会遇到一些高频触发的事件,如 resize、scroll、input等,这些事件在触发时由于其高频次和高并发性,往往会造成网页的性能问题,影响用户体验。所以我们需要一些手段来限制这些事件的触发次数、缩短响应间隔,以避免过度渲染,浪费资源等性能问题。

常见的限制高频触发的方法,有防抖和节流两种,他们可以帮助我们在一定程度上减少不必要的重复的 DOM 渲染及一些函数的运算次数,从而提升页面的性能。

本文将详细介绍什么是防抖和节流,以及如何实现它们。

防抖

定义

防抖是指在事件触发的 n 秒后,执行一次函数,若在这 n 秒内又触发了事件,则重新计时。

应用场景

常用于用户输入,交互按钮等高频触发事件。

实现

function debounce(fn, delay) {
  let timer = null;
  return function() {
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, arguments);
    }, delay);
  };
}

实现原理:每次事件触发时,清除计时器,再次开启定时器,延迟执行待执行的函数。

示例

<input type="text" id="input" />
<script>
  function handleInput() {
    console.log('发起请求');
  }
  const debounceHandleInput = debounce(handleInput, 500);
  document.getElementById('input').addEventListener('input', debounceHandleInput);
</script>

在输入框中不断输入,会发现当停止输入超过 500ms 后才会显示“发起请求”。

节流

定义

节流是指在事件触发后的 n 秒内,只执行一次函数,若在这 n 秒内又触发了事件,则会被忽略。

应用场景

常用于高频触发的事件,如用户滚动页面、mousemove 等。

实现

function throttle(fn, delay) {
  let lastTime = 0;
  return function() {
    let nowTime = Date.now();
    if (nowTime - lastTime > delay) {
      fn.apply(this, arguments);
      lastTime = nowTime;
    }
  };
}

实现原理:使用时间戳记录当前事件触发的时间,当当前时间距离上一次触发的时间小于规定时间时,节流会忽略该事件请求。

示例

<div style="height: 3000px"></div>
<script>
  function handleScroll() {
    console.log('触发');
  }
  const throttleHandleScroll = throttle(handleScroll, 500);
  window.addEventListener('scroll', throttleHandleScroll);
</script>

在页面滚动时,可以通过控制台发现,函数只会在每 500ms 执行一次,避免了过多的函数的执行。

结论

本文介绍了防抖和节流的定义、应用场景及实现方式,并提供了防抖和节流的两个示例。当在开发中遇到需要控制事件触发次数和响应间隔时,可以使用防抖和节流等方法优化页面性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript 防抖和节流详解 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • window.print()打印html网页的两种方法实现

    当我们在网页中呈现出需要打印的内容时,有时会需要将这些内容打印出来,在这时,我们可以使用 JavaScript 中的 window.print() 方法来实现网页打印功能。本篇文章将详细讲解“window.print()打印html网页的两种方法实现”的完整攻略。 一、使用 window.print() 方法实现网页打印功能 window.print() 方…

    JavaScript 2023年5月28日
    00
  • JS实现运动缓冲效果的封装函数示例

    JS实现运动缓冲效果是前端开发中常见的问题之一。我们可以封装一个函数来实现这个效果,方便快捷地进行运动缓冲效果的实现。 函数封装过程 封装函数涉及到一些关键的概念: 运动开始点 运动结束点 运动距离 运动时间 每一帧的运动距离 运动速度 缓冲系数 基于上述概念,简单描述实现运动缓冲效果的封装函数示例的攻略如下: 确定函数参数 封装函数需要定义函数的参数,以便…

    JavaScript 2023年6月11日
    00
  • 详谈js中window.location.search的用法和作用

    下面我将详细讲解“详谈js中window.location.search的用法和作用”的完整攻略。 什么是window.location.search? 在浏览器中,window.location对象包含了当前页面的地址信息。window.location.search表示URL中?字符后面的参数部分,这个参数部分通常被称为查询参数(query string…

    JavaScript 2023年6月11日
    00
  • JavaScript将数字转换成大写中文的方法

    将数字转换成大写中文是个很实用的功能,在前端开发中经常会遇到这样的需求。以下是详细的攻略: 方案一:使用中文数字字典映射 将数字转换成大写中文可以先通过一个中文数字字典进行映射,然后依次读取数字,并获取对应的中文数字,最后将其拼接成一个字符串即可。 以JavaScript为例,可以编写以下代码: function convertToChinese(num) …

    JavaScript 2023年6月11日
    00
  • javascript的动态加载、缓存、更新以及复用(一)

    JavaScript 动态加载、缓存、更新以及复用(一) JavaScript 的动态加载、缓存、更新以及复用是优化前端性能的重要手段。下面将为你详细讲解如何实现。 动态加载 JavaScript 的动态加载可以提高网站的性能,并且在某些情况下可以实现更好的网站交互体验。 在 HTML 文件中动态加载 JavaScript 文件 可以通过在 HTML 文件中…

    JavaScript 2023年5月27日
    00
  • javascript 易错知识点实例小结

    JavaScript 易错知识点实例小结 在编写 JavaScript 代码的过程中,会遇到一些易错的知识点,可能会导致出现预期外的结果,甚至是程序的崩溃。因此,我们需要了解这些易错知识点,并采取正确的措施避免这些问题的发生。在本文中,我们将详细讲解 JavaScript 易错知识点,并提供实例来帮助读者更好地理解。 目录 变量提升 this 关键字 闭包 …

    JavaScript 2023年6月10日
    00
  • JavaScript实现余额数字滚动效果

    下面我将详细讲解如何使用JS实现余额数字滚动效果。 什么是余额数字滚动效果? 余额数字滚动效果是指在页面中展示一个数值,例如用户的账户余额,数字从低到高逐渐滚动显示出来。这种效果可以增加页面的生动性和用户交互性,提升用户体验。 实现余额数字滚动效果的步骤 以下是实现余额数字滚动效果的主要步骤: 获取要展示的数字 将数字转化为每一位数字的数组 创建一个展示数字…

    JavaScript 2023年6月11日
    00
  • 10个比较流行的JavaScript面试题

    这里是关于“10个比较流行的JavaScript面试题”的完整攻略: 1. 什么是变量提升 变量提升是JavaScript语言中的一种特性,它让变量可以在声明之前使用。在JavaScript代码执行前,变量的声明会被“提升”到代码的顶端。这意味着即使在变量声明之前使用变量,JavaScript引擎也会在代码执行时正常处理它。 示例: console.log(…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部