高效使用jquery滚动功能

Efficient use jquery scroll function

我想检查 scrollTop 是否大于 1。但是当我使用以下代码时,滚动事件会在用户滚动时持续触发,从而导致性能不佳。

$(window).on('scroll', function(){
        var scrollTop = $(this).scrollTop();

        if(scrollTop > 1){
            $('.header').addClass('active');
        }   else{
            $('.header').removeClass('active');
        }
    });

是否有更有效的方法来执行此操作,以便性能得到控制?

为了优化,停止每次动态请求 header。 在 window object 中存储对 header 的引用。

$(document).ready(function() {
                          window.headerObject = $('.header');
                          window.jQueryWindow = $(window);
                          });
$(window).on('scroll', function(){
    var scrollTop = jQueryWindow.scrollTop();
    if(scrollTop > 1){
           window.headerObject.addClass('active');
    }   else{
        window.headerObject.removeClass('active');
    }
});

不必多次遍历 DOM 来查找 .header 并为 window [创建新的 jquery object header =28=] 每次,你只需存储它们,否定初始化成本提高速度。

如果你想比较速度:

$(document).ready(function() {
                          window.headerObject = $('.header');
                          window.jQueryWindow = $(window);
                          });
$(window).on('scroll', function(){
    starttime = performance.now();
    var scrollTop = jQueryWindow.scrollTop();
    if(scrollTop > 1){
           window.headerObject.addClass('active');
    }   else{
        window.headerObject.removeClass('active');
    }
    console.log('scroll optimised took' + (performance.now() - starttime) + " milliseconds");
});


$(window).on('scroll', function(){
    starttime = performance.now();
    var scrollTop = $(this).scrollTop();

    if(scrollTop > 1){
        $('.header').addClass('active');
    }   else{
        $('.header').removeClass('active');
    }
   console.log('scroll dynamic took' + (performance.now() - starttime) + " milliseconds");
});

scroll optimised took 0.060999998822808266 milliseconds

scroll dynamic took 0.26700000125856604 milliseconds

如您所见,优化后的代码平均耗时 0.06 毫秒,而完整的动态选择器耗时 0.26 毫秒。 相当的性能提升。

延迟可能更多地来自于重新设置活动样式所需的计算,而不是此循环的成本。