javascript 如何从Html5模板标签克隆和修改

f2uvfpb9  于 12个月前  发布在  Java
关注(0)|答案(2)|浏览(87)

我有一个模板:

function useIt() {
  var content = document.querySelector('template').content;
  // Update something in the template DOM.
  var span = content.querySelector('span');
  span.textContent = parseInt(span.textContent) + 1;
  document.querySelector('#container').appendChild(
    document.importNode(content, true));
}
<button onclick="useIt()">Use me</button>
<div id="container"></div>

<template>
    <div>Template used: <span>0</span></div>
    <script>alert('Thanks!')</script>
</template>

你可以试试代码here。这段代码基本上是将模板(html5模板不会呈现在屏幕上)复制到另一个div中。这允许您重用DOM。
问题:行“span.textContent = parseInt(span.textContent)+ 1;“直接更改模板代码。我需要操作内容DOM并将其克隆到容器中,不需要更改模板。这是非常重要的,因为如果我想重用代码,我需要它保持不变。
我尝试了多种方法来使用jQuery来模仿上面的JavaScript代码,但我无法找到答案。如果有jQuery就更好了。

oaxa6hgo

oaxa6hgo1#

如果你需要使用新的<template>标签,那么你就有点卡住了。.最干净的替代方法是使用importNode引入内容,然后在追加内容后对其进行修改。
假设模板化的代码相对较小,这应该发生得足够快,以至于您永远不会注意到方法上的差异,尽管在这个特定的示例中,alert()会延迟内容的更改,所以您会看到“0”,直到您单击“OK”,然后它会更新为“1”。
代码更改为:

function useIt() {
    var content = document.querySelector('template').content;

    var targetContainer = document.querySelector('#container');
    targetContainer.appendChild(document.importNode(content, true));

    var $span = $(targetContainer).find("div:last-of-type").find("span");
    $span.text(parseInt($span.text() + 1));
}

如果你不认同<templates>的思想,你可以使用jQuery的clone()方法来做你想做的事情,非常容易。. .但是,clone并不能“看到”<template>的内容,这是由于该特定元素的特殊性质,因此您必须以其他方式存储模板代码(JS变量,隐藏div等)。

然而,如果您需要克隆脚本,则此方法将不起作用,就像<template>一样。当创建或追加克隆版本时,它不会触发“模板容器”元素中的任何脚本代码。此外,如果将其存储在隐藏的<div>中,则“template container”元素中的任何脚本代码都将在页面加载时立即触发。

clone()方法的简单代码版本如下所示:

function useIt() {
    var $content = $("#template").clone();
    var $span = $content.find("span");
    $span.text(parseInt($span.text()) + 1);

    $content.children().each(function() {
        $("#container").append($(this));
    });
}

假设你的模板是:

<div id="template" style="display: none;">
    <div>Template used: <span>0</span></div>
    <script>alert('Thanks!')</script>
</div>

如果需要,您还可以将<script>alert('Thanks!')</script>移出模板并移入脚本部分(在完成“append循环”之后),以实现所需的警报功能。

kuarbcqp

kuarbcqp2#

这是一个老问题,但是,你试过cloneNode(true)吗?它适用于模板,如下所示:

var span = content.querySelector('span').cloneNode(true)

使用完整的示例:

function useIt() {
  var content = document.querySelector('template').content.cloneNode(true);
  // Update something in the template DOM.
  var span = content.querySelector('span');
  span.textContent = parseInt(span.textContent) + 1;
  document.querySelector('#container').appendChild(
    document.importNode(content, true));
}
<button onclick="useIt()">Use me</button>
<div id="container"></div>

<template>
    <div>Template used: <span>0</span></div>
    <script>alert('Thanks!')</script>
</template>

问候。

相关问题