ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JavaScript_实现增删改操作(新增、删除、修改)

2021-12-09 21:00:36  阅读:166  来源: 互联网

标签:const name 删除 标签 JavaScript sex 修改 数组 增删


一、需求说明

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

2、删除
      点击表格中每一项信息之后的删除按钮,在弹出的确定弹窗中点击确定即可删除该项信息。
在这里插入图片描述


3、修改
      点击表格中每一项信息之后的修改按钮,在弹出的页面中修改要改变的信息,点击确定按钮,即可完成表格中该项信息的修改。
在这里插入图片描述



二、完整代码(含注释)

<!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、修改页面的取消按钮,添加点击事件,让修改页面隐藏消失。在这里插入图片描述                                             在这里插入图片描述

标签:const,name,删除,标签,JavaScript,sex,修改,数组,增删
来源: https://blog.csdn.net/weixin_43417844/article/details/121842750

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有