运行效果
?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';
})
}
}
|