web项目开发之JS函数防抖与节流示例代码

yizhihongxing

下面来详细讲解“web项目开发之JS函数防抖与节流示例代码”的完整攻略。

什么是函数防抖和节流

在理解函数防抖和节流之前,先来看一下JS中的函数执行机制。当你在页面中注册了一个事件处理函数后,当相应事件被触发时会不断地调用该函数。然而,有时候你可能会希望函数的执行可以控制到你期望的频率或时间间隔以内,这时就需要用到函数防抖和函数节流。

函数防抖的目的是为了避免函数的过度执行,比如当用户频繁操作一个按钮时,如果不采用函数防抖,那么每次操作都会触发该按钮的事件处理函数,导致浏览器的CPU负载过高,影响浏览器的性能。函数节流的目的也是为了控制函数的执行频率,但是采用的方式与函数防抖略有不同,它会使函数在一段时间内只执行一次,而不是一直等待上一个函数执行完成,效果类似于定时器。

函数防抖的代码实现

函数防抖的实现方法是当事件被触发时,设置一个定时器,在指定的时间间隔过后再去执行该处理函数,如果在这个时间段内再次触发事件,则会清除之前的定时器,并重新设置一个新的定时器,如此循环,从而达到控制触发频率的效果。

下面是基于原生JS实现的函数防抖的代码示例:

function debounce(func, delay) {
  let timeout;
  return function() {
    const context = this;
    const args = arguments;
    clearTimeout(timeout);
    timeout = setTimeout(() => {
      func.apply(context, args);
    }, delay);
  };
}

// 用法示例
function handleInput() {
  // 处理用户输入
}

document.querySelector('input').addEventListener('input', debounce(handleInput, 500));

上面的代码中,我们定义了debounce函数,它实际上是一个高阶函数,接收一个处理函数和一个时间间隔作为参数,返回一个新的函数。新的函数在触发时会先清除上一次设置的定时器,然后再创建一个新的定时器,最终在指定的时间间隔过后执行原来的处理函数。

函数节流的代码实现

函数节流的实现方法是使用一个变量来记录上一次执行函数的时间戳,每次执行函数时,先判断当前时间戳和上一次执行时间戳的间隔,如果大于指定的时间间隔,则执行函数并更新记录的时间戳,否则不执行。这样就可以控制函数的执行频率,避免过度执行。

下面是基于原生JS实现的函数节流的代码示例:

function throttle(func, interval) {
  let lastTime = 0;
  return function() {
    const nowTime = new Date().getTime();
    if (nowTime - lastTime > interval) {
      func.apply(this, arguments);
      lastTime = nowTime;
    }
  };
}

// 用法示例
function handleInput() {
  // 处理用户输入
}

document.querySelector('input').addEventListener('input', throttle(handleInput, 500));

上面的代码中,我们定义了throttle函数,也是一个高阶函数。该函数接收一个处理函数和一个时间间隔作为参数,返回一个新的函数。在新的函数中我们使用了一个变量lastTime来记录上一次执行的时间戳,每当新的函数被触发时,会通过new Date().getTime()获取当前时间戳,并判断与上一次执行时间戳的间隔是否大于指定的时间间隔,从而控制是否执行函数。

示例说明

示例1:防抖实现

首先,我们来看一个实际应用中使用函数防抖的场景。比如,你有一个查询输入框,当用户输入查询条件时,需要将该条件提交给服务器进行查询,但是如果用户连续输入多个关键字,则会频繁地发送请求,显然这是不可取的。这时候我们就可以使用函数防抖来控制查询请求的触发频率。

在下面的示例中,我们对该查询输入框绑定了一个input事件,每当用户输入时,会触发我们定义的handleInput函数,但是由于我们对该函数进行了防抖处理,所以只有当用户停止输入500ms后才会真正地执行该函数,也就是只有当用户已经输入完整个查询条件后,我们才会将该条件提交给服务器进行查询操作。

function debounce(func, delay) {
  let timeout;
  return function() {
    const context = this;
    const args = arguments;
    clearTimeout(timeout);
    timeout = setTimeout(() => {
      func.apply(context, args);
    }, delay);
  };
}

function handleInput() {
  const query = document.querySelector('input').value;
  // 执行查询操作
}

document.querySelector('input').addEventListener('input', debounce(handleInput, 500));

示例2:节流实现

接下来,我们再来看一个使用函数节流的场景。假设你有一个滚动条,每当用户滚动时,需要执行一些操作,但是由于滚动的过程非常快,所以函数也会被连续执行多次,此时我们可以使用函数节流来控制函数执行的频率。

