【问题标题】:Intersection observer "unloads" images after looping on carousel (Siema)交叉路口观察者在轮播后“卸载”图像(Siema)
【发布时间】:2020-02-05 13:42:25
【问题描述】:

我有这个fiddle 来显示我的问题。

我已经为延迟加载图片做了一个交叉点观察器,代码:

const images = document.querySelectorAll("[data-src]");

function preloadImage(img){
    const src = img.getAttribute("data-src");
    if (!src) { return; }
    img.src= src;
}

const imgOptions = {
    threshold: 0,
    rootMargin: "0px 0px 300px 0px"
};

const imgObserver = new IntersectionObserver( (entries, imgObserver) => {
    entries.forEach(entry => {
        if(!entry.isIntersecting){
            return;
        } else {
            preloadImage(entry.target);
            imgObserver.unobserve(entry.target);
        }
    })
}, imgOptions);

images.forEach( image => {
    imgObserver.observe(image);
});

当我循环通过 Siema 轮播时出现问题,最后一张和第一张图像“卸载”,意思是 src 返回到 data-src,尽管它在相交后被告知 unobserve

要查看问题,只需单击小提琴中的“上一个”。第一张图片会消失,但它已经加载了。

为什么会这样,我做错了什么?

编辑: Fixed working fiddle,谢谢@ohladkov

【问题讨论】:

    标签: javascript carousel lazy-loading intersection-observer siema


    【解决方案1】:

    这是因为这个值:loop: 1。在const images = document.querySelectorAll ("[data-src]")中加载页面时只有6张图片,而当你初始化滑块时,它有10张图片。当滑块初始化时,您需要获取图像并调用您的观察者。 Siema 有一个 onInit 回调。 类似的东西:

    onInit() {
      const el = document.querySelector(this.config.selector); // get siema container
      const images = el.querySelectorAll("[data-src]"); // get all siema images
    
      images.forEach( image => {
        imgObserver.observe(image);
      });
    },
    

    希望对你有帮助!

    【讨论】:

    • 我什至没有意识到轮播添加了额外的图像。这解决了它,非常感谢!
    • 不客气。如果打开循环模式并且幻灯片由 translate 属性更改,则大多数轮播会添加其他项目。
    猜你喜欢
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2023-04-06
    • 2022-01-23
    • 2022-01-18
    • 2021-07-20
    相关资源
    最近更新 更多