将 src 换成 lazy

swapping src to lazy

对现有的延迟加载插件不满意(它们太复杂了,我什至无法理解其中的代码),我想我可以创建一个简单易懂的延迟加载图像的脚本。

我的想法很简单。从以下(变形的)img 标签开始。

<img lazy="http://lorempixel.com/400/200"/>

使用 javascript,在向上或向下滚动页面时将单词 "lazy" 替换为 "src"。

function hackyaFunction_lazy() {
  [].forEach.call(document.querySelectorAll('img[lazy]'), function(img) {
    img.setAttribute('src', img.getAttribute('lazy'));

    img.onload = function() {

      var imgs = document.querySelectorAll('[lazy]');
      for (i = 0; i < imgs.length; i++) {
        var o = imgs[i],
          lazy = o.getAttribute('lazy');
        if (o.y <= (window.screen.height + window.scrollY + 50) && o.y >= (window.scrollY - 50)) {
          o.setAttribute('src', lazy);
          o.removeAttribute('lazy');
        }
      }
    }
    window.onload = window.onscroll = hackyaFunction_lazy;

  });
}

我对 javascript 的了解足够多,可以将点点滴滴拼凑起来,做出有用的东西。上面的代码有点管用。

在我的控制台上,我看到单词 "lazy" 已成功替换为视口中图像的 "src"。

但是,在视口之外的图像,这是我所看到的。

<img lazy="http://lorempixel.com/400/200/sports/Dummy-Text" src="http://lorempixel.com/400/200/sports/Dummy-Text">

所以我有一半的工作代码&这是我能做的最好的。

我应该使用任何一个可用的插件;只是想看看我是否可以创建一些简单易用的东西。

现在我已经快要让这个东西发挥作用了,我舍不得放弃它。

任何帮助将不胜感激。

我想在 jsfiddle 上将所有内容 (html & js) 放在一起,但图像无法在 jsfiddle 上显示。不知道为什么。

该代码适用于本地环境(如所述)。

.forEach() 中的第一行更改了当前图像的 src 而不删除 lazy 并且没有测试它是否在视图中,所以在 .forEach() 有 运行 他们将 所有 更新的每张图片的那一行。这就是为什么当您使用开发工具检查元素时,许多图像都具有 srclazy 属性。

如果想法是仅在图像滚动到视图中时设置 src,并且对于页面加载时已经在视图中的任何图像,您可以通过仅保留内部 for 函数循环:

function hackyaFunction_lazy() {
  var imgs = document.querySelectorAll('[lazy]');
  for (i = 0; i < imgs.length; i++) {
    var o = imgs[i];
    if (o.y <= (window.screen.height + window.scrollY + 50) && o.y >= (window.scrollY - 50)) {
      o.src = o.getAttribute('lazy');
      o.removeAttribute('lazy');
    }
  }
}

window.onload = window.onscroll = hackyaFunction_lazy;

这是有效的,因为在每次滚动时,它首先选择仍然具有 lazy 属性的任何元素,然后对于这些元素,它测试它们是否在视图中,如果在视图中,则设置它们的 src 和删除 lazy。尚未滚动到视图中的元素不会更新。

看到它在这里工作:https://jsfiddle.net/vb779g7v/2/

Edit/P。 S. 请注意,您的 if 测试检查元素是否在视图中是不正确的,因为 screen.height 顾名思义给出了整个 screen[=37] 的高度=],不是浏览器客户区的高度。但这并不是您问题的核心,所以我将修复它作为 reader...

的练习