防抖节流原理及实现(含演示图)

news/2024/7/24 5:26:48 标签: js, javascript

文章目录

  • 前言
  • 一、防抖(debounce)
    • 1、什么是防抖?
    • 2、防抖实现
  • 二、节流(throttle)
    • 1.什么是节流?
    • 2.节流实现
  • 总结


前言

随着前端飞速的发展,用户体验也越来越重要。大家在逛一些网站时,会不会手贱,去疯狂的点击某个按钮,但是做了后却发现,网站都是,你点归你点,我动算我输。这其实就是因为做了防抖节流操作啦,为什么这两个东西这么神奇呢?让我们一起探究一下吧。

一、防抖(debounce)

1、什么是防抖?

通俗来说就是当一个事件一直处于频繁触发的情况下,禁止触发,直到频率降低到规定的程度,才允许触发。

效果:短时间内多次触发,最终在停止触发后的某个指定时间执行一次函数-----只执行一次

2、防抖实现

思路:

  1. 触发事件时,给一个setTimeout定时器来延迟触发
  2. 每次点击清除并重置定时器
  3. 使用闭包来存储定时器

代码:

// 防抖
      const debounce = (fn, time) => {
          let timeout = null
          return function() {
              clearTimeout(timeout)
              timeout = setTimeout(() => {
                  fn.apply(this, arguments)
              }, time);
          }
      }

纸上谈兵都是扯淡,接下来让我们测试一下效果:

const input = () => console.log("111");
// 在1000ms也就是1s内连续移动都不会触发事件
div.addEventListener('mousemove', debounce(input, 1000))

效果图:

在这里插入图片描述
可以发现我鼠标在移动时一直没有触发事件,直到停止后才触发

二、节流(throttle)

1.什么是节流?

通俗的来说就是一个事件不停的触发时,控制它在每个时间段只触发一次。

效果:短时间内多次触发,即使触发仍在继续也可以根据指定时间触发一次函数----至少执行一次。

2.节流实现

思路:

  1. 设置一个变量,限制为true才能进入函数,进入后变为false。
  2. 设置setTimeout定时器在规定时间后才能进入执行函数再次触发。
  3. 使用闭包存储变量

代码:

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

让我们来测试一下

const input = () => console.log("111");
div.addEventListener("mousemove", throttle(input, 1000));

效果图:
在这里插入图片描述
可以看到我鼠标在移动时先触发了一次事件,随后每过1s才再次触发一次事件。

总结

本次的演示就在这啦,思路是非常简单的,希望大家都能动手去敲一敲哟!


http://www.niftyadmin.cn/n/861680.html

相关文章

【css定位】超详细!手把手带你体验position属性(含sticky属性与效果图)

文章目录前言一、relative1.介绍2.场景相对自身定位二、absolute1.介绍2.场景相对于除static外的父元素定位父元素都是static相对于谁定位脱离文档流会占位吗三、fixed1.介绍2.场景四、sticky1.介绍2.场景总结前言 面试官:说说position的属性吧。 我:哦…

超超超超详细!手把手带你用js实现简易版position:sticky

文章目录一、基本思路二、实现过程1.准备工作1.获取dom元素,设置偏移量2.给滑动添加事件3.判断是否在可视区4.脱离可视区触发回调函数总结# 前言 前面我们在介绍position属性时(不知道的小伙伴可以去看看我的另一篇说position的博客哟,传送门…

一路摸爬滚打,我终于踏上了我的程序员之路!

我正在参与CSDN《新程序员》有奖征文活动,活动链接: https://marketing.csdn.net/p/52c37904f6e1b69dc392234fff425442 文章目录前言浑浑噩噩开学季自信心被重击虚度光阴初识编程你好,前端我的第一个轮播图期末课设前端是没有前途的开始前端之…

$set解决vue中修改数组或对象视图不更新的问题

文章目录前言一、案例二、解决方法$set总结前言 相信大家和我一样,在开发中总是遇到一个问题。 为啥我修改v-for遍历的数组,视图却没有更新???当我点击其他操作重新渲染后,又更新了?&#xff…

MongoDB入门学习

文章目录前言一、MongoDB是什么?二、MongoDB的基本操作1.基本指令2.插入文档3.查询文档4.修改文档5.删除文档6.简单操作总结前言 虽说现在关系型数据库还是主流,但是面对某些需求的时候,需要非关系型数据库来补充它,学习一个主流…

使用mongoose在express中操作数据库

文章目录前言一、Mongoose是什么?二、使用步骤1.引入库2.连接数据库3.操作数据库操作前的准备工作增加文档查询文档更新文档删除文档3.将增删查改操作写成接口总结前言 前面我们已经学会怎么去在命令行里操作数据库了,但是我们肯定不能让用户去操作命令…

浅谈xss和csrf攻击

文章目录前言一、XSS是什么?存储型(持久型)反射型(非持久型)dom型二、CSRF是什么?总结前言 由于博主目前在一家主做网络安全的公司实习,之前没有意识到网络安全的严重性,现在才感受到我们的系统存在了这么多问题,很容…

【ES6】浅谈Vue3为什么使用Proxy取代defineProperty

文章目录前言一、Proxy是什么?get()set()二、Vue双向绑定实现原理三、Vue3为什么使用ProxydefineProperty缺陷Proxy的好处总结前言 友友们大家好,vue3推出后大家有没有去看呢?博主是个性子急的人,哪能禁得住这诱惑。 经过博主粗…