javascript - HTML 模板 JavaScript polyfill

标签 javascript html w3c polyfills html5-template

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

相关文章:

HTML 5 - 偷偷摸摸的东西

css - 对 CSS3 过渡和动画的高度自动有什么看法?

php - 如何在 Codeigniter 中检查 session 是否已设置?

javascript - 使用 HTML5 的 canvas 绘制带有外描边的文本

javascript - 哈密​​顿路径

javascript - GHCJS:如何使用 FFI 导入高阶 javascript 函数?

html - 带有 float div 作为子元素的父 DIV

css - CSS类选择器、id选择器的语法?

javascript - 如何验证在单击按钮之前是否单击了 anchor 标记(使用 javaScript)

javascript - 在 React 组件中删除 onClick 事件中的特定表格行