gpt4 book ai didi

javascript - HTML 模板 JavaScript polyfill

转载 作者:技术小花猫 更新时间:2023-10-29 12:14:24 25 4
gpt4 key购买 nike

我正在为前端 HTML 模板寻找最符合标准/面向 future 的方法。

存在一个相对较新的 W3C draft specification for HTML Templates ,例如:

<template id="mytemplate">
<img src="" alt="great image">
<div class="comment"></div>
</template>

有谁知道有什么好的JavaScript polyfills已经存在制作<template>元素可以跨浏览器使用吗?最好符合这个标准。


困难

根据HTML5Rocks guide这些模板具有以下属性:

  • “它的内容在被激活之前实际上是惰性的”
  • “脚本不运行,图片不加载,音频不播放,”
  • “内容被认为不在文档中”
  • “模板可以放置在 <head><body><frameset> 内的任何位置”

我认为完全使用 JavaScript polyfill 不可能实现所有这四个属性,因此任何解决方案都只是部分的。

最佳答案

Xotic750 提供了一个可靠的 polyfill,它通过改变 HTML 元素来工作——但如果以后有任何新模板添加到 DOM,它就会失败,并且越来越不鼓励改变(在可以避免的情况下)。

相反,我建议在您使用模板的地方引入“polyfill”行为。将此功能添加到您的 JS:

function templateContent(template) {
if("content" in document.createElement("template")) {
return document.importNode(template.content, true);
} else {
var fragment = document.createDocumentFragment();
var children = template.childNodes;
for (i = 0; i < children.length; i++) {
fragment.appendChild(children[i].cloneNode(true));
}
return fragment;
}
}

使用对模板元素的引用调用该函数。它将提取内容,并返回一个 documentFragment,然后您可以将其附加到另一个元素(或者对模板内容执行您可能想执行的任何其他操作)。像这样:

var template = document.querySelector("template#my-template");
var content = templateContent(template);
someElm.appendChild(content);

现在,其他答案没有提到它,但您可能需要一些 CSS 来隐藏 <template>元素。

template { display: none; }

这是一个 CodePen把它们放在一起。

现在,这将在 native 支持 <template> 的浏览器中正常工作元素,以及那些没有的元素。与另一个答案类似,它不是一个完美的 polyfill,因为它不会使模板呈现惰性(那会很复杂、缓慢且容易出错)。但它足以让我在生产中使用。

如果您有任何疑问或问题,请发表评论,我会相应地进行修改。

关于javascript - HTML 模板 JavaScript polyfill,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16055275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com