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日

相关文章

  • JavaScript获取当前cpu使用率的方法

    获取当前CPU使用率可以通过编写JavaScript代码调用操作系统API来实现。不过需要注意的是,由于JavaScript的运行环境通常是浏览器中,所以获取CPU使用率的能力对不同浏览器有一定的差异,下面我将介绍两种获取CPU使用率的方法: 方法一:基于Performance API Performance API 是浏览器内置的一个性能指标 API,可以…

    JavaScript 2023年6月11日
    00
  • JavaScript中使用concat()方法拼接字符串的教程

    当我们需要在JavaScript中拼接多个字符串时,可以使用concat()方法。该方法将传递给它的字符串与原始字符串连接起来,并返回新的字符串,而不改变原始字符串。下面是使用concat()方法拼接字符串的完整攻略: 使用concat()方法拼接字符串的步骤: 步骤1:创建要拼接的字符串 在使用concat()方法之前,我们需要先定义要拼接的字符串。可以将…

    JavaScript 2023年5月28日
    00
  • JS中准确判断变量类型的方法

    当我们在编写JavaScript代码时,经常需要对不同的变量类型做出不同的操作。因此,准确判断变量类型是非常重要的一项技能。本文将分享几种JS中准确判断变量类型的方法,并提供两条示例进行演示。 使用typeof运算符判断变量类型 typeof运算符可以返回一个变量的数据类型,例如:字符串、数字、布尔值、对象、undefined和function六种。使用ty…

    JavaScript 2023年5月28日
    00
  • JS实现获取当前URL和来源URL的方法

    获取当前URL和来源URL是一项常见的技术需求,本文将介绍JS实现该功能的方法。 获取当前URL的方法 获取当前URL可以使用window.location属性,该属性包含了URL的各种组成部分,如协议、主机名、路径等。示例代码如下: var currentUrl = window.location.href; console.log(currentUrl)…

    JavaScript 2023年5月28日
    00
  • 原生js实现轮播图的示例代码

    让我们一步步讲解如何使用原生JS实现轮播图。在开始之前,请确保你已经了解了HTML、CSS和基础的JavaScript知识。 1. HTML结构 首先,我们需要在HTML文件中创建我们的轮播图结构。下面是一个基本的例子: <div class="slider"> <div class="slides"…

    JavaScript 2023年6月10日
    00
  • JS面向对象编程实现的拖拽功能案例详解

    JS面向对象编程实现的拖拽功能案例,可以分为以下几个步骤: 1. 确定目标 首先要明确要实现的功能,即拖拽功能,定义需要拖拽的元素和拖拽的位置。 示例代码: let box = document.querySelector(‘.box’); // 需要拖拽的元素 let mouseX = 0; // 鼠标在x轴上的位置 let mouseY = 0; // …

    JavaScript 2023年5月28日
    00
  • Javascript实现倒计时时差效果

    实现倒计时时差效果可以通过Javascript编写代码来实现。以下是详细的步骤: 1. HTML结构 首先需要在HTML文件中定义一个元素用于显示倒计时,例如: <div class="countdown-timer"></div> 2. CSS样式 接下来需要为元素添加一些CSS样式,用于设置显示倒计时的样式,例…

    JavaScript 2023年5月27日
    00
  • AJAX在GB2312的中文编码传输 AJAX特殊字符编码正确方法

    AJAX(Asynchronous JavaScript and XML)是一种在不重新加载页面的情况下从服务器异步获取数据的技术。在Ajax请求中,中文传输时需要注意编码的问题。在GB2312编码中,中文会以两个字节进行编码,而某些非中文字符则只使用一个字节,这可能会导致接收方在解析数据时出现混乱。以下是AJAX在GB2312编码中文传输的完整攻略: 步骤…

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