使用 IntersectionObserver 运行clearInterval

问题描述 投票:0回答:1

我有一个简短的代码,仅当元素在视图中时运行

setInterval
,但由于某种原因,当元素离开视图时它不会取消。我不知道我是否误解了
InteractionObserver
或者为什么
clearInterval
不起作用,但如果我登录
else
它会记录到控制台。

         let callback = (entries, observer) => {
            entries.forEach(entry => {
                let intval;
                if(entry.isIntersecting) {
                    const functionToRun = () => {console.log('running');}
                    intval = setInterval(functionToRun, random(500, 2000))
                } else {
                    clearInterval(intval);
                }
            })
        }
        let observer = new IntersectionObserver(callback, {
            threshold: [0.1]
        });
        observer.observe(elementToObserve);
javascript setinterval intersection-observer
1个回答
0
投票

每次项目进入/退出视口时都会调用观察者回调。

每次调用回调时都会创建 intval,因此您丢失了对之前在 setInterval 中获得的 timeoutId 的引用。

为了解决这个问题,建议使用 WeakMap 存储对 timeoutId 的引用,其中键是元素,示例如下:

const map = new WeakMap();
if (entry.isIntersecting) {
    map.set(entry.target, setInterval(functionToRun, random(500, 2000)));
} else {
    clearInterval(map.get(entry.target));
}
© www.soinside.com 2019 - 2024. All rights reserved.