js实现表格数据渲染,表格数据新增,修改,删除。

功能点:

1.点击【查询】根据给定条件进行查询。

2.新增数据(有未填项时提示)

3.根据js中初始设置的数据来渲染表格

4.点击【修改】表格中文本变成对应输入框。

【确认】:表格中输入框变为纯文本数据。(注:这里修改了原始数据)

【取消】:还原。

5.上下翻页:(默认设置一页展示5条),根据数据动态设置翻页功能

---------------------------------------------------------------------------------------------------------------------------------代码:

<!DOCTYPE html>
<html lang="zh">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>捐赠管理</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      background-color: #f4f4f4;
      margin: 0;
      padding: 0;
    }

    .header {
      background-color: #007bff;
      color: white;
      padding: 10px;
      text-align: center;
      font-size: 20px;
    }

    .container {
      width: 95%;
      max-width: 1000px;
      margin: 20px auto;
      padding: 20px;
      background-color: white;
      box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
    }

    .search-area {
      /* text-align: center; */
      margin-bottom: 20px;
    }

    .search-area button {
      padding: 8px 15px;
      background-color: #007bff;
      color: white;
      border: none;
      border-radius: 5px;
      cursor: pointer;
      margin-left: 10px;
    }

    .donation-list {
      width: 100%;
      border-collapse: collapse;
      margin-bottom: 20px;
    }

    .donation-list th,
    .donation-list td {
      text-align: left;
      padding: 10px;
      border: 1px solid #ddd;
    }


    .donation-list th {
      background-color: #e9e9e9;
    }
    
    .donation-list td {
      width: 80px;
    }

    button {
      padding: 5px 10px;
      margin: 0 5px;
      background-color: #007bff;
      color: white;
      border: none;
      border-radius: 5px;
      cursor: pointer;
    }

    button.disabled {
      background-color: #ccc;
      cursor: not-allowed;
    }

    .operation-buttons {
      text-align: center;
    }

    .operation-buttons button {
      padding: 5px 10px;
      margin-right: 5px;
      background-color: #007bff;
      color: white;
      border: none;
      border-radius: 5px;
    }
    form{
      margin-bottom: 10px;
    }
    input:invalid {
      border: 2px solid red;
    }
    input:valid {
      border: 2px solid green;
    }
    table input{
      width: 100%;
    }
  </style>
</head>

