基于HTML+CSS+‌JavaScript实现学生信息管理系统(第8节)


在前面的教程中,我们已经详细讲解了HTML、CSS、JavaScript的基础知识。本节教程我们将实现一个基于HTML、CSS和JavaScript构建的学生信息管理系统,包括添加、修改和删除学生信息的功能。用户界面通过HTML和CSS设计,利用JavaScript模拟连接数据库的操作。在实际应用中,你需要将数据存储逻辑连接到后端数据库,实现对学生信息的管理。

1、学生信息管理系统概述

这个简单的学生信息管理系统无连接后端数据库,通过使用HTML、CSS和JavaScript来创建一个基本的学生信息管理界面。用户可以添加新的学生信息或删除旧的学生信息,每次添加后都会模拟数据库操作,立即更新表格中的内容。同时,每行信息后面的“修改”按钮可以修改相应的学生信息。注意,该系统只是临时修改HTML页面中标签的内容,非实际存储数据,手动刷新页面后将会回到初始界面的数据。在实际应用中,需要更复杂的逻辑来处理学生信息的持久化存储,例如通过与后端服务器交互,再使用MySQL数据库存储数据等。

学生信息管理系统实现效果如下图所示:

2、创建基于HTML、CSS、JavaScript的3个基础文件

首先,我们在任意位置创建一个“students”文件夹,然后进入“students”文件夹创建如下3个文件:

students/
├── index.html
├── student.js
└── student.css

(1)在“students”文件夹内的index.html文件中添加以下代码:

index.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>学生信息管理系统</title>
    <link rel="stylesheet" href="student.css" type="text/css">
</head>
<body>
    <div id="total">
        <header>
            <hr/>
            <h1>学生信息管理系统</h1>
            <hr/>
        </header>
        <div id="second">
            <button id="add" onclick="add()">新增</button>
            <button id="del" onclick="del()">删除</button>
        </div>
        <div id="main">
            <table cellspacing="0px" id="myTable">
                <thead>
                    <tr>
                        <th class="col1"><input type="checkbox" onclick="checkAll(this)"/></th>
                        <th class="col2">序号</th>
                        <th class="col3">学号</th>
                        <th class="col4">姓名</th>
                        <th class="col5">学院</th>
                        <th class="col6">专业</th>
                        <th class="col7">年级</th>
                        <th class="col8">班级</th>
                        <th class="col9">年龄</th>
                        <th class="col10">操作</th>
                    </tr>
                </thead>
                <tbody></tbody>
            </table>
        </div>
        <div id="final">
            <p></p>
            <p id="pageNum">1</p>
            <P>页(总共</P>
            <p id="nums">0</p>
            <p>条,每页最多显示10条)</p>
            <button id="next" onclick="next()">下一页</button>
            <button id="previous" onclick="previous()">上一页</button>
        </div>
    </div>
    <div id="totalBackground"></div>
    <div id="addBlock">
        <div id="addHeader">新增学生信息</div>
        <div id="addMain">
            <table id="addMessageTable">
                <tr>
                    <td class="addTableTd1">学号</td>
                    <td class="addTableTd2"><input type="text" id="stuId1" /></td>
                </tr>
                <tr>
                    <td class="addTableTd1">姓名</td>
                    <td class="addTableTd2"><input type="text" id="name1" /></td>
                </tr>
                <tr>
                    <td class="addTableTd1">学院</td>
                    <td class="addTableTd2"><input type="text" id="colg1" /></td>
                </tr>
                <tr>
                    <td class="addTableTd1">专业</td>
                    <td class="addTableTd2"><input type="text" id="profession1" /></td>
                </tr>
                <tr>
                    <td class="addTableTd1">年级</td>
                    <td class="addTableTd2"><input type="text" id="grade1" /></td>
                </tr>
                <tr>
                    <td class="addTableTd1">班级</td>
                    <td class="addTableTd2"><input type="text" id="stuClass1" /></td>
                </tr>
                <tr>
                    <td class="addTableTd1">年龄</td>
                    <td class="addTableTd2"><input type="text" id="age1" /></td>
                </tr>
            </table>
        </div>
        <div style="text-align: right; height: 35px; padding-top: 5px; padding-right: 20px">
            <button id="submit" onclick="sumbit()">提交</button>
            <button id="addCancel" onclick="addCancel()">取消</button>
        </div>
    </div>
    <div id="updateBlock">
        <div id="updateHeader">修改学生信息</div>
        <div id="updateMain">
            <table id="updateMessageTable">
                <tr>
                    <td class="updateTableTd1">学号</td>
                    <td class="updateTableTd2"><input type="text" id="stuId2" /></td>
                </tr>
                <tr>
                    <td class="updateTableTd1">姓名</td>
                    <td class="updateTableTd2"><input type="text" id="name2" /></td>
                </tr>
                <tr>
                    <td class="updateTableTd1">学院</td>
                    <td class="updateTableTd2"><input type="text" id="colg2" /></td>
                </tr>
                <tr>
                    <td class="updateTableTd1">专业</td>
                    <td class="updateTableTd2"><input type="text" id="profession2" /></td>
                </tr>
                <tr>
                    <td class="updateTableTd1">年级</td>
                    <td class="updateTableTd2"><input type="text" id="grade2" /></td>
                </tr>
                <tr>
                    <td class="updateTableTd1">班级</td>
                    <td class="updateTableTd2"><input type="text" id="stuClass2" /></td>
                </tr>
                <tr>
                    <td class="updateTableTd1">年龄</td>
                    <td class="updateTableTd2"><input type="text" id="age2" /></td>
                </tr>
            </table>
        </div>
        <div style="text-align: right; height: 35px; padding-top: 5px; padding-right: 20px">
            <button id="preservation" onclick="preservation()">保存</button>
            <button id="updateCancel" onclick="updateCancel()">取消</button>
        </div>
    </div>
    <div id="examineBlock">
        <div id="examineHeader">查看学生信息</div>
        <div id="examineMain">
            <table id="examineMessageTable">
                <tr>
                    <td class="examineTableTd1">学号</td>
                    <td class="examineTableTd2"><input type="text" id="stuId3" readonly="readonly" /></td>
                </tr>
                <tr>
                    <td class="examineTableTd1">姓名</td>
                    <td class="examineTableTd2"><input type="text" id="name3" readonly="readonly" /></td>
                </tr>
                <tr>
                    <td class="examineTableTd1">学院</td>
                    <td class="examineTableTd2"><input type="text" id="colg3" readonly="readonly" /></td>
                </tr>
                <tr>
                    <td class="examineTableTd1">专业</td>
                    <td class="examineTableTd2"><input type="text" id="profession3" readonly="readonly" /></td>
                </tr>
                <tr>
                    <td class="examineTableTd1">年级</td>
                    <td class="examineTableTd2"><input type="text" id="grade3" readonly="readonly" /></td>
                </tr>
                <tr>
                    <td class="examineTableTd1">班级</td>
                    <td class="examineTableTd2"><input type="text" id="stuClass3" readonly /></td>
                </tr>
                <tr>
                    <td class="examineTableTd1">年龄</td>
                    <td class="examineTableTd2"><input type="text" id="age3" readonly /></td>
                </tr>
            </table>
        </div>
        <div style="text-align: right; height: 35px; padding-top: 5px; padding-right: 20px">
            <button id="examineCancel" onclick="examineCancel()">取消</button>
        </div>
    </div>
    <div id="delBlock">
        <div id="delHeader">待删除的学生信息</div>
        <div id="delMain">
            <p>您确定删除以下同学的信息</p>
            <p id="delMessage"></p>
        </div>
        <div style="text-align: right; height: 35px; padding-top: 5px; padding-right: 20px">
            <button id="confirm" onclick="confirm()">确认</button>
            <button id="delCancel" onclick="delCancel()">取消</button>
        </div>
    </div>
    <script src="student.js"></script>
