返回
科技常识:在 HTML 中包含资源的新思路_新闻中心
科技常识:在 HTML 中包含资源的新思路
2023-05-066

今天小编跟大家讲解下有关在 HTML 中包含资源的新思路 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关在 HTML 中包含资源的新思路 的相关资料,希望小伙伴们看了有所帮助。

注意:这篇文章描述了一种我们仍需要测其试性能影响的实验技术。 它可能最终会成为一种有用的工具,也有可能成为不被推荐的做法。 无论哪种方式,它对我们来说很有吸引力!

只要我一直工作在 Web 上,就需要一种简单的 html 驱动方式,将另一个文件的内容直接包含在页面中。 例如,我经常希望向页面添加额外的 html,或者嵌入 SVG 文件的内容,以便我们可以为其设置动画和样式。 通常我们通过使用 Javascript 获取文件并将其内容附加到特定元素,或者通过在服务器端去包含文件来实现这种嵌入,但在大多数情况下,这些方法都不是我们想要的。

本周我在思考如何用一些新的与fetch相关的标记模式来实现这一点,例如rel="preload"或 html import,但我总是得出的相同结论,即这些都不能使你方便地访问所取得的文件的内容。 然后我想,假设浏览器允许我在父文档中检索iframe的内容,也许一个旧的iframe可能是一个很不错的模式。 事实证明,它肯定会的!

一个短小的演示:包含 SVG

下面是一个内联(嵌入式)SVG 图形。它是从外部文件 signal.svg中加载的。

要加载并嵌入 SVG 文件,我用了下面的标记:

<iframesrc="http://www.aidi.net.cn/article/detial/5428/signal.svg"onload="this.before((this.contentdocument.body || this.contentdocument).children[0]);this.remove()"></iframe>

尽管此标记以iframe开头,但如果你使用开发人员工具检查上面的图形,将会看到 SVG 的图标标记,就内嵌在 html DOM 中,而且找不到iframe元素。 这是因为代码用iframe加载文件,并且在删除 iframe之前,用onload事件在 html 中iframe的位置之前注入了iframe里的内容。

该方法也适用于object元素,无论如何它通常用于引用SVG,所以我认为这特别好。 对于一个object,src属性必须用data替代:

<objectdata="signal.svg"onload="this.before((this.contentdocument.body || this.contentdocument).children[0]);this.remove()"></object>

另一个演示:包含 html 文件

也许更有用......这是一个使用html而不是SVG的例子!

可以用下面的标记加载:

<iframesrc="http://www.aidi.net.cn/images/includespost/htmlexample.html"onload="this.before((this.contentdocument.body||this.contentdocument).children[0]);this.remove()"></iframe>

一个说明这一个:你可能已经注意到,标记片段检查contentdocument.body或仅检查contentdocument。这是对 html 和 SVG 包含进行的规范化检查。 这是必要的,因为即使 HTML 文件本身只包含一个段落元素,浏览器也会创建一个完整的 HTML 文档来包装该段落,并包含 HTML 元素、head、body等。所以该片段会试图获取iframe的body元素(如果存在),如果不存在,它将会用于整个文档。

值得注意的是,如果你要导入包含多个元素的 HTML 文件,我建议将其全部包装在 div 中,以使iframe标记能够简单地查找body中的第一个子节点。

好处

与我们过去使用的其他模式相比,这种模式有一些很明显的好处:

这是声明性的。 与大多数自定义 Javascript 方法不同,这个方法是 HTML 驱动的,它在标记中的目的非常清楚,一目了然。它适用于 HTML 或 SVG。 我不确定你想要包含什么东西,但这至少满足了我自己的需求。这是异步的! 内容加载不会阻止页面渲染,这是iframe的性质。它是缓存友好的。 与服务器端嵌入不同,此模式允许我们包含外部文件,同时允许自然缓存文件以供日后重用。 (使用服务器端包含的内容,在客户端缓存是可能的,但难以做到)。无论 Javascript 是否运行,它都会显示内容,因为这就是 iframe 的设计目标。 Javascript 可以将iframe的内容移动到父文档中,即便失败了,你仍会看到包含的内容。它没有留下任何痕迹:iframe将内容导入页面后会被删除。 注意:你可能希望为iframe指定border:0;甚至可以在加载时安全地隐藏它(或许通过 onerror 事件再次显示它?)。它适用于各种浏览器:到目前为止,在我的简短测试中,它适用于 Chrome,Firefox,Safari 和 Edge。 IE 会显示iframe中的备选内容,但我认为可以通过调整onload处理中的 js 来获得对 IE 的支持,因为它目前用的是 IE 不喜欢的语法。 稍微调整一下,我认为 IE 支持是可能的。如果你愿意的话,它甚至可以包含在一个 Web 组件中,正如Andy Bell 巧妙地演示的那样(这是一个更清晰的标记,但就 js 依赖性来说更脆弱一点)。

考虑其他可能的用途很有趣......也许你可以引入 HTML 模块及其相关的 css 链接。 或者在文档或博客文章中嵌入推文或代码。 它甚至可能用于异步加载和应用常规的rel=stylesheet链接,并且优先级较低,否则很难做到(注意:我没有对这个想法进行太多的测试)。

可以惰性加载吗?是的,很快!

使用iframe进行此模式的另一个好处是,iframe会在进入视口时获得延迟加载的能力。 这可以用load ="lazy"属性来实现,该属性也适用于img元素。 代码看起来是这样:

<iframesrc="http://www.aidi.net.cn/article/detial/5428/signal.svg"loading="lazy"onload="this.before((this.contentdocument.body||this.contentdocument).children[0]);this.remove()"></iframe>

可能存在的问题

iframe在 web 上很常用,但是在页面中过度使用 iframe 可能会导致性能或内存消耗问题。 例如对页面上所有图标使用可能会过重,但是对于需要进行动画和样式化的特定图标来说,它可能会很好用。 不过现在我只能做更多的测试。

还有可能存在XSS问题,但我不确定这与其他需要注意外部内容的情况有什么不同。 你仍需要做通常的安全检查,并且最好将其看作是同域技术,尽管我也不确定。

就目前而言,这种做法有希望成为之前将另一个文件直接包含在页面中方法的改进。

作者:scott jehl翻译:疯狂的技术宅原文:https://www.filamentgroup.com/lab/html-includes/

来源:爱蒂网

QQ空间
QQ
新浪
关闭