【问题标题】:Template content is an empty document fragment模板内容是一个空的文档片段
【发布时间】:2022-01-20 06:25:32
【问题描述】:

不是 Template tag content is empty 的重复项 - Angular 中的一个错误,而我的问题是关于 Vanilla Js。


我正在开发一个ThingsBoard 小部件。在the HTML tab,我有这个简单的模板:

<template id="myTemplate">
  <div>Test</div>
</template>

在 JS 选项卡中,我正在尝试获取此模板的内容(最终克隆它):

const template = document.querySelector("#myTemplate");
console.log(template.content);

但是,我得到一个 empty DocumentFrgament

这很奇怪,因为当我在 ThingsBoard 之外运行它时(例如在 StackOverflow sn-p 上),我确实获得了模板的内容:

const template = document.querySelector("#myTemplate");
console.log(template.content);
<template id="myTemplate">
  <div>Test</div>
</template>

有什么想法吗?

【问题讨论】:

    标签: javascript html thingsboard


    【解决方案1】:

    如果您的 ThingsBoard 示例使用 React 或类似的 DOM 库,它可能会以编程方式创建 DOM,这可能会导致此问题。

    &lt;template&gt; 使用appendChild 以编程方式构造时,content 保持为空。 例如:

    const template = document.createElement('template');
    template.appendChild(document.createElement('div'));
    console.log(template.content); // #document-fragment (empty)
    

    您必须使用template.content.appendChild 而不是template.appendChild,它才能正常工作。

    我希望这会有所帮助!

    【讨论】:

    • 谢谢!你能向我解释一下这种行为吗?当template 以编程方式构造时,为什么content 仍为空?
    • 显然,当 HTML 解析器看到 &lt;template&gt; 标记时,它会将所有子项转移到 content 文档片段中。模板的实际children 将为空。如果您设置template.innerHTML,也会发生同样的情况。但是,如果您以编程方式将子项附加到模板,它们不会自动转移到content 片段,这令人惊讶。看起来这个问题应该得到解决,但他们不想改变它可能有一些正当的理由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2016-11-05
    • 1970-01-01
    • 2016-07-04
    • 2013-05-19
    • 1970-01-01
    • 2019-12-31
    相关资源
    最近更新 更多