</body>
</html>

(2)在“students”文件夹内的student.js文件中添加以下代码:

student.js:

// 定义对象数组,例如students[0]就是第一个对象
let students = [
    { id: "2025105801", name: "张三", academy: "经济学院", major: "经济学", grade: "2025", class: "5", age: "22" },
    { id: "2025105802", name: "李四", academy: "舞蹈学院", major: "舞蹈学", grade: "2024", class: "3", age: "20" },
    { id: "2025105803", name: "王五", academy: "工程学院", major: "软件工程", grade: "2025", class: "1", age: "20" },
    { id: "2025105804", name: "赵六", academy: "设计学院", major: "人工智能", grade: "2023", class: "4", age: "19" },
    { id: "2025105805", name: "孙七", academy: "艺术学院", major: "艺术学", grade: "2025", class: "2", age: "21" }
]

// 初始界面数据,向页面中输入tudents对象数组中每一个对象
function show() {
    for (let i = 0; i < students.length; i++) {
        let tab = document.getElementById("myTable")
        tab.innerHTML +=
            ('<tr><td class="col1">' + '<input type="checkbox" name="item">' + '</td>'
                + '<td class="col2">' + (i + 1) + '</td>'
                + '<td class="col3">' + students[i].id + '</td>'
                + '<td class="col4">' + students[i].name + '</td>'
                + '<td class="col5">' + students[i].academy + '</td>'
                + '<td class="col6">' + students[i].major + '</td>'
                + '<td class="col7">' + students[i].grade + '</td>'
                + '<td class="col8">' + students[i].class + '</td>'
                + '<td class="col9">' + students[i].age + '</td>'
                + '<td class="col10"><input id="examine" type="button" value="查看" onclick="examine(this)"><input id="update" type="button" value="修改" onclick="update(this)"></td></tr>')
    }
    let tables = document.getElementById("myTable");
    let tr = tables.rows;
    // 隔行换色
    for (let i = 0; i < tr.length; i++) {
        let row = tr[i];
        if (i % 2 == 0) {
            row.className = 'mainTbodyTr1';
        }
        else {
            row.className = 'mainTbodyTr2';
        }
    }
    // 统计学生信息数量
    let nums = tr.length;
    document.getElementById('nums').innerText = nums - 1;
};

