Javascript 无法克隆以附加到
我使用javascript成功创建了此模板: 我在异步函数中创建模板:Javascript 无法克隆以附加到,javascript,html,cordova,dom,nodes,Javascript,Html,Cordova,Dom,Nodes,我使用javascript成功创建了此模板: 我在异步函数中创建模板: 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"
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;
}
}
}
但正如你们从我的截图上看到的,.app是空的。我做错了什么?我使用的是Cordova,我假设它能够使用模板标签,但我没有找到任何东西表明我不能
更新
发生这种情况:
当我这样做时:
this.createBoxes().then(function() {
var template = document.querySelector('#pool');
var clone = template.content.cloneNode(true);
document.querySelector(".app").appendChild(clone);
})
this.createBoxes().then(function() {
var template = document.querySelector('#pool');
var clone = template.cloneNode(true);
document.querySelector(".app").appendChild(clone);
});
使用template.cloneNode成功地移动了,但这显然不是我想要的,我想要获取的内容并将其移动到.app容器,而不是整个容器。好吧,如果克隆节点本身有效,那么答案很简单-只需克隆/附加模板的子级:
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);
}
});
请注意,我尚未测试此代码-您可能需要根据需要对其进行调试。我以编程方式向模板添加了一个容器:
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);
然后,我没有将内容添加到池中,而是将其添加到容器中,然后将容器节点存储在一个变量中,然后将其导入到。app:
所以它最终看起来是这样的,在.app中有一个容器,它实际上是一种更好的结构方面的容器:
您应该改为克隆模板的.content,如中所示
你的代码应该可以工作。要尝试的一件事是让异步函数实际返回节点,然后让函数接受节点作为参数。你最好的办法是附加一个调试器并逐步完成代码。好的…请看我的更新,这对你有意义吗?我尝试从异步函数传递填充的模板,但仍然是相同的结果请看我的答案。如果克隆整个模板有效,那么只需迭代其子模板并克隆每个子模板。我想我找到了一个更好的解决方案,但您的解决方案也可能有效。谢谢你的帮助
var container_in_temp = document.querySelector('#pool>#container');
var targetContainer = document.querySelector('.app');
targetContainer.appendChild(document.importNode(container_in_temp, true));
var temp = document.getElementsByTagName("template")[0];
var clon = temp.content.cloneNode(true);
document.body.appendChild(clon);