Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript事件滚动赢得';t火_Javascript_Html - Fatal编程技术网

JavaScript事件滚动赢得';t火

JavaScript事件滚动赢得';t火,javascript,html,Javascript,Html,虽然我找不到任何解决问题的办法,但我已经到处看看了。我正在设计一个图像组合网站,出于性能原因,希望在图像进入视口时加载它们。最初处于视图中的图像可以正常加载,但在滚动时不会加载图像 <script> registerListener('load', lazyLoad); registerListener('scroll', lazyLoad); function isInViewport(elem) { var distance = elem

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

<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>

寄存器列表器('load',lazyLoad);
registerListener('滚动',懒散加载);
函数isInViewport(elem){
var distance=elem.getBoundingClientRect();
返回(
distance.top>=0&&
距离左>=0&&

distance.bottom您不应该再使用滚动事件延迟加载图像,现在有更好的执行选项可用。 最新的方法(目前仅适用于最新的chrome浏览器)是使用
,如果您将加载属性添加到img(甚至iframe),它将在用户看到后加载。无需JS

延迟加载图像的第二个最佳方法是使用。通过此方法,您可以定义浏览器应监视的对象,并定义与另一个对象(或整个窗口)的交点,然后在发生此交点时作出反应

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

var options = {
 threshold: 2.0
}

var observer = new IntersectionObserver(callback, options);
var target = document.querySelector('.lazy-load');
observer.observe(target);
root默认为浏览器视口,这是图像延迟加载所需的

然后为观察者定义目标:

var options = {
 threshold: 2.0
}

var observer = new IntersectionObserver(callback, options);
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开发人员文档,有关更多详细信息和更多示例,请参见页面。

您不应该再使用滚动事件延迟加载图像,现在有更好的执行选项可用。 最新的方法(目前仅适用于最新的chrome浏览器)是使用
,如果您将加载属性添加到img(甚至iframe),它将在用户看到后加载。无需JS

延迟加载图像的第二个最佳方法是使用。通过此方法,您可以定义浏览器应监视的对象,并定义与另一个对象(或整个窗口)的交点,然后在发生此交点时作出反应

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

var options = {
 threshold: 2.0
}

var observer = new IntersectionObserver(callback, options);
var target = document.querySelector('.lazy-load');
observer.observe(target);
root默认为浏览器视口,这是图像延迟加载所需的

然后为观察者定义目标:

var options = {
 threshold: 2.0
}

var observer = new IntersectionObserver(callback, options);
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开发者文档,有关更多详细信息和更多示例,请参见页面。

您有什么问题吗?
lazyLoad
函数应该跳过已经加载的图像。问题是我似乎无法启动scroll事件并运行
lazyLoad
函数'看不出函数无法运行的任何原因。Put
console.log(“滚动”)
lazyLoad
函数中查看它是否正在运行。我刚刚尝试了你的代码,它被调用。你有什么问题吗?
lazyLoad
函数应该跳过已经加载的图像。问题是我似乎无法启动滚动事件并运行
lazyLoad
函数。我没有看到任何问题函数无法运行的原因。将
console.log(“滚动”)
放在
lazyLoad
函数中,查看它是否正在运行。我刚刚尝试了你的代码,它被调用了。