show();

// 新增按钮
function add() {
    // 打开“新增”窗口
    document.getElementById('addBlock').style.display = 'block';
    document.getElementById('totalBackground').style.display = 'block';
}

// 提交按钮
function sumbit() {
    // 关闭“新增”窗口
    document.getElementById('addBlock').style.display = 'none';
    document.getElementById('totalBackground').style.display = 'none';

    // 写入表单
    // 获取表
    let iTable = document.getElementById('myTable');
    // 获取输入值
    let stuId = document.getElementById('stuId1').value;
    let name = document.getElementById('name1').value;
    let colg = document.getElementById('colg1').value;
    let profession = document.getElementById('profession1').value;
    let grade = document.getElementById('grade1').value;
    let stuClass = document.getElementById('stuClass1').value;
    let age = document.getElementById('age1').value;
    let nums = iTable.rows.length;

    // 判断输入的各数据是否为空
    if(stuId.trim() === ''){
        alert('学号不能为空');
        return false;
    }
    if(name.trim() === ''){
        alert('姓名不能为空');
        return false;
    }
    if(colg.trim() === ''){
        alert('学院不能为空');
        return false;
    }
    if(profession.trim() === ''){
        alert('专业不能为空');
        return false;
    }
    if(grade.trim() === ''){
        alert('年级不能为空');
        return false;
    }
    if(stuClass.trim() === ''){
        alert('班级不能为空');
        return false;
    }
    if(age.trim() === ''){
        alert('年龄不能为空');
        return false;
    }

    // 创建一行tr
    let iTr = document.createElement('tr');

    // 隔行换色
    if (nums % 2 != 0)
    {
        iTr.className = 'mainTbodyTr1';
    }
    else {
        iTr.className = 'mainTbodyTr2';
    }

    // 将tr添加到table中
    iTable.appendChild(iTr);

    // 创建选择按钮
    let sel = document.createElement('input');
    sel.setAttribute('type','checkbox');
    sel.setAttribute('name','item');

    // 创建单元格td,并添加属性、内容
    let iTd1 = document.createElement('td');
    iTd1.className = "col1";
    iTd1.appendChild(sel);
    let iTd2 = document.createElement('td');
    iTd2.className = "col2";
    iTd2.appendChild(document.createTextNode(nums));
    let iTd3 = document.createElement('td');
    iTd3.className = "col3";
    iTd3.appendChild(document.createTextNode(stuId));
    let iTd4 = document.createElement('td');
    iTd4.className = "col4";
    iTd4.appendChild(document.createTextNode(name));
    let iTd5 = document.createElement('td');
    iTd5.className = "col5";
    iTd5.appendChild(document.createTextNode(colg));
    let iTd6 = document.createElement('td');
    iTd6.className = "col6";
    iTd6.appendChild(document.createTextNode(profession));
    let iTd7 = document.createElement('td');
    iTd7.className = "col7";
    iTd7.appendChild(document.createTextNode(grade));
    let iTd8 = document.createElement('td');
    iTd8.className = "col8";
    iTd8.appendChild(document.createTextNode(stuClass));
    let iTd9 = document.createElement('td');
    iTd9.className = "col9";
    iTd9.appendChild(document.createTextNode(age));
    let iTd10 = document.createElement('td');
    iTd10.className = "col10";
    let examine = document.createElement('input');
    examine.id = 'examine';
    examine.setAttribute('type','button');
    examine.setAttribute('value','查看');
    examine.setAttribute('onclick','examine(this)');
    let update = document.createElement('input');
    update.id = 'update';
    update.setAttribute('type','button');
    update.setAttribute('value','修改');
    update.setAttribute('onclick','update(this)');
    iTd10.appendChild(examine);
    iTd10.appendChild(update);

    // 将单元格添加到行
    iTr.appendChild(iTd1);
    iTr.appendChild(iTd2);
    iTr.appendChild(iTd3);
    iTr.appendChild(iTd4);
    iTr.appendChild(iTd5);
    iTr.appendChild(iTd6);
    iTr.appendChild(iTd7);
    iTr.appendChild(iTd8);
    iTr.appendChild(iTd9);
    iTr.appendChild(iTd10);

    // 将新增窗口中的输入框值初始化
    document.getElementById('stuId1').value = null;
    document.getElementById('name1').value = null;
    document.getElementById('colg1').value = null;
    document.getElementById('profession1').value = null;
    document.getElementById('grade1').value = null;
    document.getElementById('stuClass1').value = null;
    document.getElementById('age1').value = null;

    // 统计学生信息数量
    document.getElementById('nums').innerText = nums;

    let pageNum = document.getElementById('pageNum').innerText;
    pageNum = parseInt(pageNum);
    for (let i=10*pageNum+1; i<=nums; i++) {
        iTable.rows[i].style.display = 'none';
    }
    // 关闭“新增”窗口
    document.getElementById('addBlock').style.display = 'none';
}

