我正在为前端 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/