原生js实现表格增删查改

HTML部分

<div class="box">

        <head>
            <h2>表格管理系统</h2>
            <div class="s">
                <label>姓名:</label><input type="text" class="searchUname"><button class="search">查询</button>
            </div>
        </head>
        <div class="content clearfix">
            <form class="left">
                <label>姓名:</label>
                <input type="text" class="uname hx"> 学号:
                <input type="text" class="uid hx"> 性别:
                <input type="text" class="sex hx"> 年龄:
                <input type="text" class="age hx">
                <input type="button" class="add" value="添加">
            </form>
            <table border="1" cellspacinbg="0">
                <thead>
                    <th>序号</th>
                    <th>姓名</th>
                    <th>学号</th>
                    <th>性别</th>
                    <th>年龄</th>
                    <th>操作</th>
                </thead>
                <tbody>
                </tbody>
            </table>
        </div>
    </div>

CSS部分

* {
    padding: 0;
    margin: 0;
}

body {
    background: url(../img/bg.jpg);
    background-repeat: no-repeat;
    background-size: cover;
    font-family: '宋体';
}

a {
    text-decoration: none;
}

.box .s {
    position: absolute;
    top: 1%;
    left: 0%;
    text-align: left;
    padding-left: 10px;
}

h2 {
    font-size: 36px;
    font-family: '宋体';
}

.box {
    position: relative;
    width: 880px;
    height: 700px;
    background-color: rgba(255, 255, 255, 0.5);
    margin: 0 auto;
    text-align: center;
}

.content {
    display: flex;
    justify-content: space-around;
}

.content .left {
    width: 165px;
}

table {
    width: 666px;
    height: 25px;
    font-size: 20px;
}

js部分
获取元素

var num = 1; //自增序号
var data = []; //存储数据(类似于数据库)
var uname = document.querySelector('.uname'); //姓名输入框元素
var uid = document.querySelector('.uid'); //学号输入框元素
var sex = document.querySelector('.sex'); //性别输入框元素
var age = document.querySelector('.age'); //年龄输入框元素
var btn = document.querySelector('.add'); //添加输入框元素
var tbody = document.querySelector('tbody'); //表主体元素
var search = document.querySelector('.search'); //按钮查询
var searchUname = document.querySelector('.searchUname'); //按钮查询前的输入框元素
var flag = false; //判断添加按钮是添加状态还是编辑状态

添加模块
点击添加按钮首先判断当前状态是添加还是更新(此判断是编辑时加上去的,如果只写添加功能请忽略),如果为添加状态首先判断输入框是否为空,如果为空给一个弹窗提示,不为空时先判断有没有相同的学号,有相同学号时给一个弹窗提示,没有相同学号时往data数组里添加数据,然后按照要求先创建一个tr节点,然后在tr里再创建td节点,最后给里面的删除编辑a标签绑定事件

btn.onclick = function() {
    if (flag) { //如果flag为true说明在编辑状态
        var obj = {
            uname: uname.value,
            uid: uid.value,
            sex: sex.value,
            age: age.value
        };
        update(obj);
        uid.removeAttribute('readonly');
        load();
    } else if (uname.value.trim() == '' || uid.value.trim() == '' || sex.value.trim() == '' || age.value.trim() == '') { //判断数据不能为空
        alert('数据不能为空');
    } else {
        if (check(uid.value)) { //检查是否有学号相同的
            data.push({
                uname: uname.value,
                uid: uid.value,
                sex: sex.value,
                age: age.value
            });
            var arr = [uname.value, uid.value, sex.value, age.value]; //创建一个临时数组为了方便赋值
            var tr = document.createElement('tr');
            tr.style.height = 25 + 'px';//每次创建25px高度的tr
            tbody.appendChild(tr);
            tr.setAttribute('index', num);
            var xh = document.createElement('td');
            xh.innerHTML = num++;
            tr.appendChild(xh);
            for (var i = 0; i < 5; i++) {
                if (i == 4) { //判断是否到操作这个单元格
                    var td = document.createElement('td');
                    td.innerHTML = '<a href="javascript:;" class="del">删除</a> <a href="javascript:;" class="edit">编辑</a><a href="javascript:;" class="up">↑</a><a href="javascript:;" class="down">↓</a>';
                } else {
                    var td = document.createElement('td');
                    td.innerHTML = arr[i];
                    td.className = 'nr';//给每个新创建的td添加类名
                }

                tr.appendChild(td);
            }
            binding(); //给删除编辑a标签绑定事件

        } else {
            alert('不能添加相同学号的数据');
        }
    }
};
// 检查是否有相同学号
function check(uid) {
    if (data.length < 1) return true;//如果原数据数组为空直接返回true
    for (var i = 0; i < data.length; i++) {
        if (data[i].uid === uid) {
            return false;
        }
    }
    return true;
}