// “新增”中的取消按钮
function addCancel() {
    // 关闭“新增”窗口
    document.getElementById('addBlock').style.display = 'none';
    document.getElementById('totalBackground').style.display = 'none';
}

// 全选设置
function checkAll(obj){
    let status = obj.checked;
    let items = document.getElementsByName('item');
    let pageNum = document.getElementById('pageNum').innerText;
    pageNum = parseInt(pageNum);
    for (let i=(pageNum-1)*10; i<pageNum*10; i++) {
        items[i].checked=status;
    }
}

// “删除”按钮
function del() {
    // 打开“删除”窗口
    document.getElementById('delBlock').style.display = 'block';
    document.getElementById('totalBackground').style.display = 'block';

    // 获取复选框信息
    let items = document.getElementsByName('item');
    let message = [];
    let checkedCount = document.querySelectorAll('input[name="item"]:checked').length;

    // 如果复选框都没有被选中,则输出提示信息
    if(checkedCount == 0){
            window.alert('请选择要删除的学生信息');
            document.getElementById('delBlock').style.display = 'none';
            document.getElementById('totalBackground').style.display = 'none';
    }

    // 遍历被选中的复选框
    for(let j=0;j<items.length;j++){
        if(items[j].checked) //如果item被选中
        {
            let m = items[j].parentNode.parentNode.cells[3].innerText;
            message.push(m);
        }
    }

    // 提示是否删除学生信息
    let delNode = document.getElementById('delMessage');
    delNode.innerText = message.join(',');
}

// “删除”窗口中的“确认”按钮
function confirm() {
    // 关闭“删除”窗口
    document.getElementById('delBlock').style.display = 'none';
    document.getElementById('totalBackground').style.display = 'none';

    // 获取被选中的学生信息并删除
    let items = document.getElementsByName('item');
    let items_num = 0;
    for(let j=0;j<items.length;j++){
        if(items[j].checked)//如果item被选中
        {
            items_num += 1;
            items[j].parentNode.parentNode.remove();
            j--;
        }
    }

    // 隔行换色
    let iTable = document.getElementById('myTable');
    let iTrs = iTable.getElementsByTagName('tr');
    for (let i=1; i<iTrs.length; i++) {
        if (i % 2 != 0)
            iTrs[i].className = 'mainTbodyTr1';
        else
            iTrs[i].className = 'mainTbodyTr2';
        let sort = iTrs[i].getElementsByTagName('td')[1];
        sort.innerText = i;
    }

    let nums = iTrs.length - 1;
    document.getElementById('nums').innerText = nums;
    nums = parseInt(nums);
    let pageSum = Math.ceil(nums / 10);
    let pageNum = document.getElementById('pageNum').innerText;
    pageNum = parseInt(pageNum);

    if (pageNum <= pageSum) {
        for (let i=(pageNum-1)*10+1; i<pageNum*10+1; i++) {
            iTable.rows[i].style.display = 'table-row';
        }
        for (let i=1; i<(pageNum-1)*10+1; i++) {
            iTable.rows[i].style.display = 'none';
        }
        for (let i=pageNum*10+1; i<nums+1; i++) {
            iTable.rows[i].style.display = 'none';
        }
    }
    if (pageNum > pageSum) {
        for (let i=(pageNum-2)*10+1; i<nums+1; i++) {
            iTable.rows[i].style.display = 'table-row';
        }
        for (let i=1; i<(pageNum-2)*10+1; i++) {
            iTable.rows[i].style.display = 'none';
        }
        document.getElementById('pageNum').innerText = pageNum - 1;
    }
}

// “删除”窗口中的“取消”按钮
function delCancel() {
    // 关闭“删除”窗口
    document.getElementById('delBlock').style.display = 'none';
    document.getElementById('totalBackground').style.display = 'none';
}

// “查看”按钮
function examine(obj) {
    // 打开“查看”窗口
    document.getElementById('examineBlock').style.display = 'block';
    document.getElementById('totalBackground').style.display = 'block';

    // 获取当前行
    let iTr = obj.parentNode.parentNode;

    // 获取当前行中的所有单元格
    let iTds = iTr.getElementsByTagName('td');

    // 将“新增”窗口中的输入框中内容设为当前行对应的内容
    document.getElementById('stuId3').value = iTds[2].innerText;
    document.getElementById('name3').value = iTds[3].innerText;
    document.getElementById('colg3').value = iTds[4].innerText;
    document.getElementById('profession3').value = iTds[5].innerText;
    document.getElementById('grade3').value = iTds[6].innerText;
    document.getElementById('stuClass3').value = iTds[7].innerText;
    document.getElementById('age3').value = iTds[8].innerText;
}

