JS防抖节流函数的实现与使用场景

yizhihongxing

JS防抖节流函数的实现与使用场景

什么是JS防抖和节流?

  • 防抖:是指在一段时间内,多次触发同一事件,只执行一次函数。即当一连串的操作被触发时,只有最后一个操作被执行而前面的操作都被忽略了。
  • 节流:是指在一段时间内,多次触发同一事件,只执行一次函数。即在规定的时间内,重复触发只会响应一次,并阻止事件触发后一段时间内的操作。

防抖函数实现及使用场景

实现

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

防抖的原理是使用定时器,在规定时间内只执行一次函数,如果在规定时间内被多次调用,则会清除之前的计时器,重新开始计时。

使用场景

输入框实时搜索是常用的防抖场景。还有一些需要频繁操作DOM的事件,如窗口的调整、滚动条的移动等操作,为了防止频繁操作导致页面卡顿,可以使用防抖函数来控制事件的执行。

// 输入框实时搜索
const input = document.querySelector('#input')
input.addEventListener('input', debounce(function() {
  // 搜索相关逻辑
}, 500))

节流函数实现及使用场景

实现

Throttle

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

Throttle的原理是在规定时间内,防止函数无限制地执行,只有在规定时间之后才能触发下一次函数的执行。

Leading Throttle

function leadingThrottle(fn, delay) {
  let lastTime = 0, firstTime = true
  return function () {
    let now = Date.now()
    if (firstTime || (now - lastTime > delay)) {
      fn.apply(this, arguments)
      lastTime = now
      firstTime = false
    }
  }
}

Leading Throttle的特点是第一次调用立即执行,然后在规定时间内才能触发下一次函数执行。

Tailing Throttle

function trailingThrottle(fn, delay) {
  let lastTime = 0, timer = null
  return function () {
    let now = Date.now()
    let diff = now - lastTime
    if (diff >= delay) {
      clearTimeout(timer)
      timer = null
      lastTime = now
      fn.apply(this, arguments)
    } else if (!timer) {
      timer = setTimeout(() => {
        timer = null
        lastTime = Date.now()
        fn.apply(this, arguments)
      }, delay - diff)
    }
  }
}

Tailing Throttle和Leading Throttle不一样的地方在于,首次不会立即执行,而是在下一次执行的时候将上一次未执行的操作一起执行。

使用场景

在一些频繁触发的场景下使用节流函数能够减少函数执行的频率,从而提高页面性能。

// 窗口resize事件
window.addEventListener('resize', throttle(function() {
  // 处理DOM相关操作
}, 500))

在滚动时计算需要出现的元素数量时,使用Tailing Throttle能够在滚动结束时将所有需要出现的元素一起计算。

// 滚动时计算需要出现的元素数量
window.addEventListener('scroll', trailingThrottle(function() {
  // 计算需要出现的元素数量,并显示
}, 500))

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS防抖节流函数的实现与使用场景 - Python技术站

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

相关文章

  • 了解前端理论:rscss和rsjs

    了解前端理论:rscss和rsjs 什么是rscss? rscss的全称是“Reasonable System for CSS Stylesheet Structure”,中文翻译为“合理的CSS样式表结构系统”。它是一种CSS结构组织的方法论,旨在提供一种有条理、可维护的CSS编写方式。rscss的设计目标是: 可读性:易于阅读和理解的代码结构 可维护:容…

    JavaScript 2023年5月27日
    00
  • JS实现简单的键盘打字的效果

    让我们来讲解如何用JS实现简单的键盘打字效果。 分析思路 我们需要监听键盘的按键事件,当有键被按下时,我们获取到该键的对应字符,然后将该字符添加到页面上的一个文本区域中。同时,我们也需要记录已经输入的字符,方便后续的处理。 步骤 在HTML文件中创建一个文本区域,用于显示用户输入的字符。 <textarea id="input"&g…

    JavaScript 2023年5月28日
    00
  • JavaScript实现长图滚动效果

    下面是JavaScript实现长图滚动效果的完整攻略: 1. 原理介绍 实现长图滚动效果的原理是通过监听滚动事件来实现图片的滚动。具体来说,就是通过监测滚动事件中的scrollTop值来确定图片的位置,然后通过修改图片的位置来使其滚动。 2. 实现步骤 具体实现步骤如下: 2.1 HTML结构 先确定HTML结构,可以是一个包含多张图片的父元素。 <d…

    JavaScript 2023年6月11日
    00
  • 利用jsonp跨域调用百度js实现搜索框智能提示

    利用 JSONP 跨域调用百度 JS 实现搜索框智能提示是一个常见的前端开发技巧。本篇攻略将详细讲解 JSONP 的使用步骤以及相应的注意事项。 一、JSONP 的基础知识 JSONP(JSON with Padding)是一种跨域技术,它利用了 script 标签的跨域特性来实现。通常情况下,我们在同源代码中无法通过 AJAX 请求一个跨域的 API,这时…

    JavaScript 2023年5月27日
    00
  • JavaScript分秒倒计时器实现方法

    请看下面的详细讲解。 JavaScript分秒倒计时器实现方法 在网站或页面中经常需要倒计时功能,这就需要实现一个倒计时器。本文将介绍如何使用 JavaScript 实现一个分秒倒计时器。 实现方法 1. HTML 部分 首先我们来创建一个倒计时器标签。在 HTML 部分,我们使用 <div> 标签来放置倒计时器的数字。同时在 <head&…

    JavaScript 2023年6月11日
    00
  • JavaScript中的Function函数

    下面是关于JavaScript中的Function函数的完整攻略: 1. Function函数概述 Function函数是JavaScript中最基本的一种类型,使用Function函数可以将代码封装成一个可重复使用的函数,在代码执行时可以多次调用,从而提高代码的灵活性和复用性。一个Function函数实际上是一个对象,有具体的属性和方法供我们调用,同时也可…

    JavaScript 2023年5月27日
    00
  • JavaScript中的History历史对象

    当我们在浏览器中访问一个网页时,浏览器会自动记录下访问过的历史记录,这些历史记录在浏览器中可以用JavaScript的History对象进行访问和操作。下面是JavaScript中的History对象的详细讲解及相关示例说明。 History对象 History对象用来操作浏览器的历史记录,它保存着用户在当前窗口打开的所有页面的URL信息,可以通过Histo…

    JavaScript 2023年5月27日
    00
  • NodeJS有难度的面试题(能答对几个)

    下面我会详细讲解一下 “NodeJS有难度的面试题(能答对几个)” 的完整攻略。 1. Node.js的基础知识 在面试过程中,面试官通常会问到一些基础的 Node.js 知识,例如: Node.js 是什么? npm 是什么? 有什么用? 如何在 Node.js 中使用第三方模块? 什么是模块? 如何定义并导入模块? 针对这些问题,你需要先通过自学文档以及…

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