IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> JavaScript的table表格的增删改(面向对象) -> 正文阅读

[JavaScript知识库]JavaScript的table表格的增删改(面向对象)

运行效果

?HTML部分:

<!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;
            text-align: center;
            border:1px solid #000;
        }
        .add{
            margin: 0 0 50px 0;
        }

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

        }

        .change>div{
            width: 300px;
            height: 200px;
            background: #fff;
            padding: 20px 0 0 20px;
        }
    </style>
</head>
<body>
    <!-- 新增 -->
    <div class="add">
        姓名: <input type="text" name="name"><br>
        性别: 男<input type="radio" name="sex" value="男">
            女<input type="radio" name="sex" value="女">
            保密<input type="radio" name="sex" value="保密"><br>
        年龄: <input type="number" name="age" min="0" max="250"><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>            
</div>

<!-- 修改 -->
<div class="change">
    <div>
        姓名: <input type="text" name="name"><br>
        性别: 男<input type="radio" name="sex" value="男">
            女<input type="radio" name="sex" value="女">
            保密<input type="radio" name="sex" value="保密"><br>
        年龄: <input type="number" name="age" min="0" max="250"><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 name="true">确定</button>
        <button name="false">取消</button>            
    </div>

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

   
    <script src="./tablefun.js"></script>
    <script>
        // 定义一个数组模拟数据库数据
        const arr = [
        {id:1 , name:'张三' , age:18 , sex:'男' , city:'北京' },
        {id:2 , name:'李四' , age:19 , sex:'女' , city:'上海' },
        {id:3 , name:'王五' , age:20 , sex:'男' , city:'广州' },
        {id:4 , name:'赵六' , age:21 , sex:'女' , city:'重庆' },
        {id:5 , name:'刘七' , age:22 , sex:'男' , city:'天津' },
    ];
        // 获取标签对象
        const oTable = document.querySelector('table');
        const oDivAdd = document.querySelector('.add');
        const oDivChange = document.querySelector('.change');

        // 面向对象编程
        // 调用 构造函数 生成 实例化对象
        const xx = new CreateFunction(oTable,arr,oDivAdd,oDivChange);
        
        // 入口函数
        xx.init();
    </script>
</body>
</html>

JavaScript代码:

class CreateFunction {
    constructor(element, ImgArr, addElement, changeElement) {
        // 定义属性 存储 形参
        this.ele = element;
        this.arr = ImgArr;
        this.add = addElement;
        this.change = changeElement;
        // 全局变量
        this.oTbody;
        // 新增相关的全局变量
        this.oAddIptName;
        this.oAddIptAge;
        this.oAddIptCity;
        this.oAddIptSexAll;
        this.oAddBtn;
        this.cityArr = ['北京', '上海', '广州', '重庆', '天津'];
        // 修改相关的变量
        this.oChangeIptName;
        this.oChangeIptAge;
        this.oChangeIptCity;
        this.oChangeIptSexAll;
        this.oChangeOption;
        this.oChangeBtnTrue;
        this.oChangeBtnFalse;

    }
    // 入口函数
    init() {
        this.setPage();
        this.addPage();
        this.changePage();
        this.changes();
    }

