似乎只是我的话)
有一段时间后执行函数的方法吗?
我正在尝试为我的网站编写一个高级的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");
}
});
答案 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;每半秒,一旦他们停止滚动一秒钟,我们清除间隔。不需要再次运行它,因为我们知道它至少运行了一次,因为它们停止了滚动。