”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 延迟加载脚本,例如图像

延迟加载脚本,例如图像

发布于2024-11-08
浏览:296

Lazyload Scripts like Images

近年来对 html 的最佳改进之一是 loading="lazy" 属性,您可以将其添加到图像(也包括 iframe)中,该属性将告诉浏览器不要加载图像直到出现在视口中。


    延迟加载脚本,例如图像


非常简单,非常有用。但如果您也可以对脚本执行此操作,那就太好了。这样你就可以延迟加载你的组件,只有当它们确实需要时......

嗯,延迟加载脚本,例如图像 元素的另一项功能是能够在图像使用 onload 和 onerror 属性加载(或不加载)之后运行脚本。

console.log('图像已加载')" >

    


此 onload“回调”仅在加载图像时才会触发,如果图像是延迟加载的,则仅当图像位于视口中时才会触发。瞧!延迟加载的脚本。

不幸的是,像这样,它没有多大用处。首先,您的页面上会出现不需要的图像,其次,您需要内联要运行的 JavaScript,这有点违背了延迟加载的目的。因此,让我们做出一些改变来改进这一点。

图像本身可以是任何东西,或者更重要的是,什么都不是。正如我之前提到的,有一个 onerror 回调,顾名思义,当图像

加载时,它将触发。

这并不意味着您需要将 src 指向不存在的图像,这会导致控制台充满关于丢失图像的红色 404 错误,并且没有人希望这样。

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

console.log('图像未加载')" >

    


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

好吧,但是我们仍然需要内联我们想要运行的 javascript,那么我们如何解决这个问题?

好吧,现在 ES 模块支持几乎是普遍的,我们可以使用非常强大的

event-import-then-default javascript 加载技术在事件触发后加载脚本,如下所示:

_.default(this))" >

    


注意:这也适用于 onclick、onchange 等事件
注意:下划线只是访问模块的简写方式,你也可以写 .then(Module => Module.default(this))

好吧,那么这是怎么回事!?

首先让我们看一下某些组件可能是什么样子:

// 一些组件.js 导出默认元素=> { 元素.outerHTML = `

世界你好!

`; }

    


因此,您可能已经注意到,在 onerror 回调中,我将其作为参数传递给默认导出。我这样做的原因是

this (请原谅双关语?)是为了给脚本调用它的 延迟加载脚本,例如图像 ,因为在 this (我又做了一次?)上下文 this = .

现在您可以简单地使用 element.outerHTML 用您的 html 标记替换损坏的图像,然后您就拥有了延迟加载的脚本! ?

缓存和传递参数

如果您在一个页面上多次使用此技术,那么您需要向数据传递“缓存清除”索引或随机数:例如,类似:

_.default(this))" > _.default(this))" >

    


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

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

_.default(this))" >

    


由于我们将 this 传递给函数,您可以像这样访问数据属性:

导出默认元素=> { const { 消息 } = element.dataset 元素.outerHTML = `

${消息}

`; }

    


请在评论中告诉我您的想法! ❤️

版本声明 本文转载于:https://dev.to/paulbrowne/lazyload-scripts-like-images-30e0?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 在C#中如何高效重复字符串字符用于缩进?
    在C#中如何高效重复字符串字符用于缩进?
    在基于项目的深度下固定字符串时,重复一个字符串以进行凹痕,很方便有效地有一种有效的方法来返回字符串重复指定的次数的字符串。使用指定的次数。 constructor 这将返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.Wr...
    编程 发布于2025-05-02
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-05-02
  • 将图片浮动到底部右侧并环绕文字的技巧
    将图片浮动到底部右侧并环绕文字的技巧
    在Web设计中围绕在Web设计中,有时可以将图像浮动到页面右下角,从而使文本围绕它缠绕。这可以在有效地展示图像的同时创建一个吸引人的视觉效果。 css位置在右下角,使用css float and clear properties: img { 浮点:对; ...
    编程 发布于2025-05-02
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-05-02
  • C++中如何将独占指针作为函数或构造函数参数传递?
    C++中如何将独占指针作为函数或构造函数参数传递?
    在构造函数和函数中将唯一的指数管理为参数 unique pointers( unique_ptr [2启示。通过值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法将唯一指针的所有权转移到函数/对象。指针的内容被移至功能中,在操作...
    编程 发布于2025-05-02
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-05-02
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,将常数列添加到Spark DataFrame,该列具有适用于所有行的任意值的Spark DataFrame,可以通过多种方式实现。使用文字值(SPARK 1.3)在尝试提供直接值时,用于此问题时,旨在为此目的的column方法可能会导致错误。 df.withco...
    编程 发布于2025-05-02
  • 如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    编程 发布于2025-05-02
  • 如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
    编程 发布于2025-05-02
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:( - 215)!empty()in Function openCv in Function MultSiscale中的“检测”中的错误:在功能检测中。”当Face Cascade分类器(即面部检测至关重要的组件)未正确加载时,通常会出现此错误。要解决此问题,必须...
    编程 发布于2025-05-02
  • 在JavaScript中如何并发运行异步操作并正确处理错误?
    在JavaScript中如何并发运行异步操作并正确处理错误?
    同意操作execution 在执行asynchronous操作时,相关的代码段落会遇到一个问题,当执行asynchronous操作:此实现在启动下一个操作之前依次等待每个操作的完成。要启用并发执行,需要进行修改的方法。 第一个解决方案试图通过获得每个操作的承诺来解决此问题,然后单独等待它们: co...
    编程 发布于2025-05-02
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-05-02
  • 同实例无需转储复制MySQL数据库方法
    同实例无需转储复制MySQL数据库方法
    在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
    编程 发布于2025-05-02
  • Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    在ASP.NET async void void async void void void void void的设计无需返回asynchroncon而无需返回任务对象。他们在执行过程中增加未偿还操作的计数,并在完成后减少。在某些情况下,这种行为可能是有益的,例如未期望或明确预期操作结果的火灾和...
    编程 发布于2025-05-02
  • 为什么使用固定定位时,为什么具有100%网格板柱的网格超越身体?
    为什么使用固定定位时,为什么具有100%网格板柱的网格超越身体?
    网格超过身体,用100%grid-template-columns 为什么在grid-template-colms中具有100%的显示器,当位置设置为设置的位置时,grid-template-colly修复了?问题: 考虑以下CSS和html: class =“ snippet-code”> g...
    编程 发布于2025-05-02

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3