news 2026/3/19 12:42:12

借助图片懒加载触发 JavaScript 动态导入

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
借助图片懒加载触发 JavaScript 动态导入

点击上方 前端Q,关注公众号

回复加群,加入前端Q技术交流群

近年来 html 的最好改进之一是你可以添加到图像(也包括 iframe)的loading="lazy"属性,它将告诉浏览器直到图像出现在视口才加载图像。

<img src="/images/your-image.png" loading="lazy">

非常简单,非常实用。但如果你也能对脚本做同样的事情,那该多好。这样你就可以懒加载你的组件,只有当它们实际需要时才加载...

嗯,<img>元素还有另一个功能,就是使用onloadonerror属性在图像加载(或未加载)后运行脚本。

<img src="/images/your-image.png" loading="lazy" onload="() => console.log('image loaded')">

这个onload“回调”只有在图像加载时才会触发,如果图像是懒加载的,那么它只会在图像出现在视口时触发。噔噔噔!一个懒加载的脚本。

很遗憾,像这样它并没有什么用处。首先,你会在页面上出现一个不需要的图片,其次,你需要将想要运行的 javascript 内联化,这有点违背了懒加载的初衷。所以,让我们做一些改变来改进这一点。

图片本身可以是任何东西,或者,更重要的是,什么都没有。正如我之前提到的,有onerror回调,正如其名称所暗示的,当图片没有加载成功时会触发。

这并不意味着你需要将src指向一个不存在的图片,那样会导致控制台充满关于缺失图片的红色 404 错误,没有人想要这样。

如果src图片实际上不是一个图片,onerror回调也会触发,而最简单的方法是使用data:格式“错误地编码”一个图片。这也具有不向控制台填充缺失图片警告的好处。

<img src="data:," loading="lazy" onerror="() => console.log('image not loaded')">

这仍然会导致页面出现"损坏的图像"缩略图,但我们会解决这个问题的。

好的,但我们仍然需要将想要运行的 javascript 内联,那么我们该如何修复这个问题呢?

既然 ES 模块支持几乎已经普及,我们可以使用非常强大的事件导入后默认 javascript 加载技术来在事件触发后加载脚本,如下所示:

<img src="data:," loading="lazy" onerror="import('/js/some-component.js').then(_ => _.default(this))">

注意:这也适用于onclickonchange等事件。

注意:下划线只是访问模块的简写方式,你也可以写成.then(Module => Module.default(this))

好了,这里到底是怎么回事!?

首先让我们看看 some-component 可能的样子:

// some-component.js export default element => { element.outerHTML = ` <div class="whatever"> <p>Hello world!</p> </div> `;}

所以,你可能已经注意到,在onerror回调中,我将this作为参数传递给了默认导出。我这样做的原因(抱歉用词不当😁)是为了给调用它的脚本提供<img>,因为在当前(我又犯错了🤦)的上下文中this = <img>

现在你可以简单地element.outerHTML替换损坏的图片为你自己的 HTML 标记,然后你就有了懒加载的脚本!😱

缓存和传递参数

如果,您在页面上多次使用此技术,那么您需要向data:,传递一个"缓存破坏"索引,或随机数,例如:

<img src="data:,abc123" loading="lazy" onerror="import('/js/some-component.js').then(_ => _.default(this))"><img src="data:,xyz789" loading="lazy" onerror="import('/js/some-other-component.js').then(_ => _.default(this))">

":,"后面的字符串可以是任何内容,只要它们不同即可。

将参数传递给函数的一个非常简单的方法是在 HTML 中使用data-something属性,如下所示:

<img src="data:," loading="lazy" >由于我们将this传递给了函数,你可以像这样访问data属性:

export default element => { const { message } = element.dataset element.outerHTML = ` <div class="whatever"> <p>${message}</p> </div> `;}

往期推荐

Claude Code 算是被我玩明白了

Ant Design 6.0 来了!这一次它终于想通了什么?

15 个 Node.js 新功能替代流行 NPM 包


最后

  • 欢迎加我微信,拉你进技术群,长期交流学习...

  • 欢迎关注「前端Q」,认真学前端,做个专业的技术人...

点个在看
支持我吧

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 22:59:10

AI 生成内容的伦理边界:深度伪造与信息真实性的保卫战

一、深度伪造技术的进化&#xff1a;从 “数字玩具” 到 “网络武器”2025 年的深度伪造技术已完成颠覆性蜕变。Check Point《AI 安全报告 2025》显示&#xff0c;该技术已从早期离线合成视频&#xff0c;升级为可实时换脸、语音克隆并实现多轮对话的 AI 代理系统。曾经局限于顶…

作者头像 李华
网站建设 2026/3/17 7:09:56

基于Chrome140的Quora账号自动化——运行脚本(三)

引言在之前撰写的前两篇文章当中&#xff0c;我们有条不紊地分别完成了开发环境的精心搭建与核心框架的严谨实现。通过一系列细致的操作和代码编写&#xff0c;成功构建了一个基于 动作执行器&#xff08;action_executor&#xff09; 与 状态机模式 的 Quora 自动化浏览系统。…

作者头像 李华
网站建设 2026/3/16 3:26:08

消费级无人机续航现状、限制因素及突破方法

消费级无人机续航现状、限制因素及突破方法“无人机不能超过半小时”其实是消费级无人机的普遍续航现状&#xff0c;而非绝对规定——行业级、军用无人机的续航可长达数小时甚至数十天。核心原因集中在「技术限制、产品定位、安全合规」三大维度&#xff0c;具体拆解如下&#…

作者头像 李华
网站建设 2026/3/16 3:26:03

职业本科与高职专科低空相关专业核心差异解析

职业本科与高职专科低空相关专业核心差异解析随着低空经济成为新兴产业增长点&#xff0c;职业教育体系中针对低空领域的专业布局日益完善。职业本科&#xff08;无人机测绘技术、低空飞行器工程技术、低空智联网工程&#xff09;与高职专科&#xff08;低空飞行器装备技术、低…

作者头像 李华
网站建设 2026/3/17 16:40:44

职业本科与高职专科低空专业核心能力要求具体区别

职业本科与高职专科低空专业核心能力要求具体区别低空专业核心能力要求的差异&#xff0c;本质是职业教育“分层培养”理念的体现——职业本科以“复杂技术应用与创新”为核心&#xff0c;聚焦“能设计、会优化、解难题”&#xff1b;高职专科以“岗位技能精准落地”为核心&…

作者头像 李华