绑定事件的方法

//给a标签里的删除编辑绑定事件
function binding() {
	//为删除绑定数据
    var dels = document.querySelectorAll('.del');
    for (var i = 0; i < dels.length; i++) {
        dels[i].onclick = function() {
            uid.removeAttribute('readonly');
            flag = false;
            if (confirm('确认删除?')) {//如果点的是确定
                var id = this.parentNode.previousSibling.previousSibling.previousSibling;//获取当前行的学号
                del(id.innerHTML);//del()是自己封装的一个方法
                load();//自己封装的重新加载数据的方法
            }
        }
    }
    //下为编辑绑定事件
    var edits = document.querySelectorAll('.edit');//获取所有编辑a标签
    for (let i = 0; i < edits.length; i++) {//为所有编辑绑定点击事件
        edits[i].onclick = function() {
            var four = this.parentNode.previousSibling;//获取年龄这个td元素
            var three = this.parentNode.previousSibling.previousSibling;//获取性别这个td元素
            var two = this.parentNode.previousSibling.previousSibling.previousSibling;//获取学号这个td元素
            var one = this.parentNode.previousSibling.previousSibling.previousSibling.previousSibling;//获取姓名这个td元素
            //回显到左边输入框
            uname.value = one.innerHTML;
            uid.value = two.innerHTML;
            sex.value = three.innerHTML;
            age.value = four.innerHTML;
            var id = two.innerHTML;
            uid.setAttribute('readonly', 'readonly');//为学号设置只读属性
            flag = true;//当前添加按钮现在为更新状态
            var nrs = this.parentNode.parentNode.querySelectorAll('.nr');//获取当行所有的类名带有nr的元素
            for (var j = 0; j < nrs.length; j++) {
                var temp = nrs[j].innerHTML;//先用一个中间变量存储当前td里的内容
                nrs[j].innerHTML = '<input type="text"/>';//把td里的内容变成一个input
                nrs[j].children[0].value = temp;//给input一开始存储的td内容
                if (j == 1) {
                    nrs[j].children[0].setAttribute('readonly', 'readonly');
                }
            }
            var hxs = document.querySelectorAll('.hx');
            for (let k = 0; k < nrs.length; k++) {
                nrs[k].children[0].onchange = function() {
                    hxs[k].value = nrs[k].children[0].value;
                }
            }
            nrs[0].children[0].focus();
            this.innerHTML = '更新';
            this.className = 'renew';
            renewdata();//自己封装更新数据的方法
            return;
        }
    }
    };

重新加载数据的方法

function load() {
    tbody.innerHTML = '';//清空tBody元素里的所有内容
    num = 1;//自增序号要重新从1加载
    for (var i = 0; i < data.length; i++) {
        var tr = document.createElement('tr');
        tbody.appendChild(tr);
        tr.setAttribute('index', num);
        var xh = document.createElement('td');
        xh.innerHTML = num++;
        tr.appendChild(xh);
        for (var k in data[i]) {
            var td = document.createElement('td');
            td.innerHTML = data[i][k];
            td.className = 'nr';
            tr.appendChild(td);
        }
        var td = document.createElement('td');
        td.innerHTML = '<a href="javascript:;" class="del">删除</a> <a href="javascript:;" class="edit">编辑</a><a href="javascript:;" class="up">↑</a><a href="javascript:;" class="down">↓</a>';
        tr.appendChild(td);
    }
    var inps = document.querySelectorAll('input');//获取左边的所有输入框的元素
    for (var i = 0; i < inps.length; i++) {
        inps[i].value = '';//将输入框的内容清空
    }
    binding();//给a标签里的删除编辑绑定事件
}

删除模块
点击删除时会弹出一个确认框,如果点击确定时,先拿到当前行的学号,调用del方法

