intersectionObserver 仅触发一次

intersectionObserver only fires once

提问人:bukzor 提问时间:1/6/2020 最后编辑:bukzor 更新时间:1/6/2020 访问量:5539

问:

我正在尝试使用新的 Intersection Observer API,但我只能触发一次它的事件。我相信我正确地使用它,因为我几乎逐字使用了 MDN 示例

https://jsfiddle.net/bukzor/epuwztn0/106/

function startObserver() {
  // Almost verbatim from MDN docs:
  //   https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API
  let options = {
    root: document.querySelector('#svg'),
    rootMargin: '0px',
    threshold: 0.50,
  }

  let observer = new IntersectionObserver(onIntersection, options);

  let target = document.querySelector('circle');
  observer.observe(target);
}

function onIntersection(entries, observer) {
  // Simply log all intersectiono entries.
  console.log(observer)
  console.log("intersections:")
  entries.forEach(function(entry) {
    console.log(entry)
    // This code is just a wild guess, but it still won't fire a second time.
    observer.observe(entry.target)
  })
}

当我运行它时,我在控制台中只得到一个条目,而没有另一个条目。它提到的零大小矩形,似乎是额外的症状,但我无法找到原因。isVisible: false

IntersectionObserver {root: svg#svg, rootMargin: "0px 0px 0px 0px", thresholds: Array(1), delay: 0, trackVisibility: false}
intersections:
IntersectionObserverEntry {time: 550.8100000151899, rootBounds: DOMRectReadOnly, boundingClientRect: DOMRectReadOnly, intersectionRect: DOMRectReadOnly, isIntersecting: false, …}
   time: 550.8100000151899
   rootBounds: DOMRectReadOnly {x: 0, y: 0, width: 0, height: 0, top: 0, …}
   boundingClientRect: DOMRectReadOnly {x: 0, y: 0, width: 0, height: 0, top: 0, …}
   intersectionRect: DOMRectReadOnly {x: 0, y: 0, width: 0, height: 0, top: 0, …}
   isIntersecting: false
   intersectionRatio: 0
   target: circle
   isVisible: false

更重要的是,我相信 API 本身在我的浏览器上运行良好,因为这个演示运行良好(如下)。这实际上与我的例子非常相似。

http://szager-chromium.github.io/IntersectionObserver/demo/svg/

我做错了什么?

javascript dom 交集观察者

评论

0赞 bukzor 1/6/2020
实际上,如果我将该演示移动到 jsfiddle,它将停止工作 D:jsfiddle.net/bukzor/1bm5r7uh/3
0赞 Emiel Zuurbier 1/6/2020
代码运行良好,但您尚未解释要完成的任务。现在,它将观察元素内部的元素。如果你的一半圆在SVG的视口内或视口外,它将触发。这是你想要的吗?circle#svg
0赞 Alexander Staroselsky 1/6/2020
我想他们是在问为什么它只触发一次,而不是每次元素进入视口时。
0赞 bukzor 1/6/2020
@EmielZuurbier 这是你看到的行为吗?这与我所看到的不同。当页面加载时,我会得到一个交集事件,并且永远不会再次出现,即使圆形对象与 svg 有不同级别的交集,具体取决于鼠标的位置。
1赞 Marmelador 10/29/2020
我以为我遇到了同样的问题,然后意识到这是用户错误:例如,Firefox重复控制台日志实际上没有显示;相反,计数器显示在这些控制台输出的第一个 ON。人们可能会错过这个计数器,并认为控制台只被记录到一次。现在感觉有点白痴。

答: 暂无答案