js如何控制一次只加载一张图片,加载完成后再加载下一张

随笔2周前发布 中洪熙
5 0 0

实现逻辑:新建一个Image对象实例,为实例对象设置src属性等,在onload事件中添加此实例对象到父元素中,然后将图片地址数组中的第一个元素剔除,继续调用此方法直到存储图片地址的数组为空。

const imgArrs = [...]; // 图片地址
const content = document.getElementById('content');
const loadImg = () => {
  if (!imgArrs.length)  return;
  const img = new Image(); // 新建一个Image对象
  img.src = imgArrs[0];
  img.setAttribute('class', 'img-item');
  img.onload = () => { // 监听onload事件
    // setTimeout(() => { // 使用setTimeout可以更清晰的看清实现效果
      content.appendChild(img);
        imgArrs.shift();
        loadImg();
    // }, 1000);
  }
  img.onerror = () => {
    // do something here
  }
}
  loadImg();

</script>

扩展知识

img标签是什么时候发送图片资源请求的?

HTML文档渲染解析,如果解析到img标签的src时,浏览器就会立刻开启一个线程去请求图片资源。

动态创建img标签,设置src属性时,即使这个img标签没有添加到dom元素中,也会立即发送一个请求。
/例1:

const img = new Image();
img.src = 'http://xxxx.com/x/y/z/ccc.png';

上面的代码如果运行起来后,就会发送请求。
再看一个例子:创建了一个div元素,然后将存放img标签元素的变量添加到div元素内,而div元素此时并不在dom文档中,页面不会展示该div元素,那么浏览器会发送请求吗?
/例2:

const img = `<img src='https://xxxx.com/x/y/z/ccc.png'>`;
const dom = document.createElement('div');
dom.innerHtml = img;

答案:会请求。

通过设置css属性能否做到禁止发送图片请求资源?

1给img标签设置样式display:none或者visibility: hidden,隐藏img标签,无法做到禁止发送请求。

<img src="https://xxx.com/x/sdf.png" style="display: none;">
或者
<img src="https://xxx.com/x/sdf.png" style="visibility: hidden;">

2、将图片设置为元素的背景图片,但此元素不存在,可以做到禁止发送请求

<!DOCTYPE html>
<html lang='en'>
<head>
    <meta charset='UTF-8'>
    <title></title>
    <style>
        .test {
            height: 200px;
            background-image: url('https://eb118-file.cdn.bcebos.com/upload/39148b2a545b48bf9b4ee95fd1b7f1eb_1515564089.png?');
        }
    </style>
</head>
<body>
<div></div>
</body>
</html>

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...