// “查看”中的取消按钮
function examineCancel() {
    // 关闭“修改”窗口
    document.getElementById('examineBlock').style.display = 'none';
    document.getElementById('totalBackground').style.display = 'none';
}

// “上一页”按钮
function previous() {
    let iTable = document.getElementById('myTable');
    let pageNum = document.getElementById('pageNum').innerText;
    pageNum = parseInt(pageNum);
    if (pageNum == 1) {
        window.alert('当前为第一页,无法先前翻页')
    }
    if (pageNum > 1)
    {
        document.getElementById('pageNum').innerText = pageNum - 1;
        for (let i=(pageNum-2)*10+1; i<(pageNum-1)*10+1; i++) {
            iTable.rows[i].style.display = 'table-row';
        }
        for (let i=(pageNum-1)*10+1; i<pageNum*10+1; i++) {
            iTable.rows[i].style.display = 'none';
        }
    }
}

// “下一页”按钮
function next() {
    let iTable = document.getElementById('myTable');
    let pageSum = Math.ceil((iTable.rows.length-1) / 10);
    let pageNum = document.getElementById('pageNum').innerText;
    pageNum = parseInt(pageNum);
    if (pageNum < pageSum) {
        document.getElementById('pageNum').innerText = pageNum + 1;
        for (let i=(pageNum-1)*10+1; i<pageNum*10+1; i++) {
            iTable.rows[i].style.display = 'none';
        }
        for (let i=pageNum*10+1; i<(pageNum+1)*10+1; i++) {
            iTable.rows[i].style.display = 'table-row';
        }
    }
    else {
        window.alert('当前为最后一页,无法向后翻页')
    }
}

// “修改”按钮
function update(obj) {
    // 打开“修改”窗口
    document.getElementById('updateBlock').style.display = 'block';
    document.getElementById('totalBackground').style.display = 'block';

    // 获取当前行
    let iTr = obj.parentNode.parentNode;

    // 获取当前行中的所有单元格
    iTds = iTr.getElementsByTagName('td');

    // 将“新增”窗口中的输入框中内容设为当前行对应的内容
    document.getElementById('stuId2').value = iTds[2].innerText;
    document.getElementById('name2').value = iTds[3].innerText;
    document.getElementById('colg2').value = iTds[4].innerText;
    document.getElementById('profession2').value = iTds[5].innerText;
    document.getElementById('grade2').value = iTds[6].innerText;
    document.getElementById('stuClass2').value = iTds[7].innerText;
    document.getElementById('age2').value = iTds[8].innerText;
}

// “保存”按钮
function preservation() {
    // 将新内容写入
    stuId2 = document.getElementById('stuId2').value;
    name2 = document.getElementById('name2').value;
    colg2 = document.getElementById('colg2').value;
    profession2 = document.getElementById('profession2').value;
    grade2 = document.getElementById('grade2').value;
    stuClass2 = document.getElementById('stuClass2').value;
    age2 = document.getElementById('age2').value;

    // 判断输入的各数据是否为空
    if(stuId2.trim() === ''){
        alert('学号不能为空');
        return false;
    }
    if(name2.trim() === ''){
        alert('姓名不能为空');
        return false;
    }
    if(colg2.trim() === ''){
        alert('学院不能为空');
        return false;
    }
    if(profession2.trim() === ''){
        alert('专业不能为空');
        return false;
    }
    if(grade2.trim() === ''){
        alert('年级不能为空');
        return false;
    }
    if(stuClass2.trim() === ''){
        alert('班级不能为空');
        return false;
    }
    if(age2.trim() === ''){
        alert('年龄不能为空');
        return false;
    }

    // 将新内容写入
    iTds[2].innerText = stuId2;
    iTds[3].innerText = name2;
    iTds[4].innerText = colg2;
    iTds[5].innerText = profession2;
    iTds[6].innerText = grade2;
    iTds[7].innerText = stuClass2;
    iTds[8].innerText = age2;

    // 关闭“修改”窗口
    document.getElementById('updateBlock').style.display = 'none';
    document.getElementById('totalBackground').style.display = 'none';
}

// “修改”中的“取消”按钮
function updateCancel() {
    // 关闭“修改”窗口
    document.getElementById('updateBlock').style.display = 'none';
    document.getElementById('totalBackground').style.display = 'none';
}

(3)在“students”文件夹内的student.css文件中添加以下代码:

student.css:

body {
    background-color: #f0ece9;
}

/*总*/
#total
{
    width: 1200px;
    margin: 0 auto;
    padding-left: 20px;
    padding-right: 20px;
}

/*第一行(学生管理系统那一行)*/
header {
    display: flex;
    flex-flow: row nowrap;
    justify-content: space-between;
  }
