JavaScript的table表格的增删改(面向对象)

简介: 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';
        })
    }
}
相关文章
|
6月前
|
JavaScript 前端开发 Java
深入JS面向对象(原型-继承)(三)
深入JS面向对象(原型-继承)
53 0
|
6月前
|
JavaScript 前端开发 Java
深入JS面向对象(原型-继承)(一)
深入JS面向对象(原型-继承)
59 0
|
3月前
|
JavaScript 前端开发
使用js生成表格标题、表格内容并且每行附带删除按钮然后插入到页面中
使用js生成表格标题、表格内容并且每行附带删除按钮然后插入到页面中
37 2
|
5月前
|
设计模式 JavaScript 前端开发
【JavaScript】深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略
JavaScript的继承机制基于原型链,它定义了对象属性和方法的查找规则。每个对象都有一个原型,通过原型链,对象能访问到构造函数原型上的方法。例如`Animal.prototype`上的`speak`方法可被`Animal`实例访问。原型链的尽头是`Object.prototype`,其`[[Prototype]]`为`null`。继承方式包括原型链继承(通过`Object.create`)、构造函数继承(使用`call`或`apply`)和组合继承(结合两者)。ES6的`class`语法是语法糖,但底层仍基于原型。继承选择应根据需求,理解原型链原理对JavaScript面向对象编程至关重要
122 7
【JavaScript】深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略
|
5月前
|
JavaScript
JS实现表格跨行变色
JS实现表格跨行变色
|
5月前
|
JavaScript
Vue.js中使用作用域插槽实现自定义表格组件
Vue.js中使用作用域插槽实现自定义表格组件
|
5月前
|
前端开发 JavaScript 数据可视化
详尽分享表格的编辑插件editable.js
详尽分享表格的编辑插件editable.js
121 0
|
6月前
|
前端开发 JavaScript
前端 JS 经典:Class 面向对象
前端 JS 经典:Class 面向对象
36 1
|
6月前
|
JavaScript 前端开发
JavaScript解决表格隔行换色的问题
JavaScript解决表格隔行换色的问题
32 0
|
6月前
|
JavaScript 前端开发
JavaScript实现将输入框中的信息保存到表格中
JavaScript实现将输入框中的信息保存到表格中
28 0