js实现防抖(debounce)与节流(throttle)

yizhihongxing

防抖(debounce)

一句话概括:防抖是给定一个时间周期,如果触发事件的周期小于该事件(也就是触发过快),则不会触发事件。
举个例子:我给定的时间周期是1s,如果我在触发第一次事件后1s内触发该事件,则重新开始计时,直到触发周期大于1s才会执行事件的方法。

function debounce(fn,timeout){
    let timer = null
    return function(){
        clearTimeout(timer)
        timer = setTimeout(() => {
            fn.apply(window,arguments)
        }, timeout);
    }
}

一句话概括:节流是给定一个时间周期,然后对频率大的触发进行削峰,如果触发事件的周期大于该事件(也就是触发过快),则会触发事件的周期限定在给定的周期内,如果小于则按照正常的时间触发。
举个例子:我给定的时间周期是1s,如果我在触发第一次事件后连续0.5s内触发该事件,那触发周期会变成每间隔1s执行事件。

节流(throttle)

function throttle(fn,timeout){
    let flag = true
    return function(){
        if(flag){
            setTimeout(() => {
                fn.apply(this,arguments)
                flag = true
            }, timeout);
        }
        flag = false
    }
}

其他应用场景举例

讲完了这两个技巧,下面介绍一下平时开发中常遇到的场景:

  1. 搜索框input事件,例如要支持输入实时搜索可以使用节流方案(间隔一段时间就必须查询相关内容),或者实现输入间隔大于某个值(如500ms),就当做用户输入完成,然后开始搜索,具体使用哪种方案要看业务需求。
  2. 页面resize事件,常见于需要做页面适配的时候。需要根据最终呈现的页面情况进行dom渲染(这种情形一般是使用防抖,因为只需要判断最后一次的变化情况)

第三方实现

如果自己不愿意封装,可以用第三方实现,比如lodash

原文链接:https://www.cnblogs.com/shinebay/p/17345692.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现防抖(debounce)与节流(throttle) - Python技术站

(0)
上一篇 2023年4月24日
下一篇 2023年4月24日

相关文章

  • Firefox和IE兼容性问题及解决方法总结

    Firefox和IE兼容性问题及解决方法总结 1. 兼容性问题概述 随着Web的发展,人们越来越注重Web应用的跨平台和兼容性。然而,在不同的浏览器中,同一个网站可能会出现不同的排版和功能异常等问题。特别是在Firefox和IE中兼容性问题更加明显,主要表现在以下方面: CSS兼容性问题:包括盒模型、浮动、定位等 JavaScript语法差异:例如事件绑定、…

    JavaScript 2023年6月10日
    00
  • 深入浅析javascript继承体系

    深入浅析JavaScript继承体系 1. 继承的概念 在JavaScript中,继承是指一个对象获得另一个对象的属性和方法。这种被继承的对象称为父类或基类,继承它的对象称为子类或派生类。继承是面向对象编程中最基本的概念之一,也是JavaScript中的重要概念。 2. 继承的实现方式 在JavaScript中,实现继承有多种方式,常见的包括原型链继承、构造…

    JavaScript 2023年6月10日
    00
  • js 数据类型转换总结笔记

    很高兴为您讲解《js 数据类型转换总结笔记》的完整攻略。 概述 在 JavaScript 中,数据类型转换是一个非常重要的概念。在实际应用中,我们常常需要将一个数据类型转换成另外一种数据类型,以使其能够满足特定的需求。JavaScript 中常见的数据类型有原始类型(Number、String、Boolean、null、undefined、Symbol)和引…

    JavaScript 2023年5月27日
    00
  • javascript获取dom的下一个节点方法

    当我们需要获取一个DOM元素的下一个兄弟节点时,有以下两个方法: 方法一:使用nextSibling属性 DOM节点对象拥有一个nextSibling属性,该属性用于获取当前节点的下一个兄弟节点。需要注意的是,这个属性获取到的兄弟节点可能是文本节点、注释节点等。 // 获取 id 为 "test" 的元素的下一个兄弟节点 var test…

    JavaScript 2023年6月10日
    00
  • 详解vue的双向绑定原理及实现

    关于《详解vue的双向绑定原理及实现》的攻略,我们可以分为以下几个部分进行讲解: 一、什么是双向绑定?为何要使用双向绑定? 双向绑定 Vue.js 中的双向绑定是将数据与视图进行双向绑定。在数据发生变化时,视图会自动更新并显示最新的状态;而在用户交互改变视图的值时,数据也会自动更新。 使用双向绑定的好处 使用双向绑定可以使我们写的代码更加简洁明了,减少了大量…

    JavaScript 2023年6月11日
    00
  • JS定时器实现数值从0到10来回变化

    实现数值从0到10来回变化,可以通过JavaScript中的定时器来实现。具体步骤如下: 使用JavaScript的setInterval()方法创建一个定时器。该方法接受两个参数:要执行的代码块和时间间隔,单位是毫秒。 创建一个计数器变量,初始值设为0,每当定时器触发时,将计数器加1,并将该数值显示在页面上。 设定一个条件,当计数器的值为10时,将其减1,…

    JavaScript 2023年6月11日
    00
  • ES6 更易于继承的类语法的使用

    ES6 引入了 class 语法,从而使得 JavaScript 的面向对象编程更加易于使用和维护。这里是一些使用 ES6 类语法的实用指南: 创建一个类 ES6 class 语法允许你使用 class 关键字来创建一个类,并在类中定义属性和方法。下面是一个简单的类创建示例: class Person { constructor(name, age) { t…

    JavaScript 2023年6月10日
    00
  • 从js向Action传中文参数出现乱码问题的解决方法

    针对“从js向Action传中文参数出现乱码问题的解决方法”,会采取以下步骤: 步骤一:修改前端代码 在前端JS中使用encodeURIComponent()方法将参数进行编码,然后再传递给后端Action。 示例1:传递中文参数username var username = "张三"; var url = "example.c…

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