header h1 {
    color: #9a9897;
    margin: 0;
    padding: 0;
  }
header hr {
    margin: 20px 20px 0;
    background-color: #bc9470;
    border: 2px solid #bc9470;
    width: 30%;
    height: 0;
  }

/*第二行(按钮那一行)*/
#second
{
    text-align: left;
    margin-left: 70px
}

/*第三行(主体)*/
#main
{
    border: 1px solid #a6a9ab;
}
/*表头*/
#main thead
{
    text-align: center;
}
#main thead tr
{
    background-color: #dadee1;
    height: 40px;
}
/*表主体*/
.mainTbodyTr1
{
    height: 30px;
    background-color: white;
    text-align: center;
}
.mainTbodyTr2
{
    height: 30px;
    background-color: #eef1f8;
    text-align: center;
}
/*第一列*/
.col1
{
    width: 50px;
}
/*第二列*/
.col2
{
    width: 60px;
}
/*第三列*/
.col3
{
    width: 180px;
}
/*第四列*/
.col4
{
    width: 180px;
}
/*第五列*/
.col5
{
    width: 180px;
}
/*第六列*/
.col6
{
    width: 180px;
}
/*第七列*/
.col7
{
    width: 80px;
}
/*第八列*/
.col8
{
    width: 80px;
}
/*第九列*/
.col9
{
    width: 80px;
}
/*第十列*/
.col10
{
    width: 130px;
}
#final
{
    margin-top: 15px;
    height: 40px;
}
#final p
{
    display: inline;
}

#totalBackground{
    width: 100%;
    height: 100%;
    /*border: 1px solid #dadee1;*/
    display: none;
    position: absolute;
    top: 0;
    left: 0;
    background-color: #c4c2c1;
    z-index:1;
    /*-moz-opacity: 0.8;*/
    opacity:.8;
    /*filter: alpha(opacity=88);*/
}

/*新增框架*/
#addBlock
{
    width: 420px;
    height: 400px;
    display: none;
    position: absolute;
    top: 15%;
    left: 35%;
    background-color: white;
    border-radius: 5px;
    z-index:2;
    /*overflow: auto;*/
}
/*新增框架头*/
#addHeader
{
    background-color: black;
    color: white;
    font-family: 黑体;
    font-weight: bold;
    height: 30px;
    padding-left: 10px;
    padding-top: 10px;
    /*display: table-row;*/
}
/*新增框架主体*/
#addMain
{
    height: 290px;
    padding-top: 10px;
    padding-bottom: 10px;
    border-bottom: 1px solid #dadee1;
}
#addMain table
{
    width: 400px;
}
#addMain tr
{
    height: 40px;
}
.addTableTd1
{
    padding-left: 15px;
    width: 120px;
    text-align: right;
}
.addTableTd2
{
    padding-left: 20px;
    width: 250px;
    text-align: left;
}
.addTableTd2 input
{
    width: 150px;
}

#add     /*新增*/
{
    height: 30px;
    width: 75px;
    background-color: #5cb85c;
    color: white;
    border: 1px solid black;
    margin:20px 5px;
}
#del     /*删除*/
{
    height: 30px;
    width: 75px;
    background-color: #d9534f;
    color: white;
    border: 1px solid black;
    margin-left: 5px;
}
#previous     /*上一页*/
{
    height: 30px;
    width: 75px;
    background-color: #5cb85c;
    color: white;
    border: 1px solid black;
    float: right;
}
#next     /*下一页*/
{
    height: 30px;
    width: 75px;
    background-color: #d9534f;
    color: white;
    border: 1px solid black;
    margin-left: 10px;
    float: right;
}
#examine     /*查看*/
{
    font-size: 16px;
    height: 20px;
    border: none;
    color: red;
    background: none;
    /*background-color: #eef1f8;*/
}
#update     /*修改*/
{
    font-size: 16px;
    height: 20px;
    border: none;
    color: red;
    background: none;
    /*background-color: #eef1f8;*/
}
#submit     /*提交*/
{
    height: 30px;
    width: 75px;
    background-color: #5cb85c;
    color: black;
    border: 1px solid #dadee1;
}
#addCancel     /*新增中的取消*/
{
    height: 30px;
    width: 75px;
    background-color: white;
    color: black;
    border: 1px solid #dadee1;
    margin-left: 5px;
}
#preservation     /*保存*/
{
    height: 30px;
    width: 75px;
    background-color: #5cb85c;
    color: black;
    border: 1px solid #dadee1;
}
#updateCancel     /*修改中的取消*/
{
    height: 30px;
    width: 75px;
    background-color: white;
    color: black;
    border: 1px solid #dadee1;
    margin-left: 5px;
}
#examineCancel     /*修改中的取消*/
{
    height: 30px;
    width: 75px;
    background-color: white;
    color: black;
    border: 1px solid #dadee1;
    /*margin-left: 5px;*/
}
#confirm     /*确认*/
{
    height: 30px;
    width: 75px;
    background-color: #5cb85c;
    color: black;
    border: 1px solid #dadee1;
}
#delCancel     /*删除中的取消*/
{
    height: 30px;
    width: 75px;
    background-color: white;
    color: black;
    border: 1px solid #dadee1;
    margin-left: 5px;
}
/*删除框架*/
#delBlock
{
    width: 420px;
    height: 400px;
    display: none;
    position: absolute;
    top: 15%;
    left: 35%;
    background-color: white;
    border-radius: 5px;
    z-index:2;
    /*overflow: auto;*/
}
/*新增框架头*/
#delHeader
{
    background-color: black;
    color: white;
    font-family: 黑体;
    font-weight: bold;
    height: 30px;
    padding-left: 10px;
    padding-top: 10px;
}
/*新增框架主体*/
#delMain
{
    height: 280px;
    padding-left: 20px;
    padding-top: 10px;
    padding-bottom: 10px;
    border-bottom: 1px solid #dadee1;
}
#delMain p
{
    font-size: 20px;
}
#delMessage
{
    font-size: 20px;
}
/*查看框架*/
#examineBlock
{
    width: 420px;
    height: 400px;
    display: none;
    position: absolute;
    top: 15%;
    left: 35%;
    background-color: white;
    border-radius: 5px;
    z-index:2;
    /*overflow: auto;*/
}

