在线查看效果移动鼠标触发

1.防抖(立即执行/非立即执行)

  • 什么是防抖:一个事件在触发后,设置定时器,若n秒内该事件没有再次发生,那么执行这个函数,如果n秒内该事件再次发生了,那么定时器重新开始计时。
  • 应用
    • 每次 resize / scroll 触发统计事件
    • 文本输入的验证 (连续输入文字后发送AJAX请求进行验证,验证一次就好)
  • 1.1 非立即执行版
//防抖(非立即执行)
function debounce_1(fn,wait){var timerId = null;return function(){var context = thisvar args = argumentsclearTimeout(timerId);timerId = setTimeout(() => {fn.apply(context,args)},wait)}
}
  • 1.2 立即执行版
//防抖(立即执行)
function debounce_2(fn,wait){var timerId = null;var flag = true;return function(){var context = thisvar args = argumentsclearTimeout(timerId);if(flag){fn.apply(context, args);flag = false}timerId = setTimeout(() => { flag = true},wait)}
}
  • 1.3 合并版
//防抖(合并版)
function debounce_merge(fn,wait = 500,isImmediate = false){var timerId = null;var flag = true;return function(){var context = thisvar args = argumentsclearTimeout(timerId )if(isImmediate ){if(flag){fn.apply(context,args)flag = false}timerId = setTimeout(function(){flag = true},wait)}else{timerId = setTimeout(function(){fn.apply(context,args)},wait)}}
}

2.节流(立即执行/非立即执行)

  • 什么是节流:若一个函数在一段时间内持续高频触发,节流后将使得该函数在这段时间内每隔固定时间才执行一次
  • 应用
    • 与mousemove keyup/keydown 等相密切联系的函数
  • 2.1 非立即执行版
//定义函数
//节流(非立即执行)
function throttle_1(fn,wait){var flag = true;return function(){var context = thisvar args = argumentsif(flag){flag = falsesetTimeout(() => {fn.apply(context,args)flag = true},wait)}}
}
  • 2.2 立即执行版
//节流(立即执行)
function throttle_2(fn,wait){var flag = true;return function(){var context = thisvar args = argumentsif(flag) {fn.apply(context,args);flag = false;setTimeout(() => {flag = true},wait)}}
}
  • 2.3 合并版
//节流(合并)
function throttle_merge(fn,wait = 500,isImmediate = false){var flag = true;return function(){if(flag == true){var context = thisvar args = argumentsflag = falseisImmediate && fn.apply(context,args)setTimeout(() => {!isImmediate && fn.apply(context,args)flag = true},wait)}}
}

3.补充

  • 看文字远不如亲自操作了解得透彻,希望还不太明白的小伙伴在下面演示代码具体操作操作
  • 这里的几个函数都是使用的setTimeout来实现的,也可以使用 Date.now()来实现,思路一样,偷个懒就不写了,嘿嘿;
  • 合并版的 debounce(fn,wait,isImmediate) throttle(fn,wait,isImmediate)

4.演示代码

截图

在线查看效果

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><style>body{height: 1200px;}div{width: 100%;background-color: lightcyan;overflow: hidden;}p{float: left;width: 10px;height:10px;background-color: pink;margin: 1px;}</style>
</head>
<body>防抖(非立即执行) <div id="d1_1"></div>防抖(立即执行) <div id="d1_2"></div>节流(非立即执行) <div id="d2_1"></div>节流(立即执行) <div id="d2_2"></div><!-- 原生 <div id="d3"></div> -->
</body>
<script>
//防抖(非立即执行)
function debounce_1(fn,wait){var timerId = null;return function(){clearTimeout(timerId);timerId = setTimeout(() => {fn.apply(this,arguments)},wait)}
}
//防抖(立即执行)
function debounce_2(fn,wait){var timerId = null;var flag = true;return function(){clearTimeout(timerId);if(flag){fn.apply(this,arguments);flag = false}timerId = setTimeout(() => { flag = true},wait)}
}
//节流(非立即执行)
function throttle_1(fn,wait){var flag = true;return function(){if(flag == true){flag = falsevar timer = setTimeout(() => {fn.apply(this,arguments)flag = true},wait)}}
}
//节流(立即执行)
function throttle_2(fn,wait){var flag = true;var timer = null;return function(){if(flag) {fn.apply(this,arguments);flag = false;timer = setTimeout(() => {flag = true},wait)}}
}//定义事件函数
function debounce_fn1(){ addElement(d1_1) }
function debounce_fn2(){ addElement(d1_2) }
function throttle_fn1(){ addElement(d2_1) }
function throttle_fn2(){ addElement(d2_2) }
// function origin(){ addElement(d3) }//注册事件
var body = document.getElementsByTagName('body')[0]
body.addEventListener("mousemove",debounce_1(debounce_fn1,500))
body.addEventListener("mousemove",debounce_2(debounce_fn2,500))
body.addEventListener("mousemove",throttle_1(throttle_fn1,500))
body.addEventListener("mousemove",throttle_2(throttle_fn2,500))
// body.addEventListener("mousemove",origin)//辅助函数
function addElement(f){var node=document.createElement("p");f.appendChild(node);
}
</script>
</html>

