JavaScript 防抖和节流详解

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日

相关文章

  • 微信小程序 生命周期和页面的生命周期详细介绍

    下面详细讲解一下微信小程序的生命周期和页面的生命周期: 微信小程序生命周期介绍 微信小程序生命周期分为两个部分:全局生命周期和页面生命周期。全局生命周期是指在整个小程序中被执行的方法,而页面生命周期则是指在页面中被执行的方法。 全局生命周期 全局生命周期包含以下方法: 1. onLaunch(options) 在小程序初始化完成时执行,只会执行一次。 参数说…

    JavaScript 2023年6月11日
    00
  • js前端解决跨域的八种实现方案

    下面是详细的“js前端解决跨域的八种实现方案”的攻略。 什么是跨域 浏览器出于安全考虑,不允许跨域访问数据。例如,a.com下一个网页,可以轻松访问a.com下其他网页中的数据。但是,如果想要访问b.com下的数据,就需要进行跨域访问。跨域指的是指向不同域名的请求。比如,不同域名之间的交互访问就算是跨域访问。 前端跨域解决方案 1. JSONP JSONP(…

    JavaScript 2023年5月27日
    00
  • networkInformation.downlink测用户网速方法详解

    networkInformation.downlink测用户网速方法详解 在当前移动互联网时代,提高用户体验成为互联网公司重中之重,而给用户提供良好的网速体验则是其中关键之一。在前端开发中,我们可以使用 networkInformation.downlink 对用户的网速进行测量,从而更好的优化页面加载速度和改善用户体验。 什么是networkInforma…

    JavaScript 2023年6月11日
    00
  • 原生JS实现循环Nodelist Dom列表的4种方式示例

    原生JS实现循环Nodelist Dom列表的4种方式示例的完整攻略如下: 1. 使用for循环遍历Nodelist 可以使用常规的for循环来遍历Nodelist。要遍历Nodelist的所有项,需要使用nodelist.length属性,并使用nodelist.item(index)方法来访问单个元素。 const nodeList = document…

    JavaScript 2023年6月10日
    00
  • Vue项目全局配置微信分享思路详解

    “Vue项目全局配置微信分享思路详解”是一篇关于Vue项目中如何全局配置微信分享的攻略。下面我将详细讲解该攻略的完整思路和步骤。 标题 首先,我们需要在页面中引入微信的JS-SDK,获取微信的appid、noncestr、timestamp、signature等参数。在Vue项目中,通常使用axios进行网络请求,获取JS-SDK配置参数的代码如下所示: i…

    JavaScript 2023年6月11日
    00
  • Java matches类,Pattern类及matcher类用法示例

    Java中的matches、Pattern和Matcher类一起可以实现Java中正则表达式的匹配操作。 matches类是String类的一种方法,在Java中用于测试字符串是否与指定的正则表达式匹配。如果匹配则返回true,否则返回false。 Pattern类是Java中正则表达式的编译表示。可以把一个正则表达式编译成Pattern对象,然后可以使用P…

    JavaScript 2023年6月10日
    00
  • js中获取事件对象的方法小结

    请允许我为你提供详细的攻略。 获取事件对象的方法小结 在javascript中,当我们需要对网页上的DOM元素实现交互时,就需要获取事件对象。常见的方法有以下几种: 1. 传参方式获取 传参方式获取事件对象,是一种简单直接的方式。当事件触发时,我们可以将事件对象作为参数传递给监听函数。 <button onclick="myFunction(…

    JavaScript 2023年5月27日
    00
  • JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享

    下面是详细讲解“JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享”的攻略。 1. 确定时间差 在实现几分钟前、几小时前、几天前等时间差显示效果之前,首先需要确定时间差。通常我们可以通过获取当前时间和要计算的时间之间的毫秒数,然后将其转换为对应的时间差。 var now = new Date().getTime(); // 当前时…

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