【发布时间】:2020-11-09 20:47:15
【问题描述】:
我正在尝试使用 this constructor pattern boilerplate 在网络上构建一个微型 JS 库来模拟 InDesign text threading。这个想法是用户以所需的顺序提供函数 DOM 选择器,例如
var thread=new TextThread(['#container1','#container2']);
thread.build();
然后库从那里将第一个容器的文本内容拆分为每个单词的 span。当单词不在视野范围内时,库会按顺序将其移动到以下容器中。
这就是 IntersectionObserver 的用武之地: 我需要为每个提供给构造函数的容器分配一个观察者,然后让它观察其中的跨度。当 span 不在视野范围内时,它会触发观察者回调,该回调应该使用 .takeRecords() 方法遍历所有观察者,以检查每个容器中哪些 span 不在视野范围内。我已经让观察者触发他们的回调没有问题,但问题是在回调中引用所有观察者。
我尝试的是从样板文件中将数组变量存储在自执行函数中,然后在构建构造函数时,它将观察者推送到该数组。
var observers=[];
var Constructor = function (selectors) {
/*placeholder for code that selects and assigns the containers*/
containers.forEach((item, i) =>{
var options={
root: item,
rootMargin: '0px',
threshold: 1.0
}
var newObserver=new IntersectionObserver(callback,options);
observers.push(newObserver);
})
};
那么当文本被word分割成spans时
words.forEach((word,w) =>{
observers[ current container index ].observe(word); });
在回调中,触发回调的观察者的条目是可见的。但是,如果我尝试使用我的观察者数组变量引用 other 观察者,则 takeRecords() 返回一个空数组。这是我正在测试的回调:
function callback(entries){
//the entries for the observer firing the callback are returning correctly
console.log(entries)
//the forEach below doesn't work though. It returns an empty array for each observer.
observers.forEach((item, i) => {
console.log(item.takeRecords())
});
}
【问题讨论】:
-
请贴出
callback的代码。另外,我不明白您为什么需要引用其他观察者? -
@Bergi 我现在添加了回调代码。我想引用其他观察者,因为我希望能够查看 每个 容器中的哪些跨度已经消失,而不仅仅是触发回调的那个,因为我的操作接受回调有可能将更多元素移出视野。没错,这会触发另一个回调,但我正在查看是否可以一次处理所有回流,以便完全控制时间。
-
我认为你引用其他观察者就好了。它返回一个空数组,因为还没有更多的交集记录。您应该首先考虑到条目passed to the callback,而不是调用
takeRecordsmethod -
@Bergi 让我怀疑它是否正确返回的是 takeRecords 返回空即使对于触发回调的观察者,同时记录条目(请参阅编辑的回调)正确返回状态改变的元素数组
-
工作正常,as documented: "
takeRecords()返回一个IntersectionObserverEntry对象数组,每个目标元素对应一个自上次以来经历了交叉点变化的对象检查交叉点,通过调用此方法或通过自动调用对观察者的回调进行显式检查。注意:如果您使用回调来监视这些更改,则不要'不需要调用这个方法。"
标签: javascript class constructor scope intersection-observer