当前位置: 首页 > 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.jsqmd.com/news/1083556/

相关文章:

  • Lp-Bakry-Emery曲率下的加权体积比较与单调性定理解析
  • YOLO骨干网络改进- 第12篇:InceptionV4多尺度卷积核融合设计
  • AI帮你筛简历:开源Hiring Agent,一键评估候选人真实水平
  • 高效资源调控方案:智能管理系统性能优化实战
  • 测试复盘方法论:5Why根因分析在缺陷复盘中的应用
  • 客流统计系统如何构建数据驱动运营体系?(AI视觉 + IoT完整技术架构解析)
  • 膜结构球场的材料有哪些种类?
  • PotatoNV终极指南:5分钟掌握华为设备Bootloader解锁完整方案
  • 人生苦乐路
  • 终极解决方案:3步掌握跨设备显示管理,告别繁琐手动调节
  • 2元一杯卷穿底价!浙江夜市上演硬核“摊位商战”,烟火气里藏市井竞争百态
  • 基于模糊控制的PID设计(simulink仿真)
  • 专知智库 × 余行专利 × 自指专利池让“自指”从理论走进实验室与生产线
  • 【限时稀缺资源】JetBrains教育计划2024年最后窗口期:IntelliJ IDEA学生免费许可倒计时+毕业前必须完成的3项绑定操作
  • 终极指南:如何用VLC点击暂停插件实现一键控制播放
  • 树莓派触摸屏底层定制:设备树覆盖层参数详解与实战配置
  • Video2X视频AI放大完整指南:从模糊到高清的免费解决方案
  • 写毕业论文别找错工具!Gradpaper 专配高校审核标准,全学段从选题到定稿高效通关
  • 初级音响师速成实用教程
  • 2026最新网盘不限速下载技巧:满速直链解析榨干带宽指南
  • AI 模型怎么选?看懂这 5 个 Benchmark 就够了——SWE-bench、LiveCodeBench 等评测解读
  • MediaPipe TouchDesigner插件摄像头连接终极指南:如何快速解决设备识别问题
  • 5分钟搞定:Adobe-GenP 3.0激活Adobe全系列软件终极指南
  • IP文创产业规模发展,授权管控链条需要向精细化迈进
  • Cotellic考比替尼联合维莫非尼能否延长患者总生存期
  • 第八章 多媒体技术基础(完整版)
  • Xerosploit渗透测试框架:基于Bettercap的MITM攻击实战解析
  • 三步免费解锁WeMod专业版:Wand-Enhancer完整使用指南
  • 从零搭建 ReAct 智能体:打造具备思考与行动能力的自动化客服机器人
  • 2026脑机接口技术全景解析:从医疗突破到民用落地,未来产业迎来爆发前夜