JS之防抖与节流

防抖与节流解决了什么?

解决了事件频繁触发的问题

防抖

新事件的触发,如果上一次事件还没有执行则忽略上一次事件,以最新的事件为标准,允许将多次事件合成一个事件

节流

新事件的触发,如果上一次事件还没有执行则忽略本次事件,以上一次事件为标注,不允许在X秒内执行次数超过一次

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>防抖</title>
		<style type="text/css">
			#container{
				width: 100%;
				height: 300px;
				background-color:#353535 ;
				color: white;
				text-align: center;
				line-height: 300px;
				font-size: 30px;
			}
		</style>
	</head>
	<body>
		<div id="container">0</div>
	</body>
	<script src="main.js" type="text/javascript" charset="utf-8"></script>
</html>

var container = document.getElementById('container');
var n = 1
function transformHtml(e){
	console.log(e)
	container.innerHTML = n++;
	console.log(this)
}

// document.onmousemove = transformHtml
// document.onmousemove = Antishake(transformHtml, 1000)
// document.onmousemove = throttle(transformHtml, 1000)
document.onmousemove = Datethrottle(transformHtml, 1000)

// 防抖
/*
	新事件的触发,如果上一次的事件还没有执行则忽略上一次事件,以最新的事件为准。允许我们将多个连续的调用合并成一个
*/
function Antishake(fn, wait){
	var timer;
	var context = this;							// 保留this
	return function(){
		clearTimeout(timer);
		var arg = arguments
		console.log(arg)
		timer = setTimeout(function(){
			fn.apply(context, arg)
		}, wait)
	}
}

// 节流
/*
	新事件的触发,如果上一次的事件还没有执行完,则忽略本次事件,以上一次的事件为标准,不允许函数在X秒内执行的次数超过一次
*/
// 定时器节流
function throttle(fn, wait){
	var timer;
	var context = this;
	return function(){
		var arg = arguments
		if(!timer){
			timer = setTimeout(function (){
				fn.apply(context, arg)
				timer = null;
			}, wait)
		}
	}
}

// 时间戳节流
function Datethrottle(fn, wait){
	var context, args;
	var pervious = 0;
	return function(){
		var now = +new Date();
		context = this;
		args = arguments;
		// 触发函数的当前时间 - 上一次记录的时间 > 节流的时间(如果比节流的时间小,那就不触发,等待旧的事件触发完,再触发新的)
		if(now - pervious > wait){
			fn.apply(context, args);
			pervious = now;
		}
	}
}

具体参考:
https://github.com/mqyqingfeng/Blog/issues/22

https://segmentfault.com/a/1190000009831691

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值