<body>

  <div class="header">
    捐赠管理
  </div>

  <div class="container">
    <div class="search-area">
      <label for="selectUnit">受捐单位</label>
      
      <select class="selectUnit" id="selectCondition">
      </select>
      <button type="button" id="selectBtn">查询</button>
      <button class="disabled" id="previous">上一页</button>
      <button id="nextPage">下一页</button>
    </div>
    <form>
      <label for="donor">捐赠人:</label>
      <input type="text" id="donor" placeholder="请输入捐赠人姓名" required>
      <label for="donationUnit">受捐单位:</label>
      <select class="selectUnit" id="donationUnit" required>
      </select>
      <label for="amount">金额:</label>
      <input type="number" id="amount" placeholder="请输入捐赠金额" required>
      <label for="donationDate">受捐日期:</label>
      <input type="date" id="donationDate" required>
      <button type="submit">提交</button>
    </form>
    <table class="donation-list">
      <tr>
        <th>序号</th>
        <th>捐赠人</th>
        <th>受捐单位</th>
        <th>金额</th>
        <th>受捐日期</th>
        <th>操作</th>
      </tr>
    </table>
  </div>

  <script>
    
    // 上下页思路
    // 根据条件得到符合条件的数据  这个时候也要修改maxPage的值
    // 根据page来通过符合条件的数据拿到上下页

    window.onload = function(){
      // 表格数据
      // 设置一页展示totalNum项
      const totalNum = 5;
      const unitOptions = ["中国扶贫基金会","中国慈善总会","壹基金"];
      // 得到所有下拉框
      let selectUnits = document.querySelectorAll(".selectUnit");
      // 查询按钮
      let selectBtn = document.querySelector("#selectBtn");
      // 新增表单
      let form = document.querySelector("form");
      // 上一页
      let previous = document.querySelector("#previous");
      // 下一页
      let nextPage = document.querySelector("#nextPage");
      // 现在的页数
      let page = 1;
      let allData = [
        {
          num:1,name:"子鼠",unit:"壹基金", amount:2000,date:"2013-05-05",isedit:false
        },{
          num: 2, name: "丑牛", unit: "中国扶贫基金会", amount: 3000, date: "2013-05-05", isedit: false
        }, {
          num: 3, name: "巳蛇", unit: "中国慈善总会", amount: 4000, date: "2013-06-07", isedit: false
        }, {
          num: 4, name: "寅虎", unit: "壹基金", amount: 1000, date: "2013-09-08", isedit: false
        }, {
          num: 5, name: "卯兔", unit: "壹基金", amount: 500, date: "2013-01-02", isedit: false
        }, {
          num: 6, name: "午马", unit: "中国慈善总会", amount: 1500, date: "2013-01-02", isedit: false
        }
      ];
      let maxPage = page;
      let table = document.querySelector("table");
      // 查询条件框
      let selectCondition = document.querySelector("#selectCondition");

      init();
      // 初始化操作
      function init(){
        // 初始化select数据
        for (let i = 0; i < selectUnits.length; i++) {
          selectUnits[i].innerHTML = `<option>请选择-</option>${getUnitOptions(unitOptions)}`;
        }
        // 初始化数据
        // 默认page是1
        page = 1;
        // 默认是无条件得到最大的页数,比如共21条数据,一页展示5条,最大的页数就是5
        maxPage = Math.ceil(allData.length / totalNum);
        showData(getData(selectCondition.value, page - 1));
        // 初始化按钮效果
        changePageBtn();
        
      }
      // 绑定上下页事件
      previous.addEventListener("click",function(){
        if(page > 1){
          // 允许点击
          page -= 1;
          // 重新渲染表格
          let data = getData(selectCondition.value,  page - 1);
          showData(data);
          // 修改page状态
          changePageBtn();
        }
        
      })
      nextPage.addEventListener("click", function () {
        if (page <= maxPage) {
          page += 1;
          let data = getData(selectCondition.value, page - 1);
          showData(data);
          // 修改page状态
          changePageBtn();
        }
        
      })
      // 修改上下页按钮状态
      function changePageBtn(){
        if (page === 1){
          // 现在是第一页
          previous.className = "disabled";
          if (page === maxPage){
            nextPage.className = "disabled";
          }else{
            nextPage.className = "";
          }
          
        }else if(page === maxPage){
          // 最大页
          nextPage.className = "disabled";
          previous.className = "";
        }else{
          previous.className = "";
          nextPage.className = "";
        }
      }
      

      // 新增数据 按钮绑定事件
      form[4].addEventListener("click", function (e) {
        // 阻止默认提交行为
        e.preventDefault();
        if (form[0].value && form[1].value && form[2].value && form[3].value) {
          // 非空
          allData.push({
            num: allData[allData.length - 1].num + 1, name: form[0].value, unit: form[1].value, amount: form[2].value, date: form[3].value, isedit: false
          });
          let selectCondition = document.querySelector("#selectCondition");
          // 默认展示第一页
          page = 1;
          let data = getData(selectCondition.value, 0);
          showData(data);
          // 清空输入
          form.reset();
        } else {
          alert("有未填项");
        }
      })
      
      
      
      // 展示对应的数据 需要有数据
      function showData(data){
        // 初始化,设置为空
        table.innerHTML = "";
        for (let i = 0; i < data.length; i++) {
          let item = data[i];
          let tr = document.createElement("tr");
          tr.innerHTML = renderTd(item);
          table.append(tr);
          tr.addEventListener("click",function(e){
            let target = e.target;
            // 是修改
            if (target.tagName.toUpperCase() === "BUTTON" && target.className === "edit"){
              toggle(tr,0, item);
            }else if(target.tagName.toUpperCase() === "BUTTON" && target.className === "del"){
              // 是删除
              if(confirm("确认删除?")){
                tr.remove();
                // 删除也要把源数据对应的那一段删除
                allData.splice(getIndexFromAllData(item), 1);
              }else{
              }
            } else if (target.tagName.toUpperCase() === "BUTTON" && target.className === "confirm") {
              // 是确定
              toggle(tr, 1, item);
            } else if (target.tagName.toUpperCase() === "BUTTON" && target.className === "cancel") {
              // 是取消
              toggle(tr, 2, item);
            }
          })
        }
        // 绑定事件

        
      }
      
      // 根据条件得到数据
      function getData(value,page){
        let data = [];
        // 条件数据,默认是无条件的所有数据
        let conditionData = allData;
        if(value !== "请选择-"){
          // 现在是有条件的
          conditionData = [];
          for (let i = 0; i < allData.length; i++) {
            if (allData[i].unit === value) {
              // 满足条件
              conditionData.push(allData[i]);
            }
          }
          
        }
        for (let i = 0 + page * totalNum, count = 0; i < conditionData.length && count < totalNum; i++) {
          data.push(conditionData[i]);
          count++;
        }
        maxPage = Math.ceil(conditionData.length / totalNum);
        changePageBtn();
        return data;
      }

      // 查询监听事件
      selectBtn.addEventListener("click",function(e){
        // 根据要求展示数据
        
        // 默认展示第一页
        page = 1;
        let data = getData(selectCondition.value, 0);
        showData(data);
      })
      // 设置input框状态切换
      function toggle(tr,num,data){
        let editBtn = tr.querySelector(".edit");
        let delBtn = tr.querySelector(".del");
        let confirmBtn = tr.querySelector(".confirm");
        let cancelBtn = tr.querySelector(".cancel");
        // 当num是0,代表现在是 可写 状态
        let tdArr = tr.querySelectorAll("td");
        if (num === 0){
          // 切换按钮
          editBtn.style.display = "none";
          delBtn.style.display = "none";
          confirmBtn.style.display = "inline-block";
          cancelBtn.style.display = "inline-block";
          // 设置为input框
          for(let i = 1;i < tdArr.length - 1; i++){
            let item = tdArr[i];
            if (tdArr[i].className === "unit"){
              // 是单位,下拉框
              tdArr[i].innerHTML = `<select name="" id="">
                <option>请选择-</option>${getUnitOptions(unitOptions, tdArr[i].textContent) }</select>`;
            }else if (tdArr[i].className === "date"){
              // 是日期
              tdArr[i].innerHTML = `<input type="date" value="${tdArr[i].textContent}">`;
            }else{
              tdArr[i].innerHTML = `<input type="text" value="${tdArr[i].textContent}">`;
            }

          }
        }else if(num === 1) {
          // 当num === 1,代表现在是 只读 状态
          editBtn.style.display = "inline-block";
          delBtn.style.display = "inline-block";
          confirmBtn.style.display = "none";
          cancelBtn.style.display = "none";
          // 得到源数据
          let index = getIndexFromAllData(data);
          // 设置为纯文本
          for (let i = 1; i < tdArr.length - 1; i++) {
            let item = tdArr[i].children[0];
            tdArr[i].innerHTML = item.value;
            // 没写完  把对应的原始数据里面的数据修改一下  AllData
            allData[index][tdArr[i].className] = item.value;
          }
        }else if (num === 2){
          editBtn.style.display = "inline-block";
          delBtn.style.display = "inline-block";
          confirmBtn.style.display = "none";
          cancelBtn.style.display = "none";
          // 设置为最开始的数据
          tr.innerHTML = renderTd(data);
          
        }else{

        }
        
      }
    
      // 得到目前的单位下拉框
      function getUnitOptions(data,selectedStr){
        let str = "";
        for(let i = 0;i < data.length;i++){
          if (data[i] === selectedStr){
            str += `<option selected>${data[i]}</option>`;
          }else{
            str += `<option>${data[i]}</option>`;
          }
        }
        return str;
      }
    
      // 给定数据渲染td
      function renderTd(item){
        return `
            <td class="num">${item.num}</td>
            <td class="name">${item.name}</td>
            <td class="unit">${item.unit}</td>
            <td class="amount">${item.amount}</td>
            <td class="date">${item.date}</td>
            <td class="operation-buttons">
              <button class="edit">修改</button>
              <button class="del">删除</button>
              <button class="confirm" style="display:none">确认</button>
              <button class="cancel" style="display:none">取消</button>
            </td>`;
      }
      
      // 从源数据中找到想要的数据索引
      function getIndexFromAllData(data){
        let index = 0;
        for (; index < allData.length; index++) {
          if (allData[index].num === data.num) {
            // 找到源数据那一个对象
            break;
          }
        }
        return index;
      }
      
    
    }
    
  </script>
</body>

</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值