Intersection Observer:每个元素只调用一次函数
Intersection Observer: Call a function only once per element
我正在使用 Intersection Observer API 来跟踪网页上多个元素的可见性。当元素变为可见时,应执行函数 callback()
。限制:对于每个元素,函数只能执行一次。
这是我当前对网络分析项目的实施:
const elements = document.querySelectorAll('[data-observable]');
const callback = str => { console.log(str); };
const observer = new IntersectionObserver(handleIntersection);
elements.forEach(obs => {
observer.observe(obs);
});
function handleIntersection(entries, observer){
entries.forEach(entry => {
if (entry.intersectionRatio > 0) {
// Call this function only once per element, without modifying entry object
callback('observer-' + entry.target.getAttribute('data-observable'));
}
});
}
我正在努力寻找不修改现有元素、IntersectionObserver 或 IntersectionObserverEntries 的解决方案。
通常我会使用闭包来确保函数只执行一次:
function once(func) {
let executed = false;
return function() {
if (!executed) {
executed = true;
return func.apply(this, arguments);
}
};
}
但在这种情况下,我很难应用该函数,因为 IntersectionObserver 使用奇怪的回调迭代器逻辑,每次任何元素更改时都会执行该逻辑(而不是使用事件驱动模型)。
任何想法,如何实现不改变其他元素或对象的每个元素函数调用一次?
作为 James pointed out in the comments, the easiest solution to this problem is unobserving 元素一旦变得可见并且回调已被调用。
const elements = document.querySelectorAll('[data-observable]');
const callback = str => { console.log(str); };
const observer = new IntersectionObserver(handleIntersection);
elements.forEach(obs => {
observer.observe(obs);
});
function handleIntersection(entries, observer){
entries.forEach(entry => {
if (entry.intersectionRatio > 0) {
callback('observer-' + entry.target.getAttribute('data-observable'));
observer.unobserve(entry.target);
}
});
}
我没有找到任何可行的解决方案来使用闭包来控制调用函数的频率。
我正在使用 Intersection Observer API 来跟踪网页上多个元素的可见性。当元素变为可见时,应执行函数 callback()
。限制:对于每个元素,函数只能执行一次。
这是我当前对网络分析项目的实施:
const elements = document.querySelectorAll('[data-observable]');
const callback = str => { console.log(str); };
const observer = new IntersectionObserver(handleIntersection);
elements.forEach(obs => {
observer.observe(obs);
});
function handleIntersection(entries, observer){
entries.forEach(entry => {
if (entry.intersectionRatio > 0) {
// Call this function only once per element, without modifying entry object
callback('observer-' + entry.target.getAttribute('data-observable'));
}
});
}
我正在努力寻找不修改现有元素、IntersectionObserver 或 IntersectionObserverEntries 的解决方案。
通常我会使用闭包来确保函数只执行一次:
function once(func) {
let executed = false;
return function() {
if (!executed) {
executed = true;
return func.apply(this, arguments);
}
};
}
但在这种情况下,我很难应用该函数,因为 IntersectionObserver 使用奇怪的回调迭代器逻辑,每次任何元素更改时都会执行该逻辑(而不是使用事件驱动模型)。
任何想法,如何实现不改变其他元素或对象的每个元素函数调用一次?
作为 James pointed out in the comments, the easiest solution to this problem is unobserving 元素一旦变得可见并且回调已被调用。
const elements = document.querySelectorAll('[data-observable]');
const callback = str => { console.log(str); };
const observer = new IntersectionObserver(handleIntersection);
elements.forEach(obs => {
observer.observe(obs);
});
function handleIntersection(entries, observer){
entries.forEach(entry => {
if (entry.intersectionRatio > 0) {
callback('observer-' + entry.target.getAttribute('data-observable'));
observer.unobserve(entry.target);
}
});
}
我没有找到任何可行的解决方案来使用闭包来控制调用函数的频率。