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


今天看到一个面试题,是关于img图片加载方面的,有必要记录一下。其实关于这个问题,只要知道图片什么时候加载完成就能解决了。

通过onload事件判断Img标签加载完成

实现逻辑:新建一个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>

实现效果

lp_img_load.gif

加上setTimeout后,看到的效果更加明显,我这里加了500毫秒的延迟(录屏软件只支持录制8秒的时间...)

setTimeout_load_img.gif

其实我在网上还看到了一种答案,通过onreadystatechange事件实现监听,于是在我本地调试了一下,发现并不能实现,img实例对象上并没有这个属性方法。查了查MDN,发现目前仅有XmlHttpRequest对象和Document对象中存在onreadystatechange属性,而对于其它元素onreadystatechange此属性并不存在。

因此对于其它元素需要慎用onreadystatechange事件

不过我电脑上目前只有ChormeSafari两种浏览器,对于onreadystatechange测试的覆盖面不全,所以我上面的结论可能还需要进一步验证才行,感兴趣的掘友可以调试一下~。

扩展知识

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

  1. HTML文档渲染解析,如果解析到img标签的src时,浏览器就会立刻开启一个线程去请求图片资源。
  2. 动态创建img标签,设置src属性时,即使这个img标签没有添加到dom元素中,也会立即发送一个请求。
// 例1:
const img = new Image();
img.src = 'http://xxxx.com/x/y/z/ccc.png';

上面的代码如果运行起来后,就会发送请求。如图:

image.png

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

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

答案:会请求。如图:

image.png

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

  1. img标签设置样式display:none或者visibility: hidden,隐藏img标签,无法做到禁止发送请求。
<img src="http://xxx.com/x/sdf.png" style="display: none;">
或者
<img src="http://xxx.com/x/sdf.png" style="visibility: hidden;">
  1. 将图片设置为元素的背景图片,但此元素不存在,可以做到禁止发送请求。
<!DOCTYPE html>
<html lang='en'>
<head>
    <meta charset='UTF-8'>
    <title></title>
    <style>
        .test {
            height200px;
            background-imageurl('http://eb118-file.cdn.bcebos.com/upload/39148b2a545b48bf9b4ee95fd1b7f1eb_1515564089.png?');
        }
    
</style>
</head>
<body>
<div></div>
</body>
</html>

dom文档中不存在test元素时,即使设置了背景图片,也不会发送请求,只有test元素存在时才会发送请求。

另外这个例子其实有点不太贴切,img标签background-image二者有着本质的区别。一个属于HTML标签,另一个属于css样式,加载机制和解析顺序也不同。

一个完整的页面是由jshtmlcss组成的,按照解析机制,html元素会优先解析,尽管css样式是放在head标签内的,但也不意味着它会优先加载,它只有等到html文档加载完成后才会执行。而img标签属于网页内容,所以img标签会随着网页解析渲染优先于css样式表加载出来。


作者:娜个小部呀

来源:https://juejin.cn/post/7340167256267391012


相关推荐

  • 不良资产投资人,盯上一级市场了
  • 去 TCL 了,一些我面试的小心机
  • 字节员工:一直误以为自己是“老板”的嫡系,直到被裁的那一刻发现自己只是干活的牛马
  • 招聘|营销算法工程师
  • 数据赋能实战:企业产品与业务的升级之道!
  • 指标归因在互联网平台的应用
  • 剑桥大学:基于语音的大模型攻击,轻松“操纵”多模态大模型
  • 斯坦福提出大模型最强架构TTT,超越Transformers
  • OpenAI神秘項目「草莓」曝光!自我进化已超越人类智能?马斯克嘲讽:回形针灾难
  • Mamba真比Transformer更优吗?Mamba原作者:两个都要!混合架构才是最优解
  • 已婚男子「出轨」AI女友,无法自拔!GPT-4o发布在即,年入十亿美金产业爆发
  • OpenAI秘密武器「草莓」计划曝光!Q*推理能力大爆发,逼近AGI L2里程碑
  • GraphRAG科普长文推荐:知识图谱增强生成宣言,为通用人工智能注入知识
  • 端侧设备AI代理优化框架问世,领域内准确率可达97%
  • 豆包大模型团队发布全新Detail Image Caption评估基准,提升VLM Caption评测可靠性
  • Gemini 1.5 Pro装进机器人,参观一遍公司就能礼宾、带路
  • OpenAI Lilian Weng万字长文解读LLM幻觉:从理解到克服
  • 大厂掀起视频生成「军备竞赛」,AI 真能干掉好莱坞?
  • 大模型中的Token,一文读懂
  • MSRA:视觉生成六大技术问题