一个网站,想要吸引更多的流量,提升用户粘性,除了良好的设计和优雅的交互外,最重要的就是加载速度了。没有用户愿意等,哪怕是1秒,他们均可能再也不来了。这个时候性能优化就显得十分重要了。css
性能优化的方案中不得不提的是雅虎军规,列表中总结了不少值得你们注意的地方和解决方案,可供你们参考。固然雅虎军规并无覆盖全部的性能优化方案,这里咱们须要提一下性能优化中的事件优化---事件节流(throttle)与事件防抖(debounce),这两点在实际应用的十分广泛html
假如咱们为DOM绑定了onScroll事件,当使用触控板,滚动滚轮,或者拖拽滚动条的时候,一秒能够轻松触发几十次事件。更加夸张的是手机上的表现:慢慢滑动一下,一秒能够触发事件100次之多。这么高的执行频率,你的回调函数压力大可想而知,更加蛋疼的是:函数触发频率太高可能会致使的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。那这种就是很是差的体验。不要觉得这个是小问题,当年,鼎鼎大名的Twitter网站就出现了这个问题:向下滚动 Twitter 信息流的时候,变得很慢,很迟钝。就是由于 scroll 事件关联了开销大的函数致使的。jquery
加上了防抖和节流的函数变得特别有用,why?由于咱们在事件和函数执行之间加了一个控制层,这个控制层控制的是函数是否执行,注意咱们不能去控制 DOM 事件触发频率。ajax
介绍完背景,咱们来分别说一下事件节流和事件防抖npm
共同点:都限制函数的执行频次,达到优化的目的性能优化
不一样点:bash
事件节流app
处理方法是只容许一个函数在 x 毫秒内执行一次,跟 防抖 主要的不一样在于,节流 保证 x 毫秒内至少执行一次。举一个最近简单的🌰: 每200ms检查下滚动位置,并触发页面加载函数
事件防抖工具
处理方法是把触发很是频繁的事件(好比key event ,resize)合并成一次执行
说了这么多,都是概念上的东西,估计你们烦了,立刻进入你们喜欢的环节,荷枪实弹的来一发(你也能够本身造一个 debounce/throttle 的轮子或者随便找个博文复制过来。我这里是直接使用 lodash(还能够用underscore) 。使用 lodash 自定义构建工具,生成一个 仅包含 _.debounce 或 _.throttle 方法的压缩库,,可使用如下的简单命令便可:
npm i -g lodash-cli
lodash-cli include=debounce,throttle
复制代码
好了,先献上事件节流的🌰,供你们参看
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
body {
background: #e1e1e1;
margin:0 auto;
max-width:600px;
padding:12px;
}
.item {
height:120px;
width:100%;
margin-top:50px;
padding:20px;
}
.color-1 { background: #9BFFBB}
.color-2 { background: #B9C6FF}
.color-3 { background: #FFA3D8}
.color-4 { background: #FF8E9B}
</style>
</head>
<body>
<h1>这是一个事件节流的🌰 呵呵哒</h1>
<div class="item color-1">Block 1</div>
<div class="item color-2">Block 2</div>
<div class="item color-3">Block 3</div>
<div class="item color-4">Block 4</div>
</body>
<script src="https://cdn.bootcss.com/jquery/2.1.0/jquery.min.js"></script>
<script src='http://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js'></script>
<script>
$(document).ready(function(){
// Check every 200ms the scroll position
$(document).on('scroll', _.throttle(function(){
check_if_load_more();
}, 300));
function check_if_load_more() {
BottomPixelsFromWindow = 0 + $(document).height() - $(window).scrollTop() -$(window).height();
if (BottomPixelsFromWindow < 200){
$('body').append($('.item').clone());
}
}
});
</script>
</html>
复制代码
再来个事件防抖的,巩固一下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
body {
background: #e1e1e1;
color: white;
margin:0 auto;
}
.left-part,
.right-part {
padding:1%;
margin:0;
width:45%;
float:left;
min-height:100vh;
text-align:center;
}
.left-part {
background: #999999;
color:black;
}
</style>
</head>
<body>
<h1>这是一个事件防抖的🌰 呵呵哒</h1>
<div class="left-part">normal resize events<br></div>
<div class="right-part">Debounced resize events<br></div>
</body>
<script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
<script src='http://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js'></script>
<script>
$(document).ready(function(){
var win = $(window);
var left_part = $('.left-part');
var right_part = $('.right-part');
function print_info(div) {
div.append(win.width() + ' x ' + win.height() + '<br>');
}
$(window).on('resize', function(){
print_info(left_part);
});
$(window).on('resize', _.debounce(function() {
print_info(right_part);
}, 400));
});
</script>
</html>
复制代码
说了这么多,事件节流和事件防抖真的用处很大 若是记不住,你也能够比喻着想:
事件节流像是班车:固定在一段时间后执行,不会等乘客(事件),到点发车
事件防抖像是黑车:说是再等五分钟就走,可是若是又有人上车了(在5分钟内再次触发事件),那你又得等5分钟才能再出发(从新计时)
不恰当的🌰哈 ,帮助记忆
未经本人容许,不得转载,文章有疏漏浅薄之处,请各位大神斧正