首页 > 其他分享 >js中的防抖和节流

js中的防抖和节流

时间:2022-10-23 22:01:34浏览次数:61  
标签:function 防抖 节流 js delay flag let true

先上结论:

防抖 :只执行最后一次  (常用语输入框) 节流: 控制执行的次数 (常下拉滚动条时进行数据请求)   防抖代码: (这是未封装的,防抖代码和业务代码写在一起了)
<body>
    <input type="text" />

    <script>
      // 防抖:用户触发事件过于频繁,只要最后一次事件的操作
      let inp = document.querySelector('input')
      //定义全局变量 t
      let t = null
      inp.oninput = function () {
        if (t !== null) {
          clearTimeout(t)
        }
        t = setTimeout(() => {
          console.log(this.value)
        }, 500)
      }

    </script>
  </body>

这是封装后的,同时利用了闭包:

  <body>
    <input type="text" />

    <script>
      let inp = document.querySelector('input')

      inp.oninput=debounce(function(){
        console.log(this.value);
      },500)

      // 封装防抖函数
      //fn 为传入的业务逻辑  delay 为延迟时间
      function debounce(fn,delay){
        let t = null;
        return  function () {
        if (t !== null) {
          clearTimeout(t)
        }
        t = setTimeout(() => {
          // 使用call 改变 this的指向  如果不更改的话,再上面调用的 this.value 中this 指向为window
          fn.call(this);
        }, delay)
      }
      }
    </script>
  </body

节流代码:(这是未封装的,防抖代码和业务代码写在一起了)

    <style>
      body {
        height: 2000px;
      }
    </style>
    <script>
     // 节流 控制执行的次数
      let flag =true
          window.onscroll=function(){
            if(flag){
              setTimeout(()=>{
                console.log("hello world");
                flag=true
              },500)
            }
            flag =false
          } 

    </script>

和防抖类似,也进行了封装,代码如下:

  <style>
      body {
        height: 2000px;
      }
    </style>
    <script>
      window.onscroll = throttle(function () {
        console.log('hello world')
      }, 500)

      function throttle(fn, delay) {
        let flag = true
        return function () {
          if (flag) {
            setTimeout(() => {
              flag = true
              // 使用call 改变 this的指向
              fn.call(this)
            }, delay)
          }
          flag = false
        }
      }
    </script>

这里解释一下flag 的作用。按照执行顺序讲下吧,从上到下分别为(1 2 3):

(先执行的)第一个  let flag = true; 先定义flag,用来判断使用运行定时器。相信都看得懂,废话不多说。

(第二执行)第三个 调用定时器之后,需要将 flag 暂时定义为 flag 避免短时间再次触发定时器。

(第三个执行的) 第二个 先讲下,为啥第二个最后一个执行,这是因为 js 的同步与异步。 js会先执行同步任务,碰到异步任务 会加到 另外一个线程(只是这样解释,其实不是) 等待其运行结束后,再进行调用。要是不明白,可以先去百度搜索下,同步与异步 的概念。  

这样的话,在定时器 运行结束后,flag 就被改为了 true 用来等待 下次激活使用。

如有解释不对的地方,还望指正。

标签:function,防抖,节流,js,delay,flag,let,true
From: https://www.cnblogs.com/zy-feng/p/16819631.html

相关文章

  • 爬虫之利用selenium绕过js加载
    契子最近发现在ip被tx及其他大量收购,强取的背景下,网络小说很难诞生出有高质量的作品,为此,我计划爬取某个网站100本(再多就暴了)比较优质往年的小说解决精神上的匮乏构思一......
  • JSTL中taglib标签中uri和prefix的使用
    在早期的jsp开发中,是使用java代码来控制逻辑和显示的,但这样会给前端开发人员带来些麻烦并且代码的可读性也会降低。为了解决上述情况,标签库被创造出来了。标签库的目的在于......
  • #yyds干货盘点#JS中的map用法
    map()​​map()​​ 方法会返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。​​map​​​ 方法会给原数组中的每个元素都按顺序调用一次 ​​callback​​......
  • jsp 过滤器
    简介Servlet过滤器从字面上的字意理解为经过一层次的过滤处理才达到使用的要求,而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件,在实际项目开发中Servlet过滤......
  • JSP内置对象
    简介JSP的内置对象是指在JSP页面系统中已经默认内置的Java对象,这些对象不需要开发人员显式声明即可使用。在JSP页面中,可以通过存取JSP内置对象实现与JSP页面和Servlet环境......
  • Fastjson反序列化(一)
    前置知识Fastjson是一个Java库,可以将Java对象转换为JSON格式,当然它也可以将JSON字符串转换为Java对象。Fastjson可以操作任何Java对象,即使是一些预先存在......
  • jsp页面中的正则表达式--主要用于js判断文本格式
    一、方括号[]举例:二、^三、元字符举例的话,就可以这么说,要实现要表示整数的话:[]就表示输入的文本框里面的数字的第一位,可以这么写--->[1-9]然后已知\d表示的与[0-9......
  • js原生转码API
    encodeURIComponent(编码)letencodeBase=encodeURIComponent();decodeURIComponent(解码)letdecodeBase=decodeURIComponent();......
  • uWebSockets.js 遇见 Http3
    HTTP/3引入运行在UDP上的新(不同)传输协议QUIC意味着理论上和目前实验上的延迟减少,目前标准已发布,在开始之前可以参阅《​​​​WebSockets和HTTP​​》​​uWebSockets.......
  • JSON 和 JavaScript 介绍与区别
    Web开发依赖于JavaScript,但什么是JSON,以及JSON与JavaScript的区别是什么?了解WEB背后的技术对于寻求创新和充分利用可用资源的团队来说非常重要。所有与WEB相关的......