JavaScript防抖动与节流处理

yizhihongxing

JavaScript中防抖动和节流是常用的优化技术,用于优化页面交互和性能,下面将详细介绍防抖动和节流的实现原理以及应用场景。

什么是防抖动

在JavaScript处理页面事件时,比如按钮点击事件,如果用户频繁点击,则会导致事件的重复执行,从而浪费资源并影响用户体验。防抖动的作用是将这些重复的事件的执行合并为一次执行,从而优化页面性能。

实现原理:防抖动的原理是,设置一个定时器,延迟一段时间执行事件处理函数,如果该事件在延迟时间内再次触发,就重新设置定时器,直到延迟时间到达后,执行一次事件处理函数。

以下是一个简单的防抖动实现代码:

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

上述代码使用闭包保存定时器,每次执行事件处理函数前先清除之前设置的定时器,再设置一个新的定时器。这样当连续触发事件时,只有最后一次触发事件会执行事件处理函数。

下面是一个例子,用防抖动优化用户搜索输入框:

<input id="searchInput" type="text">

<script>
const searchInput = document.getElementById('searchInput');

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

function search() {
  console.log('search');
}

searchInput.addEventListener('input', debounce(search, 500));
</script>

上述代码中,将search函数使用防抖动函数包装,用户在输入搜索内容时,只有在输入停止500毫秒后才会执行搜索功能。这样可以优化用户体验以及减少不必要的请求。

什么是节流

在JavaScript处理页面事件时,比如滚动事件,如果处理函数非常耗费资源,如果在每次事件触发时都执行事件处理函数,会造成浏览器卡顿或崩溃。而节流的作用是,限制事件处理函数的执行频率,从而优化页面性能。

实现原理:节流的原理是,设置一个定时器,在规定时间内只执行一次事件处理函数,如果成功执行该次事件,则继续执行下一次任务,否则等待下一次触发事件的时间到达时执行事件处理函数。

以下是一个简单的节流实现代码:

function throttle(fn, delay) {
  let timer = null;
  return function(...args) {
    if (!timer) {
      timer = setTimeout(() => {
        fn.apply(this, args);
        timer = null; 
      }, delay);
    }
  };
}

上述代码使用闭包保存定时器,每次执行事件处理函数前先检查是否存在未执行的定时器,如果存在则返回,如果不存在则执行事件处理函数,并设置一个定时器,以延迟执行下一个任务。

下面是一个例子,使用节流优化用户滚动事件:

<div id="scrollBox">
  <p>Scroll down to see the effect.</p>
  <ul id="list">
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
    <li>Item 4</li>
    <li>Item 5</li>
    <li>Item 6</li>
    <li>Item 7</li>
    <li>Item 8</li>
    <li>Item 9</li>
    <li>Item 10</li>
  </ul>
</div>

<script>
const scrollBox = document.getElementById('scrollBox');
const list = document.getElementById('list');

function throttle(fn, delay) {
  let timer = null;
  return function(...args) {
    if (!timer) {
      timer = setTimeout(() => {
        fn.apply(this, args);
        timer = null; 
      }, delay);
    }
  };
}

function handleScroll() {
  console.log('scroll');
}

scrollBox.addEventListener('scroll', throttle(handleScroll, 200));
</script>

上述代码中,将handleScroll函数使用节流函数包装,用户滚动时,只有在200毫秒内执行一次滚动事件,这样可以减少浏览器负担,提高用户体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript防抖动与节流处理 - Python技术站

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

相关文章

  • JS实现手写 forEach算法示例

    当我们需要在JavaScript中对数组中的每个元素进行操作时,可以使用forEach方法。但是,如果我们想要深入了解forEach方法的实现过程,那么我们可以使用手写forEach算法来了解它的原理。 实现步骤 首先,我们需要明确手写forEach算法的实现步骤: (1)接收一个数组和一个回调函数作为参数; (2)依次遍历数组中的每个元素; (3)对每个元…

    JavaScript 2023年5月28日
    00
  • 原生js仿jquery实现对Ajax的封装

    下面是“原生js仿jquery实现对Ajax的封装”的完整攻略。 一、准备工作 在编写封装函数之前,我们需要首先准备好相关的环境和资源,包括: 一个封装Ajax的函数(我们将在下面进行编写) 一个浏览器环境,可以使用Chrome浏览器、Firefox浏览器等 一个文本编辑器,可以使用Sublime Text、Visual Studio Code等 一份API…

    JavaScript 2023年6月11日
    00
  • BOM与DOM的区别分析

    BOM与DOM的区别分析 在 Web 开发中,BOM(浏览器对象模型)和 DOM(文档对象模型)都是非常重要的概念。BOM 和 DOM 作为 Web 应用程序中最核心的对象模型之一,它们的区别可能并不明显,本文将详细讲解 BOM 与 DOM 的区别分析。 什么是 BOM? BOM 是浏览器对象模型的缩写,是 JavaScript 和浏览器之间的接口,提供了一…

    JavaScript 2023年6月10日
    00
  • JS实现一个文件选择组件详解

    这里是关于 “JS实现一个文件选择组件详解”的攻略: 概述 本文将介绍如何使用 JavaScript 实现一个文件选择组件,包括 HTML、CSS 和 JavaScript 三个方面。通过阅读本文,您将学习到如何构建一个可以选择单个或多个文件的文件选择组件,并了解如何通过事件处理程序获取用户选择的文件。 HTML 首先,需要在 HTML 页面中创建一个 in…

    JavaScript 2023年5月27日
    00
  • 浅析JavaScript中的对象类型Object

    下面我将详细讲解“浅析JavaScript中的对象类型Object”的完整攻略。 1. 什么是对象? 对象是 JavaScript 的核心数据类型之一,它是一组属性的集合,每个属性都由键值对组成。其中,键是字符串类型,值可以是任何数据类型,也可以是另一个对象。对象是使用大括号{}定义的。 例如,以下就是一个简单的对象: let person = { name…

    JavaScript 2023年5月27日
    00
  • es6 filter() 数组过滤方法总结

    标题:ES6 filter() 数组过滤方法总结 介绍:在ES6中,filter()是一个常用的数组方法,它可以根据指定的条件来过滤数组元素。本文将详细讲解ES6中的filter()方法,包括其参数和用法,同时提供两个实际的示例来帮助读者更好地理解。 正文: 参数和用法 ES6中的filter()方法接受一个回调函数作为参数,回调函数可以接受三个参数,分别是…

    JavaScript 2023年5月27日
    00
  • 理解Javascript_06_理解对象的创建过程

    理解Javascript_06_理解对象的创建过程 在JavaScript中,对象是一个重要的概念,通常我们通过对象来存储和组织相关的数据和功能。当我们在JavaScript中声明对象时,JavaScript会完成一些工作来创建这个对象。 对象可以通过以下方式创建: 使用对象字面量的方式进行创建(也是最常用的方式之一): let obj = { name: …

    JavaScript 2023年5月27日
    00
  • js数组的基本使用总结

    JS数组的基本使用总结 什么是数组 数组是一种特殊的对象,可以用来存储一组有序的数据。数组的每个元素都有一个索引,以此来确定元素在数组中的位置。 创建和使用数组 在JavaScript中,我们可以使用以下两种方式来创建数组: 直接声明 let arr = [1, 2, 3, 4, 5]; 通过构造函数创建 let arr = new Array(1, 2, …

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