功能点:
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>