'lazy scroll' 存在吗?
Does 'lazy scroll' exist?
好像是我说的)
有没有办法在一段时间后执行一个函数?
我正在尝试为我的网站编写一个高级的 scrollspy 脚本,我正在考虑的是不是立即而是在一段时间后执行 onScroll 操作。如果用户快速滚动并且有很多停顿,我希望 scrollspy 仅在停止时刷新导航链接,并且如果用户滚动缓慢(并且可能没有停止)我希望 scrollspy 每 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");
}
});
好吧,我的做法是这样的:
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
}
这使得当他们开始滚动时,我们每半秒 运行 "update",一旦他们停止滚动一秒钟,我们就会清除间隔。无需再次 运行 因为我们知道它 运行 至少一次,因为他们停止滚动。
好像是我说的)
有没有办法在一段时间后执行一个函数?
我正在尝试为我的网站编写一个高级的 scrollspy 脚本,我正在考虑的是不是立即而是在一段时间后执行 onScroll 操作。如果用户快速滚动并且有很多停顿,我希望 scrollspy 仅在停止时刷新导航链接,并且如果用户滚动缓慢(并且可能没有停止)我希望 scrollspy 每 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");
}
});
好吧,我的做法是这样的:
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
}
这使得当他们开始滚动时,我们每半秒 运行 "update",一旦他们停止滚动一秒钟,我们就会清除间隔。无需再次 运行 因为我们知道它 运行 至少一次,因为他们停止滚动。