一、需求说明

1、新增

      通过输入框输入基本信息(姓名、性别、年龄、城市)之后,点击确定按钮即可往表格中新增一项信息;点击重置会清空你所输入的信息。

Java中如何调用JS修改元素标签属性_javascript


2、删除

      点击表格中每一项信息之后的删除按钮,在弹出的确定弹窗中点击确定即可删除该项信息。

Java中如何调用JS修改元素标签属性_html_02


3、修改

      点击表格中每一项信息之后的修改按钮,在弹出的页面中修改要改变的信息,点击确定按钮,即可完成表格中该项信息的修改。

Java中如何调用JS修改元素标签属性_ci_03

二、完整代码(含注释)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        table {
            border-collapse: collapse;
        }

        td {
            width: 100px;
            height: 50px;
            line-height: 50px;
            text-align: center;
            border: 1px solid #000;
            font-size: 30px;
        }

        .change {
            width: 100%;
            height: 100%;
            background: rgba(0, 0, 0, 0.5);
            display: none;
            justify-content: center;
            align-items: center;
            position: fixed;
            top: 0;
            left: 0;
        }

        .change>div {
            width: 300px;
            height: 300px;
            padding: 30px 15px;
            background: #fff;

        }
    </style>
</head>

<body>
    <div class="add">
        <p style="color: darkcyan; font-size: 25px;">新增</p>
        姓名: <input type="text" name="name"><br>
        年龄: <input type="text" name="age"><br>
        性别: 男<input type="radio" name="sex" value="男">
        女<input type="radio" name="sex" value="女">
        保密<input type="radio" name="sex" value="保密"><br>
        城市:
        <select name="city">
            <option value="0">北京</option>
            <option value="1">上海</option>
            <option value="2">广州</option>
            <option value="3">重庆</option>
            <option value="4">天津</option>
        </select> <br>
        <button>确定</button>
        <button type="reset">重置</button>
    </div>

    <hr>

    <table>
        <thead>
            <tr>
                <td>序号</td>
                <td>姓名</td>
                <td>性别</td>
                <td>年龄</td>
                <td>城市</td>
                <td>删除</td>
                <td>修改</td>
            </tr>
        </thead>
        <tbody></tbody>
    </table>

    <div class="change">
        <div>
            姓名: <input type="text" name="name"><br>
            年龄: <input type="text" name="age"><br>
            性别: 男<input type="radio" name="sex" value="男">
            女<input type="radio" name="sex" value="女">
            保密<input type="radio" name="sex" value="保密"><br>
            城市:
            <select name="city">
                <option value="0">北京</option>
                <option value="1">上海</option>
                <option value="2">广州</option>
                <option value="3">重庆</option>
                <option value="4">天津</option>
            </select> <br>
            <button>确定</button>
            <button>取消</button>
        </div>
    </div>

    <script>
        // 根据数组动态生成页面
        const arr = [{
                id: 1,
                name: '张三',
                sex: '男',
                age: 18,
                city: '北京'
            },
            {
                id: 2,
                name: '李四',
                sex: '女',
                age: 19,
                city: '上海'
            },
            {
                id: 3,
                name: '王五',
                sex: '男',
                age: 20,
                city: '广州'
            },
            {
                id: 4,
                name: '赵六',
                sex: '女',
                age: 21,
                city: '重庆'
            },
            {
                id: 5,
                name: '刘七',
                sex: '保密',
                age: 22,
                city: '天津'
            },
        ];
        // 城市数组
        const cityArr = ['北京', '上海', '广州', '重庆', '天津'];
        // 获取标签对象 
        const oTbody = document.querySelector('tbody');

        // 获取 新增相关 标签对象
        const oAdd = document.querySelector('.add');
        // 确定按钮
        const oBtnEnsure = oAdd.querySelectorAll('button')[0];
        // 重置按钮
        const oBtnReset = oAdd.querySelectorAll('button')[1];
        // 姓名
        const oIptName = oAdd.querySelector('[name="name"]');
        // 年龄
        const oIptAge = oAdd.querySelector('[name="age"]');
        // 性别
        const oIptSex = oAdd.querySelectorAll('[name="sex"]');
        // 城市
        const oSelCity = oAdd.querySelector('[name="city"]');

        // 获取 修改相关 标签对象
        const oChange = document.querySelector('.change');
        // 确定按钮
        const oBtnEnsureChange = oChange.querySelectorAll('button')[0];
        // 取消按钮
        const oBtnCancelChange = oChange.querySelectorAll('button')[1];
        // 姓名
        const oIptNameChange = oChange.querySelector('[name="name"]');
        // 年龄
        const oIptAgeChange = oChange.querySelector('[name="age"]');
        // 性别
        const oIptSexChange = oChange.querySelectorAll('[name="sex"]');
        // 城市
        const oSelCityChange = oChange.querySelector('[name="city"]');
        // 城市option
        const oOptChange = oChange.querySelectorAll('option');


        // 定义一个变量 
        // 存储 修改标签 对应的索引下标 
        let index;
        // 调用函数动态渲染生成页面
        setPage();


        // 封装函数 动态渲染生成页面
        function setPage() {
            // 空数组 生成 对应的 空内容
            if (arr.length === 0) {
                oTbody.innerHTML = '<tr><td colspan="7">没有匹配数据</td></tr>';
                return;
            }
            let str = '';
            arr.forEach(function (item, key) {
                str += `
                    <tr>
                        <td>${item.id}</td>
                        <td>${item.name}</td>
                        <td>${item.sex}</td>
                        <td>${item.age}</td>
                        <td>${item.city}</td>
                        <td><button name="del" index="${key}">删除</button></td>
                        <td><button name="change" index="${key}">修改</button></td>
                    </tr>
                `;
            })
            oTbody.innerHTML = str;
        }


        // 新增
        // 给确定按钮添加点击事件
        oBtnEnsure.addEventListener('click', function () {
            // 弹出确认框,点击确定之后,再执行程序
            // 也就是 window.confirm() 的返回值是true,再执行程序
            if (window.confirm('您确定要添加吗?')) {
                // 获取数据 
                // 获取 姓名
                let name = oIptName.value;
                console.log(name);
                // 获取 年龄 转化为数值类型
                let age = oIptAge.value - 0;
                // 获取 城市
                // 通过 数组 将 城市对应的数值 转化为具体的中文数据
                let city = cityArr[oSelCity.value];
                // 获取 性别
                let sex;
                for (let i = 0; i <= oIptSex.length - 1; i++) {
                    if (oIptSex[i].checked) {
                        sex = oIptSex[i].value;
                        break;
                    }
                }
                //这里也可以用forEach,但是forEach会从头循环到尾,不如用for循环,可以在找到满足条件之后终止循环
                // oIptSex.forEach(function (item) {
                //     if (item.checked) {
                //         sex = item.value;
                //     }
                // })
                // 新增id 是 原始数据中 最后一个数据单元id值 +1 
                let id = arr[arr.length - 1].id + 1;
                // 生成一个对象,写入数组的末位
                arr.push({
                    id: id,
                    name: name,
                    sex: sex,
                    age: age,
                    city: city
                })
                console.log(arr);
                // 再次调用函数,动态渲染生成新的页面
                setPage();
            }
        })
        // 给重置按钮添加点击事件
        oBtnReset.addEventListener('click', function () {
            oIptName.value = '';
            oIptAge.value = '';
            for (let i = 0; i <= oIptSex.length - 1; i++) {
                oIptSex[i].checked = false;
            }
            oSelCity.value = 0;
        })


        // 给<tbody>标签添加点击事件
        // 通过事件委托实现项目需求
        oTbody.addEventListener('click', function (e) {
            // 根据 e.target不同的name,判断点击的是什么标签,执行不同程序

            // 删除程序
            if (e.target.getAttribute('name') === 'del') {
                // 弹出确认框,点击确定后再执行删除程序
                if (!window.confirm('您确定要删除吗?')) {
                    return;
                }
                // 在数组中按照点击删除按钮存储的索引下标,删除一个单元
                arr.splice(Number(e.target.getAttribute('index')), 1);
                // 根据新数组,动态渲染生成页面
                setPage();

                // 修改程序
            } else if (e.target.getAttribute('name') === 'change') {
                // 让修改的div标签出现
                oChange.style.display = 'flex'; // css样式中用了弹性盒子,所以这里要用display:flex
                // 给变量赋值存储修改标签对应的索引下标
                index = Number(e.target.getAttribute('index'));

                // 显示要修改的原始数据
                // 姓名、年龄,直接赋值 
                oIptNameChange.value = arr[index].name;
                oIptAgeChange.value = arr[index].age;
                // 循环遍历存储性别的 input伪数组
                // 哪个标签的 value和数组对象中 sex的键值相同,就添加 checked,默认选中。
                for (let i = 0; i <= oIptSexChange.length - 1; i++) {
                    if (oIptSexChange[i].value === arr[index].sex) {
                        // 给对应的性别得 input标签添加选中效果
                        oIptSexChange[i].checked = true;
                        // 终止循环
                        break;
                    }
                }
                // 循环遍历 城市option伪数组
                // select>option标签 的 内容 和 数组arr中对应的对象的city数据相同
                // 给 这个 select>option标签 添加 选中效果
                for (let i = 0; i <= oOptChange.length - 1; i++) {
                    if (oOptChange[i].innerHTML === arr[index].city) {
                        oOptChange[i].selected = true;
                    }
                }
            }
        })


        // 给修改页面里面的 确定按钮添加点击事件
        oBtnEnsureChange.addEventListener('click', function () {
            // 弹出确认框,点击确定再执行程序
            if (window.confirm('您确定要修改吗?')) {
                // 获取 修改标签中的数据数值
                // 获取 姓名
                let name = oIptNameChange.value;
                // 获取 年龄,转化为数值类型
                let age = oIptAgeChange.value - 0;
                // 获取 城市
                // 通过数组,将城市对应的数值转化为具体的中文数据
                let city = cityArr[oSelCityChange.value];
                // 获取 性别
                let sex;
                for (let i = 0; i <= oIptSexChange.length - 1; i++) {
                    if (oIptSexChange[i].checked) {
                        sex = oIptSexChange[i].value;
                        break;
                    }
                }
                // 修改点击的修改标签中 存储的索引下标对应的数组中的对象所存储的数据
                arr[index].name = name;
                arr[index].age = age;
                arr[index].sex = sex;
                arr[index].city = city;
                // 调用函数 根据新的数组动态渲染生成页面
                setPage();
                // 让 修改 页面 再次隐藏
                oChange.style.display = 'none';
            }
        })
        // 给修改的取消按钮添加点击事件
        oBtnCancelChange.addEventListener('click', function () {
            // 让修改 页面 隐藏
            oChange.style.display = 'none';
        })
    </script>

