节流事件

有一些事件是会频繁触发的,好比scroll resize mousemove keyup
若是在这些事件上绑定函数,而且这些函数要进行耗性能的计算,那么会致使页面忽急忽缓,反应迟钝,这时就须要使用节流事件来控制函数被触发的频率。javascript

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);

想象一个场景:实时搜索java

在输入框输入关键词后就要立刻显示结果,一般作法是在keyup上绑定handler处理函数,发送ajax请求。可是若是用户输入速度很快,那么keyup会触发屡次,发送多个ajax请求,而咱们只是想要在用户中止输入的时间超过1s后才发送ajaxajax

这和前面的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基础教程》性能

相关文章
相关标签/搜索