JavaScript事件滚动不会触发

问题描述 投票:0回答:1

虽然我找不到任何解决问题的方法,但我已经四处看看了。我正在设计一个图像组合网站,并且出于性能原因希望在图像进入视口时加载图像。最初在视图中的图像加载正常,但滚动时没有图像加载

<script>
    registerListener('load', lazyLoad);
    registerListener('scroll', lazyLoad);

    function isInViewport(elem) {
        var distance = elem.getBoundingClientRect();
        return (
            distance.top >= 0 &&
            distance.left >= 0 &&
            distance.bottom <= (window.innerHeight || document.documentElement.clientHeight) && distance.right <=(window.innerWidth || document.documentElement.clientWidth)
        ); 
    }; 

    var image = [];

    lazy = document.getElementsByClassName('lazy');
    console.log("there are  " + lazy.length + " lazy images")

    function lazyLoad() {
        for (i = 0; i < lazy.length; i++) {
            console.log('attempting to load' + (i+1));
            if (isInViewport(lazy[i])) {
                console.log("loaded: image " + (i+1));
                lazy[i].src = lazy[i].getAttribute('data-src');
            }            
        }
    }

    function registerListener(event, func) {
        window.addEventListener(event, func);
    }
</script>

非常感谢任何帮助(我在Stackoverflow上的第一个问题所以如果我做错了请告诉我)

javascript html
1个回答
2
投票

您不应该使用滚动事件来延迟加载图像,现在有更好的性能选项可用。最新的方法(目前仅适用于最新的Chrome浏览器)是使用<img src="pic.jpg" loading="lazy">如果将加载属性添加到img(甚至是iframe),它将在用户可见时加载。没有JS需要。

延迟加载图像的第二个最佳方法是使用intersection observer使用此功能,您可以定义浏览器应该观察的对象,并定义与另一个对象(或整个窗口)的交集,然后在发生此交叉时作出反应。

首先,你必须定义你的观察者:

var options = {
 threshold: 2.0
}

var observer = new IntersectionObserver(callback, options);

root默认为浏览器视口,这是我们图像延迟加载所需的。

然后为观察者定义目标:

var target = document.querySelector('.lazy-load');
observer.observe(target);

最后,定义目标可见后应该发生的事情:

var callback = function(entries, observer) { 
  entries.forEach(entry => {
  // Each entry describes an intersection change for one observed
  });
};

所有示例代码均来自mozillas开发人员文档,有关详细信息和更多示例,请参阅该页面。

© www.soinside.com 2019 - 2024. All rights reserved.