/*新增框架头*/
#examineHeader
{
    background-color: black;
    color: white;
    font-family: 黑体;
    font-weight: bold;
    height: 30px;
    padding-left: 10px;
    padding-top: 10px;
}
/*新增框架主体*/
#examineMain
{
    height: 290px;
    padding-top: 10px;
    padding-bottom: 10px;
    border-bottom: 1px solid #dadee1;
}
#examineMain table
{
    width: 400px;
}
#examineMain tr
{
    height: 40px;
}
.examineTableTd1
{
    padding-left: 15px;
    width: 120px;
    text-align: right;
}
.examineTableTd2
{
    padding-left: 20px;
    width: 250px;
    text-align: left;
}
.examineTableTd2 input
{
    color: #545454;
    width: 150px;
    background-color: #ebebe4;
    border: 1px solid #a9a9a9;
}

/*修改框架*/
#updateBlock
{
    width: 420px;
    height: 400px;
    display: none;
    position: absolute;
    top: 15%;
    left: 35%;
    background-color: white;
    border-radius: 5px;
    z-index:2;
    /*overflow: auto;*/
}

/*新增框架头*/
#updateHeader
{
    background-color: black;
    color: white;
    font-family: 黑体;
    font-weight: bold;
    height: 30px;
    padding-left: 10px;
    padding-top: 10px;
}
/*新增框架主体*/
#updateMain
{
    height: 290px;
    padding-top: 10px;
    padding-bottom: 10px;
    border-bottom: 1px solid #dadee1;
}
#updateMain table
{
    width: 400px;
}
#updateMain tr
{
    height: 40px;
}
.updateTableTd1
{
    padding-left: 15px;
    width: 120px;
    text-align: right;
}
.updateTableTd2
{
    padding-left: 20px;
    width: 250px;
    text-align: left;
}
.updateTableTd2 input
{
    width: 150px;
}

最后,我们通过浏览器运行以上文件。鼠标右键点击index.html文件后,选择打开方式为“Microsoft Edge”或者其它任意浏览器,就可以打开学生信息管理系统。

3、学生信息管理系统解析

实例中的“学生信息管理系统”主要通过外部单独新建一个student.js文件,再通过<script>标签把JavaScript代码引入到index.html文件中。

(1)getElementById()用法

在学生信息管理系统的student.js文件中,JavaScript主要通过document.getElementById()方法获取index.html文件中指定ID的标签。‌document.getElementById()方法主要用于通过标签的ID获取该标签的引用,然后可以对标签进行各种操作‌。HTML文档中每个标签的ID必须是唯一的,如果一个HTML文档中有两个及以上的标签具有相同的ID,那么document.getElementById()方法只会返回查找到的第一个标签。例如:

动手练一练:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>getElementById()代码示例</title>
        <script>
            function changeColor(newColor) {
                const part = document.getElementById("test");
                // 修改标签的样式
                part.style.color = newColor;
            }
            function changeText(newtext) {
                const part = document.getElementById("test");
                // 修改标签的内容
                part.innerHTML = newtext;
            }
        </script>
    </head>
    <body>
        <p id="test">这里有一些文本</p>
        <!--下面标签中包含相同的ID,不会被引用操作-->
        <p id="test">这里另一个文本内容</p>
        <button onclick="changeColor('green');">绿色</button>
        <button onclick="changeColor('red');">红色</button>
        <button onclick="changeText('这是新的文本');">修改文本内容</button>
    </body>
</html>

