Javascript setTimeout越来越快-如何暂停它?
我这里有一个脚本,效果很好。一旦元素滚动到视图中,它就会通过向上滚动来转换元素。但我不能让它停止一旦它滚动出视图,更糟糕的是,它越来越快,每次滚动到视图!如何重置超时?很明显,我使用clearTimeout是错误的,但我不知道如何修复它Javascript setTimeout越来越快-如何暂停它?,javascript,settimeout,Javascript,Settimeout,我这里有一个脚本,效果很好。一旦元素滚动到视图中,它就会通过向上滚动来转换元素。但我不能让它停止一旦它滚动出视图,更糟糕的是,它越来越快,每次滚动到视图!如何重置超时?很明显,我使用clearTimeout是错误的,但我不知道如何修复它 observer = new IntersectionObserver(entries => { entries.forEach(entry => { if (entry.isIntersecting) {
observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
reviewScroll();
} else {
stopReviewScroll();
//What do I put here to pause reviewScroll?
}
});
});
var reviewscroller = document.querySelector('.ReviewList__reviewCardContainer__1hiY0');
function reviewScroll() {
reviewscroller.style.opacity = 1;
i++;
reviewscroller.style.transform = 'translate3D(0px, -'+i+'px , 0px)';
opac = i * .001;
reviewscroller.style.opacity = 1-opac;
clearTimeout(setTimeout(reviewScroll, 40));
setTimeout(reviewScroll, 40);
if (reviewscroller.style.opacity < -0.25) {
reviewscroller.opacity = 1;
i = 0;
reviewscroller.style.transform = 'translate3D(0px, -'+i+'px , 0px)';
}
}
function stopReviewScroll() {
clearTimeout(reviewScroll);
}
document.querySelectorAll('.ReviewList__reviewCardContainer__1hiY0').forEach(image => { observer.observe(image); });
observer=新的IntersectionObserver(条目=>{
entries.forEach(entry=>{
if(输入。isIntersecting){
reviewScroll();
}否则{
stopReviewScroll();
//我在这里放什么来暂停reviewScroll?
}
});
});
var reviewscroller=document.querySelector('.ReviewList__reviewCardContainer__1hiY0');
函数reviewScroll(){
reviewscroller.style.opacity=1;
i++;
reviewscroller.style.transform='translate3D(0px,-'+i+'px,0px)';
opac=i*.001;
reviewscroller.style.opacity=1-opac;
clearTimeout(setTimeout(reviewScroll,40));
设置超时(reviewScroll,40);
如果(reviewscroller.style.opacity<-0.25){
reviewscroller.opacity=1;
i=0;
reviewscroller.style.transform='translate3D(0px,-'+i+'px,0px)';
}
}
函数stopReviewScroll(){
clearTimeout(reviewScroll);
}
document.queryselectoral('.ReviewList__reviewCardContainer__1hiY0').forEach(image=>{observer.observe(image);});
您应该取消旧计时器并安装新计时器,如下所示:
var timerId=null;
函数reviewScroll(){
// ...
if(timerId){
清除超时(timerId);
}
timerId=设置超时(reviewScroll,40);
// ...
}
clearTimeout
需要获取超时id,而不是元素。将setTimeout
分配给一个变量,并将其传递给它。cleartimout(setTimeout(reviewScroll,40))你在这里期待什么?也许只需要花多一点时间来研究这些函数的文档。如前所述,clearTimeout(setTimeout(reviewScroll,40))
没有意义:您设置了一个超时,它返回一个整数作为id,然后立即将其清除。如果我理解正确,有多个元素可以滚动?将它们传递到reviewScroll()
中,就像这样:reviewScroll(条目)
?另外,什么是i
,它在哪里声明和初始化?超时只会在这么多毫秒后触发一次。如果需要清除它,请在第一次设置之前设置一个全局变量:var myTimeout
,然后在必要时使用clearTimeout(myTimeout)
,以及myTimeout=setTimeout(reviewScroll,40)
。40有点快。。。用2000测试代码是否有效,然后减少它。在第一次setTimeout
之后,timerId
将永远不会为null
,0
,或任何其他false
y。。。