【发布时间】:2021-08-04 16:44:42
【问题描述】:
我正在试用 Intersection Observer API,但是当我使用 setInverval 时,我走到了死胡同。
所以我有这个div,它的宽度和高度为 500 像素。如果 div 在视口中,我想触发setInterval,它将每 3 秒记录一次。但是,如果我滚动并且 div 在视口之外,我想清除该间隔。也就是说,停止间隔并完全停止记录。
现在,当我滚动并且 div 在视口中时,setInterval 和日志记录开始,但是如果我再次滚动并且 div 不在视口中,setInterval 并且日志记录不会停止。
我在这里做错了什么?
这是sn-p:
const mainContainer = document.querySelector('#main-container');
const callback = (entries, observer) => {
entries.forEach(item => {
let intervalVar;
if (item.isIntersecting) {
intervalVar = setInterval(() => {
console.log('div is in viewport');
}, 3000);
} else {
console.log('div is not in viewport');
clearInterval(intervalVar);
}
})
};
const options = {
threshold: 0.1
};
const observer = new IntersectionObserver(callback, options);
observer.observe(mainContainer);
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<div id="main-container" style="width: 540px; height: 440px;"></div>
【问题讨论】:
-
每次交集改变时都会调用回调,所以
intervalVar被重新声明(它也为每个条目重新声明)。要么为每个需要的条目创建一个包含间隔 id 的 Map,或者更好的是,根本不在观察者回调中使用间隔。只需在item.isIntersecting为真时触发一个函数,并在它为假时触发它。该函数可以在内部跟踪 id 并根据是否使用 true 或 false 来决定如何处理这些 id。 -
你能提供一个sn-p吗?
标签: javascript jquery setinterval intersection-observer