有没有一种方法可以创建一个元素并将其发送到 "appendChild" 的另一个函数?
Is there a way of creating an element and sending it to another function that "appendChild"?
我创建了一个函数变量。此函数正在创建一个元素,应用样式和 returns 函数内的变量。
我后来有一个 for 循环,它有一个 "if",想通过使用 "appendChild" 将该元素添加到已经存在的 div,但我没能做到这行得通。
有什么建议吗?
var wall = function () {
var tmp_wall = document.createElement('div');
document.getElementById("g_world").appendChild(tmp_wall);
}
var ground = function () {
var tmp_ground = document.createElement('div');
document.getElementById("g_world").appendChild(tmp_ground);
}
// *****************************************************************
var world = [
[1,1],
[2,2],
];
function drawWorld () {
for(var y = 0; y < world.length; y++) {
for(var x = 0; x < world[y]; x++) {
if(world[y][x] === 1) {
wall();
}
else if (world[y][x] === 2) {
ground();
}
}
document.getElementById('g_world').innerHTML += '<br>';
}
}
这看起来有点奇怪:
document.getElementById('g_world') += document.body.appendChild(ground);
appendChild
是这样工作的:
document.getElementById('g_world').appendChild(ground());
你能试试看是否有效吗?
此外,您的脚本不会在 return 语句之后继续。也许您的示例代码中缺少一些分号?
编辑:
你的问题在第二个for-loop。您忘记添加 .length
,像这样:
for(var x = 0; x < world[y].length; x++) {
我注意到你的代码中有一些东西,它们可能有用也可能没用。
第一点是您要返回 return tmp_wall
是什么让您的代码在那之后没有 运行。
第二点是您的代码中有一个闭包,您应该调用它以正确使用它。
第三点是您没有尝试附加您创建的元素 tmp_wal。
您不能多次将相同的元素添加到 dom 中,解决方法是使用 cloneNode() 或为 for() 的每次迭代创建新元素。
闭包drawWorld
还缺少一些关闭标签。
我会只使用 JS 来处理它,但我决定尽可能少地更改以提供您想要的网格。
我会做以下事情:
var wall = function() {
// var tmp_wall = document.createElement("div");
// tmp_wall.style.width = 50 + "px";
// tmp_wall.style.height = 50 + "px";
// tmp_wall.style.backgroundColor = "green";
// tmp_wall.className = "wall";
var world = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1]
];
const gWorldElement = document.getElementById("g_world");
function drawWorldContainer() {
for (let i = 0; i < world.length; i++) {
const newElementI = document.createElement("div");
gWorldElement.appendChild(newElementI);
for (let j = 0; j < world[i].length; j++) {
const newElementJ = document.createElement("div");
gWorldElement.children[i].appendChild(newElementJ);
newElementJ.innerText = world[i][j];
}
}
}
drawWorldContainer();
};
wall();
如果您将 g_world
元素设置为 flex,结果,您将拥有 网格布局 div 容器和其他 div 保存值。
然后您可以创建另一个检查,例如 if(world[i][j] === 1)
检查值并相应地添加类名或更改元素的样式标签。
我希望我没有对您的代码进行太多更改,并且您仍然能够找到您的解决方案,如果您有任何问题,请告诉我。
我创建了一个函数变量。此函数正在创建一个元素,应用样式和 returns 函数内的变量。
我后来有一个 for 循环,它有一个 "if",想通过使用 "appendChild" 将该元素添加到已经存在的 div,但我没能做到这行得通。
有什么建议吗?
var wall = function () {
var tmp_wall = document.createElement('div');
document.getElementById("g_world").appendChild(tmp_wall);
}
var ground = function () {
var tmp_ground = document.createElement('div');
document.getElementById("g_world").appendChild(tmp_ground);
}
// *****************************************************************
var world = [
[1,1],
[2,2],
];
function drawWorld () {
for(var y = 0; y < world.length; y++) {
for(var x = 0; x < world[y]; x++) {
if(world[y][x] === 1) {
wall();
}
else if (world[y][x] === 2) {
ground();
}
}
document.getElementById('g_world').innerHTML += '<br>';
}
}
这看起来有点奇怪:
document.getElementById('g_world') += document.body.appendChild(ground);
appendChild
是这样工作的:
document.getElementById('g_world').appendChild(ground());
你能试试看是否有效吗?
此外,您的脚本不会在 return 语句之后继续。也许您的示例代码中缺少一些分号?
编辑:
你的问题在第二个for-loop。您忘记添加 .length
,像这样:
for(var x = 0; x < world[y].length; x++) {
我注意到你的代码中有一些东西,它们可能有用也可能没用。
第一点是您要返回 return tmp_wall
是什么让您的代码在那之后没有 运行。
第二点是您的代码中有一个闭包,您应该调用它以正确使用它。
第三点是您没有尝试附加您创建的元素 tmp_wal。
您不能多次将相同的元素添加到 dom 中,解决方法是使用 cloneNode() 或为 for() 的每次迭代创建新元素。
闭包drawWorld
还缺少一些关闭标签。
我会只使用 JS 来处理它,但我决定尽可能少地更改以提供您想要的网格。
我会做以下事情:
var wall = function() {
// var tmp_wall = document.createElement("div");
// tmp_wall.style.width = 50 + "px";
// tmp_wall.style.height = 50 + "px";
// tmp_wall.style.backgroundColor = "green";
// tmp_wall.className = "wall";
var world = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1]
];
const gWorldElement = document.getElementById("g_world");
function drawWorldContainer() {
for (let i = 0; i < world.length; i++) {
const newElementI = document.createElement("div");
gWorldElement.appendChild(newElementI);
for (let j = 0; j < world[i].length; j++) {
const newElementJ = document.createElement("div");
gWorldElement.children[i].appendChild(newElementJ);
newElementJ.innerText = world[i][j];
}
}
}
drawWorldContainer();
};
wall();
如果您将 g_world
元素设置为 flex,结果,您将拥有 网格布局 div 容器和其他 div 保存值。
然后您可以创建另一个检查,例如 if(world[i][j] === 1)
检查值并相应地添加类名或更改元素的样式标签。
我希望我没有对您的代码进行太多更改,并且您仍然能够找到您的解决方案,如果您有任何问题,请告诉我。