懒惰滚动'存在?

时间:2015-02-10 00:36:50

标签: javascript scroll

似乎只是我的话)

有一段时间后执行函数的方法吗?

我正在尝试为我的网站编写一个高级的scrollspy脚本,而我正在考虑的是不是立即执行onScroll操作,而是在一段时间后执行。如果用户快速滚动并且有很多停靠点,我希望scrollspy仅在停止时刷新导航链接,如果用户滚动缓慢(并且可能没有停止),我希望scrolllspy每隔0.6秒刷新导航链接。

不幸的是,我不知道从哪里开始。

我试图升级此代码:

var lastId,
    topMenu = jQuery(".a1-nav"),
    topMenuHeight = document.querySelector('header .top-header').offsetHeight;
    menuItems = topMenu.find("a"),
    scrollItems = menuItems.map(function(){
      var item = jQuery(jQuery(this).attr("href"));
      if (item.length) { return item; }
    });

menuItems.click(function(e){
  var href = jQuery(this).attr("href"),
      offsetTop = href === "#" ? 0 : jQuery(href).offset().top-topMenuHeight+1;
  jQuery('html, body').stop().animate({ 
      scrollTop: offsetTop
  }, 300);
  e.preventDefault();
});

jQuery(window).scroll(function(){
   var fromTop = jQuery(this).scrollTop()+topMenuHeight;

   var cur = scrollItems.map(function(){
     if (jQuery(this).offset().top < fromTop)
       return this;
   });

   cur = cur[cur.length-1];
   var id = cur && cur.length ? cur[0].id : "";

   if (lastId !== id) {
       lastId = id;
       // Set/remove active class
     console.log(id);
       menuItems
         .removeClass("active")
         .filter("[href=#"+id+"]").addClass("active");
   }                   
});

1 个答案:

答案 0 :(得分:5)

嗯,我这样做的方式是:

var debounce;
var interval;
$(window).on('scroll', function() {
    if (typeof debounce != "undefined") { 
        clearTimeout(debounce); 
    } else if (typeof interval == "undefined" {
        interval = setInterval(update, 500);
    }
    debounce = setTimeout(function() {
        interval = clearInterval(interval);
    }, 1000);
});
var update = function() {
    //your scroll code here
}

这使得当他们开始滚动时,我们运行&#34;更新&#34;每半秒,一旦他们停止滚动一秒钟,我们清除间隔。不需要再次运行它,因为我们知道它至少运行了一次,因为它们停止了滚动。