页面加载时立即触发 IntersectionObserver 回调

IntersectionObserver callback firing immediately on page load

我是 IntersectionObserver API 的新手,我一直在试验这段代码:

let target = document.querySelector('.lazy-load');

let options = {
    root: null,
    rootMargin: '0px',
    threshold: 0
}

let observer = new IntersectionObserver(callback, options);

observer.observe(target);

function callback() {
    console.log('observer triggered.');
}

这似乎可以正常工作,每当 .lazy-load 元素进入视口时都会调用 callback(),但 callback() 也会在页面初始加载时触发一次,这会触发`console.log('observer triggered.');

是否有在页面加载时触发此回调的原因?还是我的实现方式有误?

编辑:将代码更改为以下内容仍会在页面加载时触发回调。

let target = document.querySelector('.lazy-load');

let options = {
    root: null,
    rootMargin: '0px',
    threshold: 0
}

let callback = function(entries, observer) {
    entries.forEach(entry => {

        console.log('observer triggered.');

    });
};

let observer = new IntersectionObserver(callback, options);

observer.observe(target);

这是默认行为。当您实例化 IntersectionObserver 的实例时,callback 将被触发。

这种情况建议提防

entries.forEach(entry => {
  if (entry.intersectionRatio > 0) {
    entry.target.classList.add('in-viewport');
  } else {
    entry.target.classList.remove('in-viewport');
  }
});

我还发现这篇文章和文档非常有用,特别是关于 IntersectionObserverEntry 的 intersectionRatioisIntersecting 属性。

·https://www.smashingmagazine.com/2018/01/deferring-lazy-loading-intersection-observer-api/

·https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver

·https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserverEntry

听起来很简单,我通过

解决了这个问题
  1. 添加阈值比较条件
  2. 为观察者的初始化添加一个轻微的延迟
    const options = {
      threshold: 1.0,
    };

      setTimeout(() => {
        observer = new IntersectionObserver(([entry]) => {
          console.log("OBSERVER TRIGGERED 1");

          if (
            entry &&
            entry.isIntersecting &&
            entry.intersectionRatio >= options.threshold
          ) {
            console.log("OBSERVER TRIGGERED 2");
          }
        }, options);

        observer.observe(observerRef.value);
      }, 2000);

我还建议 临时 将可观察元素的背景颜色更改为:

.observer {
  background-color: red;
}

并进行页面刷新。这样您可能会真正看到屏幕上闪烁的红色背景从而触发事件。

现在,在你向我扔西红柿之前——就我而言——我在网页上有很多视频。视频 HTML 元素不会立即“展开”,因为浏览器需要下载有关海报图像的信息。因此页面已加载,但视频仍在一个接一个地加载。添加轻微延迟解决了问题,以便浏览器有时间扩展视频内容。