</body>

</html>


三、步骤总结

1、定义函数 setPage() ,动态渲染生成页面

      1-1   由于当前没有数据库数据,所以自己定义一个数组来模拟数据库数据
      1-2   定义变量,存储最终的字符串内容
      1-3   循环遍历数组数据,根据数组中的数据动态生成字符串
      1-4   如果数组中没有内容,需要做出相应提示
      1-5   将字符串写入标签对象

2、新增的点击事件

      给数组新增数据单元,数据单元必须符合数组中数据结构,对象中以键值对的形式存储数据,要符合原始数组中 键名存储键值的形式,根据新的数组再次动态渲染生成页面。
      2-1   弹出确认框,确定之后再执行新增操作
      2-2   获取标签对象中的数据
      2-3   将数据定义成对象的形式,写入数组的末位中
      2-4   再次调用 setPage() 函数动态渲染生成页面

3、通过事件委托的形式给删除、修改标签添加点击事件

      删除:
      3-1   弹出确认框确定之后再执行删除操作
      3-2   获取点击的删除标签存储的索引下标,按照这个索引下标从数组中删除一个数据单元
      3-3   调用函数,根据新数组再次动态渲染生成页面

      修改:
      3-1   让修改页面显示
      3-2   给全局变量 index 存储点击修改标签对应的索引下标
      3-3   给修改页面中的标签赋值数组中对应的对象存储的数据。 nameage 两个 input 直接赋值对象中存储的 nameage 数据;循环遍历性别 input 标签伪数组,如果性别 input 标签的 value 和数组中对应对象存储的 sex 数据相同,给这个性别 input 标签 checked 属性赋值 true ,之后终止循环;循环遍历城市 option 标签伪数组,如果城市option 标签的内容和数组中对应对象存储的 city 数据相同,给这个城市 option 标签 selected 属性赋值 true ,之后终止循环

4,、修改的确定按钮,添加点击事件

      获取 input 等标签中输入的数据,修改数组中对应的对象单元存储的数据,根据新的数组 动态渲染生成页面。
      4-1   弹出确认框,确定之后再执行删除操作
      4-2   获取 inputselect 等标签存储的数据
      4-3   根据全局变量 index 作为索引下标,修改数组中对应索引下标获取的对象单元存储的数据数值
      4-4   调用函数 setPage() ,根据新的数组单元再次动态渲染生成页面内容
      4-5   让修改页面隐藏消失

5、修改页面的取消按钮,添加点击事件,让修改页面隐藏消失。