【问题标题】:Can't clone <template> to append to <div>无法克隆 <template> 以附加到 <div>
【发布时间】:2019-04-29 06:44:12
【问题描述】:

我用javascript成功创建了这个模板:

我在 async 函数中创建模板:

this.createBoxes = async function() {
    var row_counter = 0;
    for (var i = 1; i < this.fake_data.length + 1; i++) {

        var item_box = document.createElement("div");
        item_box.style.flex = "0.5";
        item_box.style.backgroundColor = "white";
        item_box.style.display = "flex";
        item_box.style.flexDirection = "column";
        item_box.style.justifyContent = "flex-end";
        item_box.id = "item_box_"+i;

        var item_name = document.createElement("h3");
        item_name.style.flex = "0.2";
        item_name.style.backgroundColor = "orange";
        item_name.style.alignSelf = "center";
        item_name.innerText = this.fake_data[i - 1].name;
        item_name.id = "item_name_"+i;

        item_box.appendChild(item_name);

        this_row = document.getElementsByClassName("row")[row_counter];
        this_row.appendChild(item_box);

        if(i % 2 == 0) {
            var pool = document.getElementById("pool");
            var inner_row = document.createElement("div");
            inner_row.style.display = "flex";
            inner_row.style.flexDirection = "row";
            inner_row.style.flex = "0.5";
            inner_row.style.justifyContent = "space-around";
            inner_row.style.alignItems = "center";
            inner_row.style.backgroundColor = "green";
            inner_row.className = "row";

            pool.appendChild(inner_row);

            row_counter++;
        }
        else if(i == this.fake_data.length) {
            return;
        }
    }
}

然后我这样做:

    this.createBoxes().then(function() {
        var template = document.querySelector('#pool');
        var clone = template.content.cloneNode(true);
        document.querySelector(".app").appendChild(clone);
    })

但正如你从我的截图中看到的那样,.app 是空的。我究竟做错了什么?我正在使用 Cordova,我假设它能够使用 template 标签,但我找不到任何说我不能的东西。

更新

发生这种情况:

当我这样做时:

    this.createBoxes().then(function() {
        var template = document.querySelector('#pool');
        var clone = template.cloneNode(true);
        document.querySelector(".app").appendChild(clone);
    });

使用 template.cloneNode 成功移动了&lt;template&gt; 但这显然不是我想要的,我想获取&lt;template&gt; 的内容并将它们移动到.app 容器,而不是整个&lt;template&gt;

【问题讨论】:

  • 您的代码应该可以工作。要尝试的一件事是让您的异步函数实际返回节点,并让您的 then 函数接受节点作为参数。最好的办法是附加一个调试器并逐步执行代码。
  • 好的...看看我的更新,这对你有意义吗?
  • 我尝试从async 函数传递填充的template,但结果仍然相同
  • 看看我的回答。如果克隆整个模板有效,那么只需遍历其子模板并克隆每个模板。

标签: javascript html cordova dom nodes


【解决方案1】:

好吧,如果克隆节点本身有效,那么答案很简单 - 只需克隆/附加模板的子节点:

this.createBoxes().then(function() {
    let template = document.querySelector('#pool');
    let app = document.querySelector(".app");
    for(let child of template.childNodes) {
        let clone = child.cloneNode(true);
        app.appendChild(clone);
    }
});

请注意,我尚未测试此代码 - 您可能需要根据需要对其进行调试。

【讨论】:

  • 我想我找到了一个更好的解决方案,但你的可能也有效。感谢您的帮助
【解决方案2】:

我以编程方式向模板添加了一个容器:

    var pool = document.getElementById("pool");

    var container = document.createElement("div");
    container.style.flex = "1";
    container.style.backgroundColor = "white";
    container.style.display = "flex";
    container.style.flexDirection = "column";
    container.id = "container";

    var row = document.createElement("div");
    row.style.display = "flex";
    row.style.flexDirection = "row";
    row.style.flex = "0.5";
    row.style.justifyContent = "space-around";
    row.style.alignItems = "center";
    row.style.backgroundColor = "green";
    row.className = "row";

    container.appendChild(row);
    pool.appendChild(container); 

然后我没有将我的内容添加到#pool&lt;template&gt;,而是将其添加到#container,然后将#container节点存储在一个变量中,然后将其导入.app

var container_in_temp = document.querySelector('#pool>#container');
var targetContainer = document.querySelector('.app');
targetContainer.appendChild(document.importNode(container_in_temp, true));

所以它最终看起来像这样,在.app 中有一个容器,这实际上是一种更可取的结构:)。

【讨论】:

    【解决方案3】:

    您应该克隆模板的.content,如the documentation 中所示。

      var temp = document.getElementsByTagName("template")[0];
      var clon = temp.content.cloneNode(true);
      document.body.appendChild(clon);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-19
      • 2020-04-07
      • 2011-04-23
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多