在下面的示例中,我们对该滚动条绑定了一个scroll事件,每当用户滚动时,会触发我们定义的handleScroll函数,由于我们对该函数进行了节流处理,所以在500ms内,该函数只会被执行一次,从而达到了控制函数执行频率的效果。

function throttle(func, interval) {
  let lastTime = 0;
  return function() {
    const nowTime = new Date().getTime();
    if (nowTime - lastTime > interval) {
      func.apply(this, arguments);
      lastTime = nowTime;
    }
  };
}

function handleScroll() {
  // 执行一些操作
}

document.querySelector('div').addEventListener('scroll', throttle(handleScroll, 500));

以上是“web项目开发之JS函数防抖与节流示例代码”的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:web项目开发之JS函数防抖与节流示例代码 - Python技术站

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

相关文章

  • JavaScript数组reduce常见实例方法

    下面是关于JavaScript数组reduce方法的一些详细讲解和两个示例说明。 什么是reduce方法 reduce 是 JavaScript 数组中的一个高阶函数,作用是将数组中的所有元素通过指定函数进行归纳,最终返回一个单一的值。这个指定函数接收两个参数:累加器和当前值。 reduce 语法: array.reduce(function(accumul…

    JavaScript 2023年5月27日
    00
  • JavaScript面试Module Federation实现原理详解

    JavaScript面试Module Federation实现原理详解 前言 Module Federation是Webpack5中的一个新功能,它可以让多个独立的Webpack构建之间共享模块。在微服务和跨团队开发中,它非常有用。本文将详细介绍Module Federation的实现原理和使用方法。 Module Federation实现原理 Module…

    JavaScript 2023年6月10日
    00
  • 解读Java和JavaScript区别与联系

    解读Java和JavaScript区别与联系 Java(简称Java语言)是由Sun Microsystems公司于1995年5月推出的高级编程语言,被广泛用于Web开发、移动应用开发、桌面应用开发、游戏开发等多个方向。 JavaScript(简称JS)是一种脚本语言,最初用于Web前端交互式设计,后来广泛应用于客户端/服务器端应用程序、游戏开发等领域。 区…

    JavaScript 2023年5月18日
    00
  • 小程序实现计时器功能

    下面是“小程序实现计时器功能”的完整攻略: 1. 准备工作 在开始编写计时器功能之前,需要先创建一个小程序项目,并在页面中引入 wx.createInnerAudioContext() 实现计时结束后的声音提示。 2. 计时器实现 2.1 变量定义和初始值设置 首先,需要在 data 中定义计时器相关的变量,例如当前计时器的状态、计时器显示的时间等: dat…

    JavaScript 2023年6月11日
    00
  • 关于Jackson的JSON工具类封装 JsonUtils用法

    下面是关于Jackson的JSON工具类封装JsonUtils的完整攻略: 1. 什么是Jackson库 Jackson是一个Java库,用于在Java对象和JSON格式之间进行转换。它提供了一组完整的处理JSON数据的工具,包括将Java对象序列化为JSON格式、将JSON格式反序列化为Java对象、对JSON格式进行解析和生成、支持JSON数组和XML等…

    JavaScript 2023年5月27日
    00
  • javascript函数的节流[throttle]与防抖[debounce]

    JavaScript函数的节流与防抖 在javascript开发中,有时候我们需要在频繁触发某些事件时,进行性能优化,防止事件处理函数被频繁调用而导致页面出现性能问题,这时,javascript的节流和防抖技术就能派上用场了。 什么是节流 节流(throttle)是一种控制事件触发频率的技术,它会将一定时间内发生的多次事件,限制成只触发一次事件。 具体来说,…

    JavaScript 2023年6月11日
    00
  • JS课堂笔记(4.11-4.16)

    一、简单了解JS 1. JavaScript(简称JS)是作为开发Web页面的脚本语言。 2. JS是从1995年由网景公司的布兰德开发。 3. JavaScript的标准是ECMAScript。 4. JS代码是从上往下执行的。  二、变量 1. 变量名的值可以重复赋值(值可以修改),变量可以重复声明。 2. JS中“+”号很特殊,只要是和字符串相加都会变…

    JavaScript 2023年4月22日
    00
  • 将JSON字符串转换成Map对象的方法

    要将JSON字符串转换成Map对象,可以使用Java中的JSON库,例如FastJson、Gson等。以下是将JSON字符串转换成Map对象的详细攻略。 准备工作 首先需要引入JSON库的依赖,以FastJson为例,Maven的依赖配置如下: <dependency> <groupId>com.alibaba</groupId…

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