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

下面来详细讲解“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日

相关文章

  • Js 获取HTML DOM节点元素的方法小结

    那么首先介绍一下什么是DOM。 DOM简介 DOM,即文档对象模型(Document Object Model),是一种针对XML但经过扩展用于HTML的应用程序编程接口(API)。它为访问和操作HTML或XML文件提供了一种特定的结构化方式,使得开发者可以对文档的内容和结构进行添加、修改、删除或查找等操作。 Js 获取HTML DOM节点元素的方法小结 在…

    JavaScript 2023年6月10日
    00
  • vue 获取url里参数的两种方法小结

    下面我将为您详细讲解“vue 获取url里参数的两种方法小结”的完整攻略。 一、 获取参数的两种方法 方法一:使用正则表达式 这种方法需要使用正则表达式来获取url里的参数,步骤如下: 获取当前页面的url let url = window.location.href; 编写正则表达式,获取url里的参数 假设我们要获取名为“id”的参数,正则表达式如下: …

    JavaScript 2023年6月11日
    00
  • JS基于Ajax实现的网页Loading效果代码

    下面提供一份“JS基于Ajax实现的网页Loading效果代码”的攻略,共分为以下几个步骤。 步骤一:创建HTML文件和CSS文件 首先,我们需要创建一个基础的 HTML 文件和对应的 CSS 文件。HTML 文件中包含了页面常规结构,如头部、导航、内容等,并且在内容部分添加一个 div 元素来承载我们的 Loading 效果。CSS 文件中包含了页面元素的…

    JavaScript 2023年6月11日
    00
  • Javascript中的delete介绍

    当我们在JavaScript中创建一个对象或者函数时,它们都会被存储在内存中,而使用 delete 关键字可以删除对象的某个属性或者函数。本文将详细讲解 delete 的用法,以及可能会遇到的问题。 语法 delete object.propertyName delete object[expression] delete object.functionNa…

    JavaScript 2023年6月10日
    00
  • javascript中使用正则表达式进行字符串验证示例

    首先,让我们来介绍JavaScript正则表达式。正则表达式是一种用于匹配文本模式的工具,JavaScript中的正则表达式使用RegExp对象来创建,并可以通过正则表达式字面量或RegExp构造函数来定义。 在JavaScript中使用正则表达式进行字符串验证有很多应用,例如对输入的内容进行格式检查、密码校验、邮箱格式验证等。 接下来我们将介绍如何通过正则…

    JavaScript 2023年5月28日
    00
  • js内存泄漏场景、如何监控及分析详解

    JS内存泄漏场景、如何监控及分析详解 什么是JS内存泄漏? JS内存泄漏是指在代码中,一些不再需要的对象仍然存在于内存中,却没有被正确地释放,最终导致内存不足、程序崩溃等问题。常见的内存泄漏场景有如下几个: 全局变量:在全局环境中定义的变量、函数、对象等,没有被垃圾回收机制清除,会一直存在于内存中。 定时器:使用setInterval和setTimeout定…

    JavaScript 2023年6月10日
    00
  • 详解JavaScript实现哈希表

    详解JavaScript实现哈希表 什么是哈希表 哈希表是一种常见的数据结构,它可以提供快速的插入、查找和删除操作,其时间复杂度为 O(1) 。 哈希表的主要思想是将数据元素经过哈希(hash)函数的映射后,存储到一个数组中。哈希函数 将插入的元素映射到一个数组下标上,这个下标对应的元素就是这个元素所对应的值。在查找时,再使用同样的哈希函数,得到元素所对应的…

    JavaScript 2023年5月18日
    00
  • 详解在Javascript中进行面向切面编程

    下面我将详细讲解在Javascript中进行面向切面编程的完整攻略。 什么是面向切面编程 在介绍如何在Javascript中进行面向切面编程之前,我们先来了解一下什么是面向切面编程(Aspect-Oriented Programming,简称AOP)。 AOP是一种编程思想,它可以对横跨多个模块的代码进行集中式管理。在AOP中,我们可以通过切面来描述一个横跨…

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