javascript --- 防抖与节流

说明

源码


1. 防抖与节流

1.1 防抖

  • 防抖: 触发事件后,在n秒内函数只执行一次

  • 记忆: 你手比较抖,不小心按了按钮2下…你只希望它只执行一次.且按第二次结束时间算…这就用到了防抖技术

1.2 节流

  • 节流: 连续发生的事件,在n秒内只执行一次函数

1.3 防抖与节流的区别

  • 在一段时间内,不管触发多少次事件,事件处理函数都只处理一次称之为节流
  • 防抖,是在最后一次事件发生时开始计算,到固定时间触发

1.4 准备工作

  • 准备一个给定宽、高的盒子,初始化显示为0.(innerHTML = 0)
  • 当鼠标移入盒子的时候,触发鼠标移动事件(box.onmousemove)
  • 鼠标移动事件的处理函数: 当鼠标在盒子中移动的时候,会将一个全局变量(count)加1并写入盒子中
<!DOCTYPE html>
<html lang="en"><head><title>防抖与节流</title><style>.box {width: 150px;height: 150px;margin: 50px auto;line-height: 150px;text-align: center;border: 1px solid black;font-size: 50px;}</style></head><body><div id="box" class="box">0</div><script>var box = document.getElementById('box')var count = 1box.onmousemove = function() {box.innerHTML = count++}</script></body>
</html>

1.5 防抖的实现(先等待在执行)

  • 思路:
    1. 在事件处理器中放一个延迟执行函数(setTimeout)
    2. 每触发一次,清除上一次的事件处理函数(clearTimout)
var box = document.getElementById('box')
var count = 1
var timer = null;
function debounce() {if (timer) clearTimeout(timer)timer = setTimeout(() => {box.innerHTML = count++;}, 1 * 1000);
}
box.onmousemove = debounce

1.5.1 防抖的改进

  • 上面的等待时间和处理函数是静态的,封装成动态的
var debounce = (handUp, fn) {var timer = null;return function (){if(timer) clearTimeout(timer);timer = setTimeOut(function(){fn.call(this, arguments)}, handUp)}
}
box.onmousemove = debounce(1000, function(){box.innerHTML = count++;
})

1.6 防抖的实现(先执行在等待)

  • 描述: 触发事件处理函数的时候,先执行一次函数,然后过n秒后再执行
  • 思路:
  1. 由于核心是异步函数(setTimeout)的清除.
  2. 用一个flag函数记录当前定时器的状态,如果定时器为空则代表执行
function debounce(handUp, fn) {// 进来的时候设置为nullvar timer = nullreturn function() {if (timer) clearTimeout(timer)var flag = !timertimer = setTimeout(() => {timer = null}, handUp)if (flag) fn.apply(this, arguments)}
}

1.7 节流的实现

  • 描述: 在给定时间内,无论时间处理函数触发多少次都只执行一次
  • 思路:

1.根据timer是否为空,如果为空则执行一次.

2.在给定时间后,将定时器的序号timer清空.让它可以重新执行

function throttle(handUp, cb){var timer = null;return function(){if(!timer){timer = setTimeout(()=>{cb.apply(this);timer = null;}, handUp)}}
}

1.8 节流的实现(不使用定时器)

  • 触发的第一次的时候,先记录第一次执行的时间(last)
  • 触发然后随着函数不断触发,得到第一个时间间隔大于给定时间的环境.
  • 触发给定的函数,然后将last设置为当前时间