    // 内容动态生成
    setPage() {
        this.oTbody = this.ele.querySelector('tbody');
        // 如果数组长度 是 0 证明 是一个空数组 
        if (this.arr.length === 0) {
            // 页面对象生成 空内容
            this.oTbody.innerHTML = '<tr><td colspan="7">没有匹配的内容</td></tr>';

            // 如果数组长度 不是 0 证明 数组有内容
        } else {
            // 根据数组内容 生成页面内容
            // 定义空字符串
            let str = '';
            // 循环遍历数组
            this.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>
                `;
            });
            // 将内容写入tbody标签中
            this.oTbody.innerHTML = str;
        }
    }
    addPage() {
        // 数据标签
        this.oAddIptName = this.add.querySelector('[name="name"]');
        this.oAddIptAge = this.add.querySelector('[name="age"]');
        this.oAddIptCity = this.add.querySelector('[name="city"]');
        this.oAddIptSexAll = this.add.querySelectorAll('[name="sex"]');


        // button标签
        this.oAddBtn = this.add.querySelector('button');


        // 给 新增 input标签 添加 点击事件 
        this.oAddBtn.addEventListener('click', () => {
            // 确定 添加 再执行 添加操作
            // 点击 取消 执行 return 终止之后程序的操作
            // if语句 {} 中 只有一行代码 可以不写 { }  
            if (!window.confirm('您确定要添加吗?')) return;

            // 获取数据
            let name = this.oAddIptName.value;
            let age = this.oAddIptAge.value;

            // 使用 索引下标 从 数组中获取对应的城市名称
            let city = this.cityArr[Number(this.oAddIptCity.value)];

            let sex = '';
            // 性别 是 多个单选按钮 选中那个标签 获取那个标签的数据
            for (let i = 0; i <= this.oAddIptSexAll.length - 1; i++) {
                // i 是索引下标
                // oAddIptSexAll[i] 是 单选标签
                if (this.oAddIptSexAll[i].checked) {
                    // 如果 oAddIptSexAll[i].checked 为 true 
                    // 也就是 选中的是当前这个 input标签 
                    // 获取 这个input标签的value数据
                    sex = this.oAddIptSexAll[i].value;
                    // 终止之后的循环操作
                    break;
                }
            }

            // 将数据定义为 对象 
            // 实际项目中 id序号 是 后端程序根据 数据库数据自动添加的
            // 目前凑合写一个 原始数组 最后有一个数据 id+1 
            const obj = { id: arr[arr.length - 1].id + 1, name: name, age: age, sex: sex, city: city };

            console.log(obj);

            // 将新对象 写入 数组末位
            this.arr.push(obj);

            // 再次调用函数 动态渲染新增页面内容
            this.setPage();

        })


    }
    changePage() {
        // 数据标签
        this.oChangeIptName = this.change.querySelector('[name="name"]');
        this.oChangeIptAge = this.change.querySelector('[name="age"]');
        this.oChangeIptCity = this.change.querySelector('[name="city"]');
        this.oChangeIptSexAll = this.change.querySelectorAll('[name="sex"]');
        this.oChangeOption = this.change.querySelectorAll('option');

        // button标签
        this.oChangeBtnTrue = this.change.querySelector('[name="true"]');
        this.oChangeBtnFalse = this.change.querySelector('[name="false"]');
        // 通过事件委托 给 tbody 标签 添加 点击事件
        this.oTbody.addEventListener('click', (e) => {
            // 事件对象 name属性值 是 del 点击的是删除按钮 
            if (e.target.getAttribute('name') === 'del') {
                // 确定删除 再执行删除程序
                if (window.confirm('您确定要删除吗?')) {
                    // 执行删除程序 
                    this.arr.splice(Number(e.target.getAttribute('index')), 1);
                    // 再次调用函数动态生成新的页面内容
                    this.setPage();
                }

                // 事件对象 name属性值 是 change 点击的是修改按钮 
            } else if (e.target.getAttribute('name') === 'change') {
                // 让 修改div显示
                this.change.style.display = 'flex';

                // 设定 修改div 中 input等标签 显示的原始数据
                // 设定的是 修改button 对应的 数组单元 也就是 数组中存储的对象 其中的数据
                // button标签 index属性 存储 索引下标

                const obj = this.arr[Number(e.target.getAttribute('index'))];

                // 设定 修改标签 index属性的属性值 
                // 和 当前 修改button标签 index属性的属性值相同
                this.oChangeBtnTrue.setAttribute('index', Number(e.target.getAttribute('index')));

                // 设定标签的数据

                // name age 直接写入数据
                this.oChangeIptName.value = obj.name;
                this.oChangeIptAge.value = obj.age;

                // 性别 循环遍历 性别input标签 
                // 给 标签value 和 对象中value相同给的标签 添加 checked默认选中
                for (let i = 0; i <= this.oChangeIptSexAll.length - 1; i++) {
                    if (this.oChangeIptSexAll[i].value === obj.sex) {
                        this.oChangeIptSexAll[i].checked = true;
                        break;
                    }
                }

                // 城市 option 循环遍历 
                // option标签value作为索引下标 从 数组中 获取 城市字符串 
                // 和 对象中 city 属性对应的属性值 相同
                // 添加选中状态
                for (let i = 0; i <= this.oChangeOption.length - 1; i++) {
                    // i 是 索引下标 
                    // oChangeOption[i] 是 option标签 
                    // oChangeOption[i].value 是 0 1 2 3 4 ...
                    // cityArr[ Number(oChangeOption[i].value) ] 从数组中获取城市名称
                    if (this.cityArr[Number(this.oChangeOption[i].value)] === obj.city) {
                        // option标签 添加 选中状态
                        this.oChangeOption[i].selected = true;
                        // 终止循环
                        break;
                    }
                }

            }
        })
    }

    changes() {
        // 给 修改 取消标签 添加点击事件 
        this.oChangeBtnFalse.addEventListener('click', () => {
            // 点击取消 不再修改数据 让 修改div 隐藏
            this.change.style.display = 'none';
        })


        // 给 修改 确定标签 添加点击事件
        this.oChangeBtnTrue.addEventListener('click', (e) => {
            // 弹出提示框 确定再修改
            if (!window.confirm('您确定修改吗?')) return;

            // 修改数组中对应单元的数据
            // 根据 确定标签 设定的index属性 作为索引下标 从数组中获取数据
            let obj = this.arr[Number(e.target.getAttribute('index'))];

            // 修改对象中的数据 是 修改input标签中的数据
            obj.name = this.oChangeIptName.value;
            obj.age = this.oChangeIptAge.value;

            obj.city = this.cityArr[Number(this.oChangeIptCity.value)];


            for (let i = 0; i <= this.oChangeIptSexAll.length - 1; i++) {
                if (this.oChangeIptSexAll[i].checked) {
                    obj.sex = this.oChangeIptSexAll[i].value;
                    break;
                }
            }


            // 根据新的数据再次动态渲染生成页面
            this.setPage();

            // 让修改div隐藏
            this.change.style.display = 'none';
        })

    }
}

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-16 12:59:54  更:2022-02-16 13:00:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:31:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码