Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript setTimeout越来越快-如何暂停它?_Javascript_Settimeout - Fatal编程技术网

Javascript setTimeout越来越快-如何暂停它?

Javascript setTimeout越来越快-如何暂停它?,javascript,settimeout,Javascript,Settimeout,我这里有一个脚本,效果很好。一旦元素滚动到视图中,它就会通过向上滚动来转换元素。但我不能让它停止一旦它滚动出视图,更糟糕的是,它越来越快,每次滚动到视图!如何重置超时?很明显,我使用clearTimeout是错误的,但我不知道如何修复它 observer = new IntersectionObserver(entries => { entries.forEach(entry => { if (entry.isIntersecting) {

我这里有一个脚本,效果很好。一旦元素滚动到视图中,它就会通过向上滚动来转换元素。但我不能让它停止一旦它滚动出视图,更糟糕的是,它越来越快,每次滚动到视图!如何重置超时?很明显,我使用clearTimeout是错误的,但我不知道如何修复它

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。。。