function throttle(handUp, cb){var last = 0;return function(){var now = Date.now();if(now - last > handUp){last = now;cb.apply(this);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bugku_本地包含

先上payload: 1、?hello);show_source(%27flag.php%27);// 2、?hello);include $_POST[zzz];// POST传参:zzzphp://filter/readconvert.base64-encode/resourceflag.php 3、?hellofile(%27flag.php%27) 4、?helloshow_source(flag.php) 首先我们来看源码&#xff1a; <?…

javascript --- js中的作用域 变量提升

1 求以下函数的输出 1.1 考察点: 变量提升、this、作用域 // 考察点 作用域、this、变量提升 var a 10 function test() {a 100console.log(a) console.log(this.a) var aconsole.log(a) } test()第一个和第三个肯定是100在node环境下,没有window的概念,因此输出的是 und…

洛谷1091合唱队形

题目描述 N位同学站成一排&#xff0c;音乐老师要请其中的(N−K)位同学出列&#xff0c;使得剩下的K位同学排成合唱队形。 合唱队形是指这样的一种队形&#xff1a;设K位同学从左到右依次编号为1,2,…,K&#xff0c;他们的身高分别为T1​,T2​,…,TK​&#xff0c; 则他们的身高…

poj3069 Saruman's Army(贪心)

https://vjudge.net/problem/POJ-3069 弄清楚一点&#xff0c;第一个stone的位置&#xff0c;考虑左右两边都要覆盖R&#xff0c;所以一般情况下不会在左边第一个&#xff08;除非前两个相距>R&#xff09;。 一开始二层循环外层写的i1&#xff0c;这样对于数据诸如1 1 1>…

Redis的key和value大小限制

Redis的key和value大小限制今天研究了下将java bean序列化到redis中存储起来&#xff0c;突然脑袋灵光一闪&#xff0c;对象大小会不会超过redis限制&#xff1f;不管怎么着&#xff0c;还是搞清楚一下比较好&#xff0c;所以就去问了下百度&#xff0c;果然没多少人关心这个问…

jquery --- 监听tab栏的变化

1. jQuery样式操作 1.1 操作css方法 参数只写属性名,则返回属性值(字符串) $(this).css(color)参数是 属性名、属性值(逗号分隔&#xff0c;则表示设置属性 $(this).css(color,red)参数可以是对象的形式 $(this).css({width: 400px,height: 400px })1.2 设置类样式方法 添…

bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线【线段树+hash】

bzoj题面什么鬼啊…… 题目大意&#xff1a;有一个初始值均为0的数列&#xff0c;n次操作&#xff0c;每次将数列(ai,bi-1)这个区间中的数与ci取max&#xff0c;问n次后元素和 离散化&#xff0c;然后建立线段树&#xff0c;每次修改在区间上打max标记即可 #include<iostrea…

Redis单机和集群环境搭建

一、安装单机版redis 1、可以自己去官网下载&#xff0c;当然也可以用课程提供的压缩包 # yum install gcc # wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz # tar -xzvf tcl8.6.1-src.tar.gz # cd /usr/local/tcl8.6.1/unix/ # ./configure # make &…

yum离线安装

安装yum-plugin-downloadonly插件 yum install -y yum-plugin-downloadonly下载对应的软件包&#xff0c;我们以mysql为例&#xff0c;终端输入如下命令 yum install -y --downloadonly --downloaddir/soft/mysql mysql --downloaddir用来指定下载的路径转载于:https://www.cnb…

算法 --- 递归实现多级树展开结构

说明 先根据数据渲染,然后再实现事件 渲染 在项目中,经常会给出一个深度不确定的数组,数字结构如下: data [{name: a, child:[{name: a1},{name: a2, child: [{name:a21}]}]},{name: b} ]要求将数组渲染成对应的目录结构, 结构如下: <ul><li>a<ul><…

PYTHON自动化Day4-交换变量,字符串方法,拷贝,集合,文件,文件指针

一.判断 # 非空即真、非0即真 # 不为空的话就是true&#xff0c;是空的话就是false # 只要不是0就是true&#xff0c;是0就是false# 布尔类型 # True False name input(请输入你的名字&#xff1a;).strip() a [] #false d{} # false c 0 #false f tuple() #false e #fa…

Ajax-jsonp

一、什么是Jsonp jsonp(json with padding) 是一种“使用模式”&#xff0c;可以让网页从别的域名那获取资料&#xff0c;即跨域读取数据。 为什么会使用jsonp呢&#xff1f;因为同源策略&#xff08;数据来源一致&#xff09;&#xff0c;现在所有支持javascript 的浏览器都会…

javascript --- [读书笔记] 回流与重绘 前端优化小结

1. 浏览器渲染原理 请说出: 从用户在浏览器地址输入网址,到看整个页面,中间都发生了哪些事情? HTTP请求阶段HTTP响应阶段浏览器渲染阶段 1.1 可能用到的知识 1.1.1 进程 Process、线程 Thread、 栈内存 Stack 进程: 就是开的每一个程序: QQ、网易云音乐、Typora、VSCode……

ARP协议,以及ARP欺骗

1.定义&#xff1a; 地址解析协议&#xff0c;即ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机&#xff0c;并接收返回消息&#xff0c;以此…

css --- [小结]让盒子水平垂直居中的解决方案

描述 有如下模型,想办法让 <style>.box{width: 500px;height: 500px;background: skyblue;} </style> <div class"box"><div class"inner"></div> </div>想办法让inner在box中水平垂直居中 方案1: 使用绝对定位 让…

数组洗牌 Fisher Yates

看播放器代码时发现的这个洗牌算法&#xff0c;再网上查了一番 作用是把数组变成随机序列&#xff0c;原理类似于从牌堆A中随机抽牌放进牌堆B 代码1&#xff1a; 返回一个由&#xff08;数组下标&#xff09;组成的数组 function random(length) {function shuffle (arr) {for…

一个不错的MYSQL数据库备份类,PHP版,一个文件,精简版

1 <?php2 class DbManage {3 var $db; // 数据库连接4 var $database; // 所用数据库5 var $sqldir; // 数据库备份文件夹6 // 换行符7 private $ds "\n";8 // 存储SQL的变量9 public $sqlContent "";10 // 每条sql…

javascript --- 堆栈内存与闭包的作用

你可能会用到的 堆内存: 存储引用类型值所在的空间栈内存: 存储基本类型值和存储代码所在空间函数上下文: JS每一个函数在执行的时候都会创建一个执行上下文 1. 堆内存中的数字和字符串都是相等的 let a {}, b0, c0; a[b] marron; a[c] Mar console.log(a[b]) // Mar第一…

python_sting字符串的方法及注释

string类型是python内置的类型&#xff0c;无需安装 方法/属性说明 capitalize() 把字符串的第一个字符改为大写 casefold() 把整个字符串的所有字符改为小写 center(width) 将字符串居中&#xff0c;并使用空格填充至长度width的新字符串 count(sub[,start[,end]]) …

作业3

import turtle turtle.bgcolor(red) turtle.color(yellow)turtle.fillcolor(yellow) turtle.begin_fill() for i in range(5):turtle.forward(100)turtle.right(144) turtle.end_fill() turtle.done()转载于:https://www.cnblogs.com/zhangkef97/p/9016608.html