有一些事件是会频繁触发的,好比scroll resize mousemove keyup
若是在这些事件上绑定函数,而且这些函数要进行耗性能的计算,那么会致使页面忽急忽缓,反应迟钝,这时就须要使用节流事件来控制函数被触发的频率。javascript
function handler() { // 处理一些耗性能的计算 // 或者发送ajax请求 console.log('2333'); } $(window).scroll(handler); // 反复触发handler,影响性能
var timer = 0; $(window).scroll(function() { if (!timer) { timer = setTimeout(function() { handler(); timer = 0; }, 1000); } });
// scroll虽然绑定了一个会频繁触发的函数,可是该函数只是改变scrolled的值,不会影响性能 var scrolled = false; $(window).on('scroll', function() { scrolled = true; }); setInterval(function() { if (scrolled) { handler(); scrolled = false; } }, 1000);
想象一个场景:实时搜索java
在输入框输入关键词后就要立刻显示结果,一般作法是在keyup上绑定handler处理函数,发送ajax请求。可是若是用户输入速度很快,那么keyup会触发屡次,发送多个ajax请求,而咱们只是想要在用户中止输入的时间超过1s后才发送ajaxajax
这和前面的scroll事件又有些不一样,在这里我只想handler函数在keyup触发后执行一次
前面两种方法只是减小了handler()触发的频率,可是仍然会触发屡次函数
var searchTimeout = null; $('#input').on('keyup', function(event) { //每次keyup时直接取消上次计时器,只有当keyup超过1s时才执行handler clearTimeout(searchTimeout); searchTimeout = setTimeout(function() { handler(); }, 1000); });
参考:《jQuery基础教程》性能