开发者问题收集

Javascript .createElement 和 .appendChild 问题(包括 for 和 if)

2022-06-27
94

我是一个新手 javascript 用户。我需要一些帮助来调试此代码。我打算根据列表中的值数量创建一个 3 列宽的表格来显示每个值。顺便说一下,整个 html 格式都是用网格设置的。

错误是: 未捕获的 TypeError:无法读取未定义的属性(读取“appendChild”)

HTML(正文内):

<section id="db_gallery">
      <table id="gallery_table"></table>
      <script src="autogallery.js"></script>
</section>

autogallery.js 中的 JS:

const gallery_table = document.getElementById("gallery_table");
const list = ["A", "B", "C", "D", "E", "F"];

for (let i of list) {
    if (i % 3 === 0) {
        let newRowItem = document.createElement("tr");
        var idName = "newRowItem";
        idName.concat(i);
        newRowItem.setAttribute("id", idName);
        gallery_table.appendChild(newRowItem);
    }

    let newColItem = document.createElement('th');
    newColItem.textContent = i;

    idName.appendChild(newColItem);
    console.log(idName);
}

如果任何建议都简单易懂,那将是一个很大的帮助。如果它有任何意义,我最终会将其链接到 phpmyadmin 数据库作为数组中的值。 谢谢!

3个回答

首先,您应该使用 newRowItem.appendChild 而不是 idName ,因为 newRowItem 是您创建的元素。

其次,当使用 for...of 时, i 是元素而不是索引,因此,在您的例子中最好使用 for

最后,您不应在范围之外使用 newRowItem ,因为您在 if 调用内使用 let 声明了它。

这应该是正确的:

const gallery_table = document.getElementById("gallery_table");
let list = ["A", "B", "C", "D", "E", "F"];
var idName = "";

    for (let i = 0; i < list.length; i++) {
        if (i % 3 === 0) {
            let newRowItem = document.createElement("tr");
            idName = "newRowItem";
            idName = idName.concat(list[i]);
            newRowItem.setAttribute("id", idName);
            gallery_table.appendChild(newRowItem);
            let newColItem = document.createElement('th');
            newColItem.textContent = list[i];
            newRowItem.appendChild(newColItem);
        }
    }
mohammad
2022-06-27

尝试

newRowItem.appendChild(newColItem)

而不是

idName.appendChild(newColItem)
horvoje
2022-06-27

使用带索引的 for 循环对列表索引进行模运算。

let newRowItem;
    for (int i=0 ; i<list.length; i++) {
        if (i % 3 === 0) {
            newRowItem = document.createElement("tr");
            var idName = "newRowItem";
            idName.concat(i);
            newRowItem.setAttribute("id", idName);
            gallery_table.appendChild(newRowItem);
        }
        if(newRowItem){
            let tag = i < 3 ? 'th' : 'td';
            let newColItem = document.createElement(tag);
            newColItem.textContent = list[i];
            newRowItem.appendChild(newColItem);
            console.log(newRowItem);
        }
   }`
khush
2022-06-27