防抖和节流函数详解(立即执行/非立即执行)相关推荐

  1. matlab三次样条曲线的绘制(spline和csape函数详解)

    matlab三次样条函数的绘制(spline和csape函数详解) 前言 1.spline函数详解 1.一维非节点边界 2.第二边界条件 3.高维无约束 4.高维第二边界 5.利用第二边界条件绘制圆 ...

  2. 【ES6】Generator函数详解

    [ES6]Generator函数详解 一.Generator函数简介 基本概念 函数写法 yield关键字介绍 二.next方法的参数 三.for...of循环 四.关于普通throw()与Gener ...

  3. python基础知识~ 函数详解2

    python~函数详解2  1 生成器函数    定义 如果函数有yield这个关键字,就是生成器函数.生成器函数() 获取的是生成器,不执行函数   须知 yield和return一样,都可以返回数 ...

  4. scanf函数详解与缓冲区

    1.基本信息 函数原型: int scanf( char *format, args, ...); 函数返回值: 读入并赋给args的数据个数,遇到文件结束返回EOF,出错返回0. 函数功能: sca ...

  5. linux内核中send与recv函数详解

    Linux send与recv函数详解 1.简介 #include <sys/socket.h> ssize_t recv(int sockfd, void *buff, size_t n ...

  6. linux的阻塞waitqueue,Linux阻塞控制 wait_event与wait_event_interruptible函数详解

    Linux阻塞控制 wait_event与wait_event_interruptible函数详解 最近研究了一下linux驱动对进程的阻塞与非阻塞的控制,感觉linux对进程的控制真的是牛逼,各种进 ...

  7. linux send与recv函数详解

    linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t nb ...

  8. python内置函数教程_Python内置函数详解

    此文参考python文档,然后结合自己的理解,写下来,一方面方便自己,让自己好好学习,顺便回忆回忆:另一方面,让喜欢的盆友也参考一下. 经查询,3.6版本总共有68个内置函数,主要分类如下: 数学运算 ...

  9. 内核中的kmalloc函数详解

    一.kmalloc函数详解 #include <linux/slab.h> void *kmalloc(size_t size, int flags); 给 kmalloc 的第一个参数是 ...

最新文章

  1. java fx 按钮长度_JAVA FX语法学习----运算符
  2. 数据库中数据类型和约束(整数类型、字符串、时间类型)
  3. pip包重新安装mysql_Ubuntu pip 安装 mysql-python包出错
  4. bzoj3714:[PA2014]Kuglarz
  5. Android之使用AlertDialog类和AlertDialog.Builder类创建带取消,确定,中立的对话框
  6. 深度神经网络训练过程中为什么验证集上波动很大_图神经网络的新基准
  7. ckEditor使用JS代码调用的方法
  8. 爱因斯坦那颗大脑,究竟隐藏了什么
  9. java获取网卡正真的mac_java获取网卡的mac地址
  10. 3月10日 QR分解求非齐次线性,SVD分解求齐次线性最小二乘
  11. linux下安装ansys
  12. 没想到,快手成了“生产力”
  13. 51单片机制作简易计算器(动态数码管、矩阵按键)
  14. wireshark 报文分析心得 -- Identification 使用说明
  15. mysql单表瓶颈_mysql单表性能瓶颈_优化系列 | 实例解析MySQL性能瓶颈排查定位-云栖社区-阿里云...
  16. 关于一些Excel的快捷键总结
  17. html dt和dd顺序,dl dt dd使用方法
  18. 牛客多校第十场 Han Xin and His Troops(扩展中国剩余)
  19. 【PyTorch】4 姓氏分类RNN实战(Simple RNN)——18 种起源语言的数千种姓氏分类
  20. 2D_Detection-模型加速(网络篇)

热门文章

  1. 这个外包公司太恶心了。。
  2. YOLO交通标志识别数据集准备
  3. 浅谈HFSS软件中端口有源S参数(Active_SParameter)
  4. [Err] 2006 - MySQL server has gone away mysql导入数据备份 数据比较大 longblob
  5. 怎样可以把excel表格转换成word文档
  6. sql去重保留需要返回的字段信息
  7. 字符'0'和'\0',及整数0的区别
  8. 怎么用计算机弹千本樱,现在的地球人真不正常!用计算器都能来一发千本樱!【附曲谱】...
  9. 身为男人要做的十件事
  10. SYN Flood DNS Query Flood HTTP Flood DDoS CC常见网络功击