【发布时间】:2022-01-26 14:21:22
【问题描述】:
我正在尝试使用 Intersection Observer API。我有一个在我的第一次迭代中有效的函数。基本逻辑是,如果用户向下滚动并从篮子中添加或删除项目,一旦篮子再次出现(因为它位于文档的顶部),我就会触发 API 调用。
问题是它不会在滚动之前触发该功能,如果项目可见或滚动后再次可见,我想触发它(第二部分正在工作)
这里是原始js:
var observerTargets = document.querySelectorAll('[id^="mini-trolley"]');
var observerOptions = {
root: null, // null means root is viewport
rootMargin: '0px',
threshold: 0.01 // trigger callback when 1% of the element is visible
}
var activeClass = 'active';
var trigger = $('button');
var isCartItemClicked = false;
trigger.on('click', function() {
isCartItemClicked = true;
});
function observerCallback(entries, observer) {
entries.forEach(entry => {
if(entry.isIntersecting && isCartItemClicked){
$(observerTargets).removeClass(activeClass);
$(entry.target).addClass(activeClass);
isCartItemClicked = false;
console.log('isCartItemClicked and in view');
// do my api call function here
} else {
$(entry.target).removeClass(activeClass);
}
});
}
var observer = new IntersectionObserver(observerCallback, observerOptions);
[...observerTargets].forEach(target => observer.observe(target));
我已对此进行了更新,现在它会检查该项目是否可见。所以我更新了:
if(entry.isIntersecting && isCartItemClicked)
到
if((entry.isVisible || entry.isIntersecting) && isCartItemClicked)
据我了解的问题是观察者仅在滚动时触发,但 entry.isVisible 是观察者回调函数的一部分。
我已经创建了一个JSFIDDLE here(具有 HTML 和 CSS 标记)。
是否可以修改代码。奇怪的是 MDN page 没有提到 isVisible 属性,但它显然是函数的一部分。
【问题讨论】:
-
entry.isVisible 处于提案草案中,目前仅受 Chrome 支持。 web.dev/intersectionobserver-v2 。我不确定
isVisible的工作原理,但我相信如果要观察的元素在视口中可见(不透明度> 0,并且未被任何其他元素覆盖),它会返回。 -
啊好的,这意味着我需要另一种方法,比如 viewport offset top 大于 cart item height。
-
嗯,你可以使用 BoundingClientRect 来检查吗?
标签: javascript webapi intersection-observer