当前位置: 首页 > news >正文

img与script标签onload函数可能错过的解决办法

img标签的complete属性与decode方法

<body> <img src="a.jpg" id="pic"> <script rc="huge.js"></script> <script> document.getElementById("pic").onload = function() { console.log(document.getElementById("pic").width); } document.title=document.getElementById("pic").width </script> </body>

如果huge.js执行很久

// huge.js let start = Date.now(); while (Date.now() - start < 10000) { }

此时:

  1. HTML 解析到<img>,开始请求图片。
  2. 遇到<script src="huge.js">,停止解析 HTML。
  3. huge.js 执行 10 秒。
  4. huge.js 执行完后,HTML 继续解析。
  5. 执行后面的脚本,给图片绑定onload
  6. 图片加载完成时,触发onload

情况2:图片已经加载完成了

这是你代码里的一个潜在问题。

如果img图片很小,或者已经在浏览器缓存中。而juge.js执行时间很长

那么可能发生:

  1. 图片早就下载完成。
  2. 但后面的 JS 还没执行到。
  3. 你还没有给图片绑定:pic.onload函数,等 huge.js 结束后才绑定。此时图片的 load 事件已经过去了结果就是pic.onload函数不会触发

if (img.decode) { await img.decode(); } else { await new Promise(resolve => { if (img.complete) { resolve(); } else { img.onload = resolve; } }); }

decode()的特点:

  • 图片已经加载 → 立即返回成功
  • 图片未加载 → 等待加载完成
  • 图片损坏 → Promise reject

不会出现某些浏览器下第一次绘制空白的问题。

script标签是否有complete属性

如果脚本已经加载完成,后面才绑定 onload 呢?

更高级方案3:资源管理器(推荐大型项目)

很多人不知道,Google Maps SDK、Stripe SDK、PayPal SDK 都是这么干的。

class ResourceManager { static scripts = new Map(); static load(url) { if (!this.scripts.has(url)) { this.scripts.set( url, new Promise((resolve, reject) => { const s = document.createElement("script"); s.src = url; s.onload = resolve; s.onerror = reject; document.head.appendChild(s); }) ); } return this.scripts.get(url); } }

使用:

await ResourceManager.load("huge.js");

以后任何地方,都不会重复下载,这其实是很多 SDK Loader 的实现思路。

http://www.gsyq.cn/news/1595497.html

相关文章:

  • 客流统计系统如何构建数据驱动运营体系?(AI视觉 + IoT完整技术架构解析)
  • 膜结构球场的材料有哪些种类?
  • 测试复盘方法论:5Why根因分析在缺陷复盘中的应用
  • 2元一杯卷穿底价!浙江夜市上演硬核“摊位商战”,烟火气里藏市井竞争百态
  • 基于模糊控制的PID设计(simulink仿真)
  • 2026最新网盘不限速下载技巧:满速直链解析榨干带宽指南
  • IP文创产业规模发展,授权管控链条需要向精细化迈进
  • 第八章 多媒体技术基础(完整版)
  • 5分钟搞定:Adobe-GenP 3.0激活Adobe全系列软件终极指南
  • 2026脑机接口技术全景解析:从医疗突破到民用落地,未来产业迎来爆发前夜
  • 从零搭建 ReAct 智能体:打造具备思考与行动能力的自动化客服机器人
  • Instagram评论数据采集:从底层逻辑解析到营销策略优化
  • 语音操控超分辨率超声成像:多模态大语言模型驱动的AI医学影像新范式
  • Loop Engineering的理性审视:从Prompt Engineering到Loop Engineering的演进逻辑与利弊分析
  • RIS近场波束聚焦技术原理与实践
  • 钢丝绳的抗拉强度
  • 如何快速恢复加密压缩包密码:开源工具的完整实战指南
  • Windows 11安卓应用运行完整指南:四大模块实现专业级体验
  • 漏洞挖掘实战指南:从技能构建到报告撰写的完整路径
  • 使用JMeter对RabbitMQ进行性能测试与调优实战指南
  • URLFinder:解决网页资源提取难题的Go语言高效工具
  • 6小时完成AI小说推文:TaleStreamAI全自动工作流终极指南
  • 纯亚克力浴缸生产厂家排名
  • ROFL-Player:如何解决英雄联盟回放无法播放的终极难题?
  • ETS2LA终极指南:5步开启《欧洲卡车模拟2》自动驾驶新时代
  • CBCX外汇在在线支持上清楚吗?
  • 扩展-Agent Loop:自主执行的工程哲学
  • 终极指南:5分钟掌握HS2-HF_Patch,让《Honey Select 2》焕然新生
  • 美光与Anthropic签署AI内存供应协议并投资H轮融资
  • Mermaid Live Editor:3分钟学会实时图表编辑的终极解决方案