吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1531|回复: 18
收起左侧

[已解决] [JavaScript] 用for循环动态创建行的问题

[复制链接]
clearwater 发表于 2020-3-12 13:02
本帖最后由 clearwater 于 2020-3-12 13:57 编辑

以下是代码是某前端的教程源码。讲的是用JS创建动态的表格。

我对70行不是太理解,麻烦大神解答一下:

70行是用for循环来创建表格中的行。

var tr = document.createElement('tr');

如果把这句话循环4次的话,我的问题是为啥 var tr 不会被前面的覆盖?

我觉得要想不被覆盖,需要改为:
1.png
---当然,我是错的,老师是对的。但是我没能想清楚。

[JavaScript] 纯文本查看 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        table {
            width: 500px;
            margin: 100px auto;
            border-collapse: collapse;
            text-align: center;
        }
        
        td,
        th {
            border: 1px solid #333;
        }
        
        thead tr {
            height: 40px;
            background-color: #ccc;
        }
    </style>
</head>

<body>
    <table cellspacing="0">
        <thead>
            <tr>
                <th>姓名</th>
                <th>科目</th>
                <th>成绩</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>

        </tbody>
    </table>
    <script>
        // 1.先去准备好学生的数据
        var datas = [{
            name: '魏璎珞',
            subject: 'JavaScript',
            score: 100
        }, {
            name: '弘历',
            subject: 'JavaScript',
            score: 98
        }, {
            name: '傅恒',
            subject: 'JavaScript',
            score: 99
        }, {
            name: '明玉',
            subject: 'JavaScript',
            score: 88
        }, {
            name: '大猪蹄子',
            subject: 'JavaScript',
            score: 0
        }];
        // 2. 往tbody 里面创建行: 有几个人(通过数组的长度)我们就创建几行
        var tbody = document.querySelector('tbody');
        for (var i = 0; i < datas.length; i++) { // 外面的for循环管行 tr
            // 1. 创建 tr行
            var tr = document.createElement('tr');
            tbody.appendChild(tr);
            // 2. 行里面创建单元格(跟数据有关系的3个单元格) td 单元格的数量取决于每个对象里面的属性个数  for循环遍历对象 datas[i]
            for (var k in datas[i]) { // 里面的for循环管列 td
                // 创建单元格 
                var td = document.createElement('td');
                // 把对象里面的属性值 datas[i][k] 给 td  
                // console.log(datas[i][k]);
                td.innerHTML = datas[i][k];
                tr.appendChild(td);
            }
            // 3. 创建有删除2个字的单元格 
            var td = document.createElement('td');
            td.innerHTML = '<a href="javascript:;">删除 </a>';
            tr.appendChild(td);

        }
        // 4. 删除操作 开始 
        var as = document.querySelectorAll('a');
        for (var i = 0; i < as.length; i++) {
            as[i].onclick = function() {
                // 点击a 删除 当前a 所在的行(链接的爸爸的爸爸)  node.removeChild(child)  
                tbody.removeChild(this.parentNode.parentNode)
            }
        }
        // for(var k in obj) {
        //     k 得到的是属性名
        //     obj[k] 得到是属性值
        // }
    </script>
</body>

</html>

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| clearwater 发表于 2020-3-12 13:16
本帖最后由 clearwater 于 2020-3-12 21:19 编辑

我觉得老师讲的tr 也没错。

创建一个,添加一个。(重复4次)

但是var tr 有错吗? (我这样写有啥问题吗)

打工仔-知恩 发表于 2020-3-12 13:26
本帖最后由 打工仔-知恩 于 2020-3-12 13:28 编辑
clearwater 发表于 2020-3-12 13:16
我觉得老师讲的tr 也没错。

创建一个,添加一个。(重复4次)

你这是啥子写法,错的吧....文中仅仅定义一个变量接收值
image.png

免费评分

参与人数 1吾爱币 +1 收起 理由
clearwater + 1 现在手上只有一CB币,晚一点再补

查看全部评分

 楼主| clearwater 发表于 2020-3-12 13:39
打工仔-知恩 发表于 2020-3-12 13:26
你这是啥子写法,错的吧....文中仅仅定义一个变量接收值

论坛把i 吃掉了。

我用(i)来代替[]吧。

难道不是每创建一个tr 把它存到 tr (0), tr(1), tr(2)中去吗?
泪鱼无梦 发表于 2020-3-12 13:40
在给元素加上tr[i]这种写法是在遍历元素时才使用,在动态创建时,HTML页面内并没有这个元素,找不到tr元素的索引,所以出错,你没必要担心覆盖问题,因为HTML页面中循环创建元素相当于一个累加过程,后面的元素不会将前面的元素覆盖

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
clearwater + 1 + 1 谢谢@Thanks!

查看全部评分

TanXin 发表于 2020-3-12 13:44
tr只是个局部变量(只在这个循环体内部可用),被你用来“引用”创建出来的表格行元素,并进行附加到表格(.appendChild)、添加单元格等操作。
本次循环结束后,tr变量的使命就结束了,它所占用的内存将在合适时机被回收,但它引用的DOM元素已被加入表格,正在被浏览器渲染显示,此时不会消失。
下次循环开始时,将产生新的tr变量,引用到新创建的行元素,对之前的行元素没有影响,不会覆盖。

引用的过程,相当于你拿着门牌(变量)去标记一间屋(对象实体),即使你拆了门牌或者把门牌贴到另一间屋,都不会对使用中的屋有什么影响。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
clearwater + 1 + 1 非常感谢大神

查看全部评分

 楼主| clearwater 发表于 2020-3-12 13:47
泪鱼无梦 发表于 2020-3-12 13:40
在给元素加上tr这种写法是在遍历元素时才使用,在动态创建时,HTML页面内并没有这个元素,找不到tr元素的索 ...

@打工仔-知恩
@泪鱼无梦

非常感谢两位大神的热心回复,好象懂了。等不晚于明天,有能量时,再给你们评分。






泪鱼无梦 发表于 2020-3-12 13:48
clearwater 发表于 2020-3-12 13:47
@打工仔-知恩
@泪鱼无梦

你每天学习不累吗,看你每天都在看前端
linguo2625469 发表于 2020-3-12 13:48
@TanXin正解
 楼主| clearwater 发表于 2020-3-12 13:51
TanXin 发表于 2020-3-12 13:44
tr只是个局部变量(只在这个循环体内部可用),被你用来“引用”创建出来的表格行元素,并进行附加到表格( ...

非常感谢大神。

等有能量再补评分。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 20:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表