有一些事宜是会频仍触发的,比方scroll resize mousemove keyup
假如在这些事宜上绑定函数,而且这些函数要举行耗机能的盘算,那末会致使页面忽急忽缓,反应迟钝,这时候就需要运用撙节事宜来掌握函数被触发的频次。
function handler() {
// 处置惩罚一些耗机能的盘算
// 或许发送ajax要求
console.log('2333');
}
$(window).scroll(handler); // 重复触发handler,影响机能
要领一 setTimeout
var timer = 0;
$(window).scroll(function() {
if (!timer) {
timer = setTimeout(function() {
handler();
timer = 0;
}, 1000);
}
});
要领二 setInterval
// scroll虽然绑定了一个会频仍触发的函数,然则该函数只是转变scrolled的值,不会影响机能
var scrolled = false;
$(window).on('scroll', function() {
scrolled = true;
});
setInterval(function() {
if (scrolled) {
handler();
scrolled = false;
}
}, 1000);
设想一个场景:及时搜刮
在输入框输入关键词后就要立时显现效果,一般做法是在keyup上绑定handler处置惩罚函数,发送ajax要求。然则假如用户输入速度很快,那末keyup会触发屡次,发送多个ajax要求,而我们只是想要在用户住手输入的时候凌驾1s后才发送ajax
这和前面的scroll事宜又有些差别,在这里我只想handler函数在keyup触发后实行一次
前面两种要领只是减少了handler()触发的频次,然则仍然会触发屡次
要领三 clearTimeout
var searchTimeout = null;
$('#input').on('keyup', function(event) {
//每次keyup时直接作废上次计时器,只有当keyup凌驾1s时才实行handler
clearTimeout(searchTimeout);
searchTimeout = setTimeout(function() {
handler();
}, 1000);
});
参考:《jQuery基础教程》