是浏览器原生惰性 DOM 容器,内容解析但不渲染、不执行脚本、不加载资源;必须置于 或 内,通过 .content 访问 DocumentFragment,克隆后需重置表单属性并深克隆使用。

template 标签不是“写个占位符等 JS 去填”,它是浏览器原生的惰性 DOM 容器——内容被解析但不渲染、不执行脚本、不加载图片,直到你显式克隆它。直接写在 HTML 里就生效,无需额外库或构建步骤。
模板必须放在 或 内,且不能嵌套在禁用容器中
浏览器会静默移除位置非法的 把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。 最常被跳过的一步是:克隆后没重置表单控件的 template,比如写在 <script></script>、、(未包裹
)或
里。
...
—— ... 会被提到 外,
可能被自动包进
内部可以写语义上“非法”的结构(如
),因为它的内容不走标准渲染流程,只做解析挂起获取内容只能用
template.content,别碰 innerHTML 或 children
template.innerHTML 永远是空字符串,template.children 永远是空 NodeList —— 因为真实内容藏在只读的 DocumentFragment 里,只能通过 .content 访问。
const frag = document.querySelector('#item').content;
template.innerHTML.replace(...)、template.firstElementChild、Array.from(template.childNodes)
frag 后不能直接 append(frag) 多次 —— 第二次会静默失败,因为 DocumentFragment 是移动语义,不是复制语义每次插入都必须深克隆,优先用
cloneNode(true)
document.importNode(frag, true) 虽然语义更准,但在 Safari 15.4 之前对 或带 required 的表单控件有 bug;cloneNode(true) 兼容性更稳。
const instance = template.content.cloneNode(true);
instance.querySelector('.name').textContent = '张三';
id、name、for 属性,否则多个实例会冲突;推荐用 crypto.randomUUID().slice(0, 8) 生成唯一 IDsrc
模板里写
和 <script></script> 是无效的template 内部的 不会应用,<script></script> 不会执行,连控制台都不会报错 —— 它们被完全静默处理。这不是 bug,是设计使然。
<script>console.log('never runs')</script>
才起作用;纯 cloneNode 场景下, 就是个普通标签,不会自动分发内容id 和 name,导致提交时只取到第一个实例的数据,或者点击 label 完全不聚焦输入框 —— 这类问题在 Safari 和 Firefox 中尤其隐蔽。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