function del(uid) {//uid为你点击确定时获取当前行的学号
    for (var i = 0; i < data.length; i++) {//遍历原数据数组
        if (data[i].uid == uid) {
            data.splice(i, 1);//学号匹配上把当前这个数据删除
            return;
        }
    }
}

查询模块
点击查询按钮时,先获取按钮前输入框的内容,然后调用select方法

//点击查询按钮
search.onclick = function() {
        uid.removeAttribute('readonly');
        flag = false;
        select(searchUname.value);//自己封装的查询方法
    }
 //根据姓名查询
function select(uname) {//uname为点击按钮时输入框的内容
    if (uname == '') {//如果姓名为空就把所有数据重新加载出来
        load();
        return;
    }
    var res = [];//临时数组用来存储当前查出的信息
    for (var i = 0; i < data.length; i++) {
        if (data[i].uname == uname) {
            res.push({
                uname: data[i].uname,
                uid: data[i].uid,
                sex: data[i].sex,
                age: data[i].age
            });
        }
    }
    //查询完以后把临时数组数据加载在表格里
    tbody.innerHTML = '';
    num = 1;
    for (var i = 0; i < res.length; i++) {
        var tr = document.createElement('tr');
        tbody.appendChild(tr);
        tr.setAttribute('index', num);
        var xh = document.createElement('td');
        xh.innerHTML = num++;
        tr.appendChild(xh);
        for (var k in res[i]) {
            var td = document.createElement('td');
            td.innerHTML = res[i][k];
            td.className = 'nr';
            tr.appendChild(td);
        }
        var td = document.createElement('td');
        td.innerHTML = '<a href="javascript:;" class="del">删除</a> <a href="javascript:;" class="edit">编辑</a><a href="javascript:;" class="up">↑</a><a href="javascript:;" class="down">↓</a>';
        tr.appendChild(td);
    }
    binding();
}

编辑模块
点击编辑时先获取当前姓名、学号、性别、学号,把当前编辑变为更新,类名为renew,并且把信息回显到左边的输入框,并且给左边的学号输入框设置只读属性,添加按钮变为更新状态,再获取当前行的类名为nr的td元素,遍历给每个nr里面添加input标签,并且赋相应的值,到学号那个input设置只读属性,点击更新时调用renewdata方法,如果点击添加就调用update方法

function renewdata() {
    var renews = document.querySelectorAll('.renew');//获取所有类名为rennew的元素
    for (let i = 0; i < renews.length; i++) {//给每个renew绑定点击事件
        renews[i].onclick = function() {
            var nrs = this.parentNode.parentNode.querySelectorAll('.nr');//获取当前renew这行的所有类名为nr的td元素
            var obj = [];//临时数组用来存储nr里每一个input元素的内容
            for (var k = 0; k < 4; k++) {
                obj[k] = nrs[k].children[0].value;
            }
            var id = obj[1];//当前行的学号
            newData(id, obj);//调用newData方法把原数据修改
            this.innerHTML = '编辑';//把当前更新变为编辑
            this.className = 'edit';//类名改为edit
            flag = false;//添加按钮为添加状态
            uid.value = '';//学号输入框清空内容
            uname.value = '';//姓名输入框清空内容
            age.value = '';//年龄输入框清空内容
            sex.value = '';//性别输入框清空内容
            uid.removeAttribute('readonly');//把学号输入框移除只读属性
            for (var i = 0; i < nrs.length; i++) {//把nr里的input标签清除
                var temp = nrs[i].children[0].value;//先用一个中间变量存储当前nr里input里的内容
                nrs[i].innerHTML = temp;//把nr里的内容变为temp
            }
            binding();
        }
    }
}
// 点击更新时更新原数据
function newData(uid, obj) {
    for (var i = 0; i < data.length; i++) {
        if (uid == data[i].uid) {
            data[i].uname = obj[0];
            data[i].uid = obj[1];
            data[i].sex = obj[2];
            data[i].age = obj[3];
            return;
        }
    }
}
//编辑状态下点添加更新原数据
function update(obj) {
    for (var i = 0; i < data.length; i++) {
        if (data[i].uid == obj.uid) {
            data[i].uname = obj.uname;
            data[i].uid = obj.uid;
            data[i].sex = obj.sex;
            data[i].age = obj.age;
            flag = false;
            return;
        }
    }
}
  • 10
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值