上面的例子中,通过JavaScript中的onclick事件,处理用户点击button标签的行为。当用户在指定的button标签上点击时,onclick事件会被触发,并调用changeColor()函数或者changeText()函数。changeColor()函数通过getElementById().style.color方法编辑HTML标签的文本的颜色,changeText()函数通过getElementById().innerHTML方法编辑HTML标签的内容。

getElementById().innerHTML方法可以获取或设置指定标签内的HTML内容,包括从标签标记开始到标签标记结束的所有内容,包括HTML标记。在JavaScript中,getElementById().innerText方法同样可以获取或设置指定标签内的HTML内容,但是只能获取或设置文本的值,不包括HTML标记。例如:

动手练一练:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>innerHTML和innerText对比示例</title>
    </head>
    <body>
        <div id="test">
          hello <strong>world</strong>
        </div>
        <script>
          // 输出 hello <strong>world</strong>
          console.log(document.getElementById('test').innerHTML)
        </script>
        <script>
          // 输出 hello world
          console.log(document.getElementById('test').innerText)
        </script>
    </body>
</html>

通过浏览器执行以上代码,我们按F12键打开浏览器的控制台,可以看到输出结果为:

hello <strong>world</strong>
hello world

上面的例子中,当我们尝试用innerHTML获取内容时,内容包含strong标签,所以输出的内容会显示strong标签。当我们用innerText获取内容时,只能获取文本的值为“hello world”,不包括strong标签。

(2)appendChild()用法

在学生信息管理系统的student.js文件中,JavaScript主要通过appendChild()方法模拟数据库操作,动态地向表格中添加新的数据行。appendChild()方法是JavaScript中一种常用的操作,可以用于动态地向网页中添加标签元素,实现动态内容的更新和交互效果,比如,我们需要从服务器获取数据并显示在表格中。

appendChild()方法可以向指定的父节点中(父标签元素)添加一个子节点(子标签元素)。其基本语法如下:

parentNode.appendChild(childNode);

其中,parentNode是要添加子节点的父节点,childNode是要添加的子节点。

在下面示例中,我们新建两个不同颜色的盒子和一个按钮,使用CSS的style属性设计两个盒子的边框颜色分别为红色和蓝色,然后为按钮绑定事件处理函数,当点击按钮时执行appendChild()方法操作。

动手练一练:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>appendChild()方法示例</title>
    </head>
    <body>
        <div id="red" style="border: 1px solid #ff0000; padding: 20px; margin: 20px;">红盒子</div>
        <div id="blue" style="border: 1px solid #1c77ff; padding: 20px; margin: 20px;">蓝盒子</div>
        <button id="move">移动</button>
        <script>
            // 获取按钮标签的引用
            let moving = document.getElementById("move");
            // 为按钮绑定一个鼠标单击事件的处理函数
            moving.onclick = function () {
                // 获取红色盒子的引用
                let reds = document.getElementById("red");
                // 获取蓝色盒子的引用
                let blues= document.getElementById("blue");
                //最后移动红色盒子到蓝色盒子中
                blues.appendChild(reds);
            }
        </script>
    </body>
</html>

上面的例子中,通过appendChild()方法把红盒子移动到蓝色盒子中间。在移动指定节点时,会同时移动指定节点包含的所有子节点,效果如图所示:

在用户交互场景中,当用户执行某些操作(如添加记录)时,appendChild()方法可以及时更新表格内容。以下是一个简单的示例,展示如何通过appendChild()方法向表格添加新行:

动手练一练:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>appendChild()方法向表格添加新行</title>
    <style>
        /* 为表格添加样式 */
        table, th, td {
          border-width: 1px;
          border-style: solid;
          border-color: #000000;
          margin: 20px;
        }
    </style>
</head>
<body>
    <table id="myTable">
        <tr>
            <th>姓名</th>
            <th>年龄</th>
        </tr>
        <tr>
            <td>张三</td>
            <td>20</td>
        </tr>
    </table>
    <button onclick="addRow()">添加新行</button>
    <script>
        function addRow() {
            // 获取表格元素
            let table = document.getElementById("myTable");

            // 创建新行
            let newRow = document.createElement("tr");

            // 创建新单元格
            let cell1 = document.createElement("td");
            let cell2 = document.createElement("td");

            // 设置单元格内容
            cell1.innerHTML = "李四";
            cell2.innerHTML = "25";

            // 将单元格添加到新行
            newRow.appendChild(cell1);
            newRow.appendChild(cell2);

            // 将新行添加到表格
            table.appendChild(newRow);
        }
    </script>
</body>
</html>

效果如下图所示:

上面的例子中,一旦点击“添加新行”按钮,新行就会被添加到表格中,浏览器也会自动刷新表格的显示,以包含新插入的行。

appendChild()方法是JavaScript中用于将标签元素添加到父节点的子节点列表的末尾的重要方法。通过理解其工作原理,我们可以更有效地使用它来动态创建和修改表格。