JavaScript防抖与节流超详细全面讲解

JavaScript防抖与节流超详细全面讲解

一、什么是防抖与节流

防抖(debouncing)节流(throttling)解决的是高频触发事件的性能问题。事件被触发多次,但是实际上我们只需要在事件停止触发之后才进行一次处理,或者减少事件的触发次数。

防抖是指在短时间内多次触发同一个事件,只执行最后一次,或者只在连续触发事件后停止一段时间后再执行。比如在输入框中使用防抖可以减少实时搜索时请求的次数。

节流是指一定时间内只执行一次任务,或者每隔一定时间才执行一次任务。比如页面滚动时加载图片,为了减轻服务器压力,可以将滚动事件改成每200ms执行一次。

二、防抖与节流的实现

1. 防抖的实现

防抖可以使用定时器实现,当事件触发时清除已有的定时器并重新设定一个新的定时器,在一定的时间间隔内没有再次触发事件时,即认为事件停止触发,执行事件处理函数。防抖可以使用JavaScript闭包来实现。

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);
  };
}

使用示例:

function search(query) {
  console.log(`searching for ${query}`);
}

let debounceSearch = debounce(search, 500);

//实时搜索
let input = document.getElementById('search-input');
input.addEventListener('keyup', function() {
  debounceSearch(input.value);
});

2. 节流的实现

节流可以采用两种方案:使用定时器实现和使用时间戳实现。

使用定时器实现时,当事件触发后设定定时器,在定时器到期后执行事件处理函数,如果在定时器到期之前又触发了事件,则重设定时器,并重新计时。

使用时间戳实现时,当事件触发后,计算距离上次事件的时间是否超过了规定的时间间隔,如果超过了规定的时间间隔,则执行事件处理函数并更新上次事件的时间戳。

下面是使用定时器实现节流的代码:

function throttle(fn, delay) {
  let timer = null;

  return function() {
    let context = this;
    let args = arguments;

    //使用定时器实现节流
    if (!timer) {
      timer = setTimeout(function() {
        fn.apply(context, args);
        timer = null;
      }, delay);
    }
  };
}

使用示例:

function loadImage() {
  console.log('loading image');
}

let throttleLoadImage = throttle(loadImage, 200);

window.addEventListener('scroll', throttleLoadImage);

三、防抖与节流的应用场景

1. 防抖的应用场景

实时搜索、拖拽改变窗口大小,网络请求等。

例如实现实时搜索:

function search(query) {
  console.log(`searching for ${query}`);
}

let debounceSearch = debounce(search, 500);

//实时搜索
let input = document.getElementById('search-input');
input.addEventListener('keyup', function() {
  debounceSearch(input.value);
});

2. 节流的应用场景

页面滚动事件、窗口大小改变事件、高频点击事件等。

例如优化窗口大小改变事件:

function resize() {
  console.log('window resized');
}
let throttleResize = throttle(resize, 200);

window.addEventListener('resize', throttleResize);

四、防抖与节流的优缺点

1. 防抖的优缺点

防抖可以减少事件的触发次数,提升性能,但是会延迟事件的实际执行时间。

2. 节流的优缺点

节流可以控制事件的触发间隔,提高性能,但是会影响事件的实际响应时间。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript防抖与节流超详细全面讲解 - Python技术站

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

相关文章

  • JS对URL字符串进行编码/解码分析

    好的!JS对URL字符串进行编码/解码的主要方法有两种:encodeURIComponent和decodeURIComponent。下面对它们进行详细说明: encodeURIComponent encodeURIComponent 方法可以将字符串中的非字母数字字符(比如空格、中文、特殊符号)转换为十六进制字符。转换后的字符前面加上 %,这样可以在URL中…

    JavaScript 2023年5月20日
    00
  • jquery validate添加自定义验证规则(验证邮箱 邮政编码)

    以下是关于jquery validate添加自定义验证规则的完整攻略。 什么是jquery validate? jQuery validate是一个基于jQuery的表单验证插件,它可以对表单中的各类数据进行校验,从而帮助我们减少了客户端数据校验的代码量,提高了开发效率。 如何添加自定义验证规则? jquery validate插件提供了丰富的内置验证规则,…

    JavaScript 2023年6月10日
    00
  • Js实现粘贴上传图片的原理及示例

    让我来为你讲解Js实现粘贴上传图片的原理及示例的完整攻略。 原理 Js实现粘贴上传图片的原理为通过监听粘贴事件,获取粘贴板中的内容,如果内容是图片,则将其转换为base64格式上传到服务器。 具体来说,通过监听粘贴事件 paste ,获取事件对应的粘贴板对象 clipboardData 中的内容,如果内容是图片,则将其转换为base64编码。然后,使用Aja…

    JavaScript 2023年5月19日
    00
  • asp.net GridView中使用RadioButton单选按钮的方法

    当使用ASP.NET GridView控件来呈现数据时,我们经常需要允许用户选择一个或多个项目。在这种情况下,RadioButton单选按钮是最常用控件之一。在本攻略中,我将向您演示在ASP.NET GridView中使用RadioButton单选按钮的完整过程。 第一步:GridView控件的绑定 首先,我们需要绑定GridView控件以显示我们需要的数据…

    JavaScript 2023年6月11日
    00
  • JS实现点击颜色块切换指定区域背景颜色的方法

    针对“JS实现点击颜色块切换指定区域背景颜色”的情况,可以考虑以下实现方案。 实现思路 定义颜色块选项和给定区域(例如div); 给颜色块添加点击事件,记录点击的颜色值; 利用DOM操作,将颜色值赋予给定区域的背景色; 代码示例 <!doctype html> <html> <head> <meta charset=…

    JavaScript 2023年6月11日
    00
  • js实现可控制左右方向的无缝滚动效果

    实现可控制左右方向的无缝滚动效果,可以通过以下步骤实现: 步骤一:创建HTML结构 首先,我们需要创建一个HTML结构来支持该滚动效果。可以采用如下的结构: <div class="scroll-container"> <div class="scroll-items"> <div cla…

    JavaScript 2023年6月11日
    00
  • Javascript 面向对象(一)(共有方法,私有方法,特权方法)

    下面是针对”Javascript 面向对象(一)(共有方法,私有方法,特权方法)”的详细讲解: 什么是面向对象编程? 面向对象编程是一种编程思想,它将数据和操作数据的行为封装在一起,形成一种对象。在面向对象编程中,对象都有自己的状态和行为,对象之间通过调用彼此的方法来进行协作完成任务。 在Javascript中,可以使用对象字面量或者构造函数创建对象。对象字…

    JavaScript 2023年5月27日
    00
  • Javascript中this的用法详解

    下面开始详细讲解“JavaScript中this的用法详解”。 什么是this? 在JavaScript中,this是一个关键字,代表着函数执行的上下文环境。根据函数被调用的方式不同,this的值也会有所不同。 this的用法 1. 作为对象的方法被调用 当一个函数作为对象的方法被调用时,其中的this指向该对象。 const obj = { name: ‘…

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