JS 基础篇(九) 函数防抖和函数节流

news/2024/7/19 15:05:17 标签: javascript, 前端, js, web
webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

函数防抖

  1. 函数防抖:高频率触发(比如10分钟内一直触发)的时候,只执行一次,第一次或者最后一次。重点在只执行一次。
    在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。

  2. 应用场景

    js">1. 手机号、邮箱输入检测
    2. 搜索框搜索输入(只需最后一次输入完后,再放松Ajax请求)
    3. 窗口大小resize(只需窗口调整完成后,计算窗口大小,防止重复渲染)
    4. 滚动事件scroll(只需执行触发的最后一次滚动事件的处理程序)
    5. 文本输入的验证(连续输入文字后发送 AJAX 请求进行验证,(停止输入后)验证一次就好
    
  3. code
    css

    <style>
     .content {
       width: 100%;
       height: 300px;
       background-color: aqua;
       display: flex;
       justify-content: center;
       align-items: center;
     }
     span {
       color: azure;
       font-size: 40px;
     }			
     </style>	
    
    

    html

    <div class="content">
     <span>0</span>
    </div>
    <button class="pre">click me action first time</button>
    <button class="delay">click me action last time</button>
    

    js

    js">let oCon = document.querySelector('.content')
    let oSpan = document.querySelector('span')
    let oPre = document.querySelector('.pre')
    let oDelay = document.querySelector('.delay')
    oPre.onclick = debouncePrev(add,1000)
    oDelay.onclick = debounceDelay(add,1000)
    oCon.onmousemove = throttle(add,1000)
    function add(){
      let num = Number(oSpan.innerHTML)
      oSpan.innerHTML = ++num
    }
          /**
     * 立即执行
     * 连续点击执行第一次
    */
    function debouncePrev(func,delay=160){
      let timer
      return function(){
        if(timer) clearTimeout(timer)
        let action = !timer
        timer = setTimeout(() => {
          timer = null
        }, delay);
        if (action) {
          func.apply(this,arguments)
        }
      }
    }
    /**
     * 立即执行
     * 连续点击执行最后一次
    */
    function debounceDelay(func,delay=160){
      let timer
      return function(){
        clearTimeout(timer)
        let _this = this,
        args = arguments;
        timer = setTimeout(()=>{
          func.apply(_this,args)
        },delay)
      }
    }
    

函数节流

  1. 函数节流:高频率触发的时候,间隔固定时间内执行一次,会稀释执行事件。重点在稀释触发事件。

  2. 应用场景

    js">1. DOM元素的拖拽功能实现(mousemove)
    2. 射击游戏的 mousedown/keydown 事件(单位时间只能发射一颗子弹)
    3. 计算鼠标移动的距离(mousemove)
    4. 搜索联想(keyup)
    5. 滚动事件scroll,(只要页面滚动就会间隔一段时间判断一次)
    
  3. code

    js">/**
      * 时间戳版
      * 立即执行
     */
     function throttle(func,delay=350){
       let timer;
       let prev =  Date.now()
       console.log('prev'+prev);
       return function(){
         let now = Date.now()
         console.log('now'+now);
         if (now - prev > delay) {
           console.log('ll');
           prev = now
           func.apply(this,arguments)
         }
       }
     }
     /**
      * 定时器版
      * delay固定时间后执行
     */
     function throttle(func,delay= 350){
       let timer
       return function(){
         let _this = this
         let args = arguments;
         if(!timer){
           timer = setTimeout(() => {
             // console.log(timer);
             timer = null
             func.apply(_this,arguments)
             // clearTimeout(timer)  //此时 time= true
           }, delay);
         }
       }
     }
    

总结

封装代码

js">/*
* @desc 函数防抖
 * @param func 目标函数
 * @param delay 延迟执行毫秒数
 * @param immediate true - 立即执行, false - 延迟执行
 */
function debounce(func, delay, immediate = false) {
  let timer;
  return function () {
    console.log(immediate);
    if (immediate) {
      let action = !timer;
      if (timer) clearTimeout(timer);
      timer = setTimeout(() => {
        timer = null;
      }, delay);
      if (action) func.apply(this, arguments);
    } else {
      let _this = this;
      let args = arguments;
      clearTimeout(timer);
      timer = setTimeout(() => {
        func.apply(_this, args);
      }, delay);
    }
  };
}
      /*
 * @desc 函数节流
 * @param func 目标函数
 * @param delay 延迟执行毫秒数
 * @param immediate true - 立即执行, false - 延迟执行
 */
function throttle(func, delay, immediate) {
  let timer;
  let prev = Date.now();
  return function () {
    let _this = this;
    let args = arguments;
    if (immediate) {
      let now = Date.now();
      if (now - prev > delay) {
        prev = now;
        func.apply(this, arguments);
      }
    } else {
      if (!timer) {
        timer = setTimeout(() => {
          timer = null;
          func.apply(_this, args);
        }, delay);
      }
    }
  };
}


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

相关文章

c#,随机数,random

摘自&#xff1a;http://www.pcjx.com/Dotnet/C/208333.html我们在做能自动生成试卷的考试系统时&#xff0c;常常需要随机生成一组不重复的题目&#xff0c;在.net Framework中提供了一个专门用来产生随机数的类System.Random。对于随机数&#xff0c;大家都知道&#xff0c;计…

beautifulsoup库的使用

beautifulsoup库的使用 beautifulsoup就是一个非常强大的工具&#xff0c;爬虫利器。 beautifulSoup “美味的汤&#xff0c;绿色的浓汤” 一个灵活又方便的网页解析库&#xff0c;处理高效&#xff0c;支持多种解析器。利用它就不用编写正则表达式也能方便的实现网页信息的抓取…

JS 基础篇(十) cookie封装

cookie简单介绍 cookie的特点1.cookie一般有大小限制为4kb&#xff0c; 2.限制同一域名数量为50个 3.读取有域名限制 4.时效性cookie 使用//添加cookie document.cookie “keyvalue”; // 一次写入一个键值对 //读取cookie document.cookie //获得所有cookie 分号分割//exp…

layui + thymeleaf 动态拼接地址

1.第一种方式 {url}进行占位&#xff0c;在后面的()里写入占位的值 ${url}是controller里面传过来的值<img th:src"{{url}{{d.userImg}}(url${url})}" alt"加载失败"/>2.第二种方式 {{d.userImg}} 是layui的获取全局变量里的值&#xff0c;用单引号…

《末代皇帝》原声音乐《where is armo?》

[hjp3]hjptypesong&player6&sw1http://www.justrun.net/misc/whereisarmo.mp3&autoplayfalse&width380&height90[/hjp3] 转载于:https://www.cnblogs.com/JemBai/archive/2008/07/18/1245877.html

JS 面试题(一)

输出的值(关于this) var name the windowvar object {name:the object,getName:function(){return function(){return this.name}}}console.log(object.getName()());// 思考如何输出the object写出输出 function fn(){for (var i 0; i < 10; i) {console.log(i);}alert(…

19.纯 CSS 创作一种有削铁如泥感觉的菜单导航特效

19.纯 CSS 创作一种有削铁如泥感觉的菜单导航特效 原文地址&#xff1a;https://segmentfault.com/a/1190000014836748 感想&#xff1a; 把原元素隐藏&#xff0c;利用伪元素::before 和 ::after 各取上下一半 clip-path 切割图片 HTML代码&#xff1a; <ul class"men…

linux make使用技巧

测试make目标 mysql(1)time -p make real 322.77user 291.73sys 33.87(2)time -p make -j 5real 121.58user 308.23sys 53.24加了选项 -j 后快了一半(3)再换个值time -p make -j 8real 122.19user 306.27sys 58.24改大了效果也不明显