赞
踩
目录
思路:先把整体的html结构写出来,table表格分为3部分,其中tbody中的内容通过节点创建出来,删除时,找到其祖先元素的节点进行remove(),表单内的各个框的值对应表格的内容。
- <style>
- .wrapper {
- display: flex;
- margin-left: 100px;
- margin-top: 100px;
- }
-
- .box {
- width: 300px;
- height: 400px;
- /* border: 2px solid red; */
- margin-left: 50px;
- }
-
- input {
- height: 40px;
- width: 200px;
- margin-bottom: 30px;
- }
-
- button {
- background-color: #23669a;
- color: white;
- width: 50px;
- height: 30px;
- border-radius: 5px;
- outline: none;
- border: none;
- margin-left: 50px;
- }
-
-
- table {
- border: 1px solid #dbdbdb;
- border-collapse: collapse;
- }
-
- table tr,
- th,
- td {
- height: 50px;
- width: 180px;
- border: 1px solid #dbdbdb;
- text-align: center;
- }
-
- thead tr {
- background-color: #f4f4f5;
- }
-
- tbody tr td:nth-child(3) {
- color: #f54d7b;
- }
- </style>
- <div class="wrapper">
- <div>
- <table>
- <thead>
- <th>姓名</th>
- <th>科目</th>
- <th>成绩</th>
- <th>操作</th>
- </thead>
- <tbody>
-
- </tbody>
- <tfoot>
- <tr>
- <td colspan="4"> 总分:<span class="total"></span>平均分: <span class="avg"></span></td>
- </tr>
- </tfoot>
- </table>
- </div>
-
-
- <div class="box">
- 姓名:<input type="text" placeholder="请输入姓名" class="name"><br>
- 科目:<input type="text" placeholder="请输入科目" class="sub"><br>
- 分数:<input type="text" placeholder="请输入分数" class="score"><br>
- <button>添加</button>
- </div>
-
- </div>
- <script>
- //获取元素
- const tbody = document.querySelector('tbody')
- const btn = document.querySelector('button')
- const name = document.querySelector('.name')
- const sub = document.querySelector('.sub')
- const score = document.querySelector('.score')
- let total = document.querySelector('.total')
- let avg = document.querySelector('.avg')
- //给按钮添加点击事件
- btn.addEventListener('click', function () {
- //创建元素
- const tr = document.createElement('tr')
- const td1 = document.createElement('td')
- const td2 = document.createElement('td')
- const td3 = document.createElement('td')
- const td4 = document.createElement('td')
- if(name.value===''||sub.value===''||score.value===''){
- alert('姓名,科目,成绩不能为空')
- }else{
- td1.innerHTML = name.value
- td2.innerHTML = sub.value
- td3.innerHTML = score.value
- td4.innerHTML = '<a href="javascript:;">删除</a>'
- tr.appendChild(td1)
- tr.appendChild(td2)
- tr.appendChild(td3)
- tr.appendChild(td4)
- tbody.appendChild(tr)
- name.value = ''
- sub.value = ''
- score.value = ''
- }
-
- let three1 = document.querySelectorAll('tbody tr td:nth-child(3)')
- let sum = 0
- for (let j = 0; j < three1.length; j++) {
- sum += (three1[j].innerHTML - 0)
-
- }
- //总分
- total.innerHTML = `${sum}`
- //平均值
- avg.innerHTML = `${sum / three1.length}`
- //给创建的a添加删除的点击事件
- let as = document.querySelectorAll('a')
- for (let i = 0; i < as.length; i++) {
- as[i].addEventListener('click', function () {
- // tbody.removeChild(this.parentNode.parentNode)
- sum -= (three1[i].innerHTML - 0)
- this.parentNode.parentNode.remove()
- total.innerHTML = `${sum}`
-
- // total.innerHTML = `${sum - (three1[i].innerHTML - 0)}`
- let three = document.querySelectorAll('tbody tr td:nth-child(3)')
-
-
- avg.innerHTML = `${(sum / three.length).toFixed(2) === 'NaN' ? 0 : (sum / three.length).toFixed(2)}`
-
-
- })
-
- }
-
-
- })
-
-
- </script>
- <!DOCTYPE html>
- <html lang="en">
-
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Document</title>
- <style>
- .wrapper {
- display: flex;
- margin-left: 100px;
- margin-top: 100px;
- }
-
- .box {
- width: 300px;
- height: 400px;
- /* border: 2px solid red; */
- margin-left: 50px;
- }
-
- input {
- height: 40px;
- width: 200px;
- margin-bottom: 30px;
- }
-
- button {
- background-color: #23669a;
- color: white;
- width: 50px;
- height: 30px;
- border-radius: 5px;
- outline: none;
- border: none;
- margin-left: 50px;
- }
-
-
- table {
- border: 1px solid #dbdbdb;
- border-collapse: collapse;
- }
-
- table tr,
- th,
- td {
- height: 50px;
- width: 180px;
- border: 1px solid #dbdbdb;
- text-align: center;
- }
-
- thead tr {
- background-color: #f4f4f5;
- }
-
- tbody tr td:nth-child(3) {
- color: #f54d7b;
- }
- </style>
- </head>
-
- <body>
- <div class="wrapper">
- <div>
- <table>
- <thead>
- <th>姓名</th>
- <th>科目</th>
- <th>成绩</th>
- <th>操作</th>
- </thead>
- <tbody>
-
- </tbody>
- <tfoot>
- <tr>
- <td colspan="4"> 总分:<span class="total"></span>平均分: <span class="avg"></span></td>
- </tr>
- </tfoot>
- </table>
- </div>
-
-
- <div class="box">
- 姓名:<input type="text" placeholder="请输入姓名" class="name"><br>
- 科目:<input type="text" placeholder="请输入科目" class="sub"><br>
- 分数:<input type="text" placeholder="请输入分数" class="score"><br>
- <button>添加</button>
- </div>
-
- </div>
-
- <script>
- //获取元素
- const tbody = document.querySelector('tbody')
- const btn = document.querySelector('button')
- const name = document.querySelector('.name')
- const sub = document.querySelector('.sub')
- const score = document.querySelector('.score')
- let total = document.querySelector('.total')
- let avg = document.querySelector('.avg')
- //给按钮添加点击事件
- btn.addEventListener('click', function () {
- //创建元素
- const tr = document.createElement('tr')
- const td1 = document.createElement('td')
- const td2 = document.createElement('td')
- const td3 = document.createElement('td')
- const td4 = document.createElement('td')
- if(name.value===''||sub.value===''||score.value===''){
- alert('姓名,科目,成绩不能为空')
- }else{
- td1.innerHTML = name.value
- td2.innerHTML = sub.value
- td3.innerHTML = score.value
- td4.innerHTML = '<a href="javascript:;">删除</a>'
- tr.appendChild(td1)
- tr.appendChild(td2)
- tr.appendChild(td3)
- tr.appendChild(td4)
- tbody.appendChild(tr)
- name.value = ''
- sub.value = ''
- score.value = ''
- }
-
- let three1 = document.querySelectorAll('tbody tr td:nth-child(3)')
- let sum = 0
- for (let j = 0; j < three1.length; j++) {
- sum += (three1[j].innerHTML - 0)
-
- }
- //总分
- total.innerHTML = `${sum}`
- //平均值
- avg.innerHTML = `${sum / three1.length}`
- //给创建的a添加删除的点击事件
- let as = document.querySelectorAll('a')
- for (let i = 0; i < as.length; i++) {
- as[i].addEventListener('click', function () {
- // tbody.removeChild(this.parentNode.parentNode)
- sum -= (three1[i].innerHTML - 0)
- this.parentNode.parentNode.remove()
- total.innerHTML = `${sum}`
-
- // total.innerHTML = `${sum - (three1[i].innerHTML - 0)}`
- let three = document.querySelectorAll('tbody tr td:nth-child(3)')
-
-
- avg.innerHTML = `${(sum / three.length).toFixed(2) === 'NaN' ? 0 : (sum / three.length).toFixed(2)}`
-
-
- })
-
- }
-
-
- })
-
-
- </script>
-
- </body>
-
- </html>
思路:先把整体的效果图写出来,再通过js渲染到页面上,每次添加一组数据就相当于给数组添加数据,删除事件用事件委托,给祖先元素绑定事件,子元素触发事件会冒泡到祖先元素。
- .score-case {
- width: 1000px;
- margin: 50px auto;
- display: flex;
- }
- .score-case .table {
- flex: 4;
- }
- .score-case .table table {
- width: 100%;
- border-spacing: 0;
- border-top: 1px solid #ccc;
- border-left: 1px solid #ccc;
- }
- .score-case .table table th {
- background: #f5f5f5;
- }
- .score-case .table table tr:hover td {
- background: #f5f5f5;
- }
- .score-case .table table td,
- .score-case .table table th {
- border-bottom: 1px solid #ccc;
- border-right: 1px solid #ccc;
- text-align: center;
- padding: 10px;
- }
- .score-case .table table td.red,
- .score-case .table table th.red {
- color: red;
- }
- .score-case .table .none {
- height: 100px;
- line-height: 100px;
- color: #999;
- }
- .score-case .form {
- flex: 1;
- padding: 20px;
- }
- .score-case .form .form-item {
- display: flex;
- margin-bottom: 20px;
- align-items: center;
- }
- .score-case .form .form-item .label {
- width: 60px;
- text-align: right;
- font-size: 14px;
- }
- .score-case .form .form-item .input {
- flex: 1;
- }
- .score-case .form .form-item input,
- .score-case .form .form-item select {
- appearance: none;
- outline: none;
- border: 1px solid #ccc;
- width: 200px;
- height: 40px;
- box-sizing: border-box;
- padding: 10px;
- color: #666;
- }
- .score-case .form .form-item input::placeholder {
- color: #666;
- }
- .score-case .form .form-item .cancel,
- .score-case .form .form-item .submit {
- appearance: none;
- outline: none;
- border: 1px solid #ccc;
- border-radius: 4px;
- padding: 4px 10px;
- margin-right: 10px;
- font-size: 12px;
- background: #ccc;
- }
- .score-case .form .form-item .submit {
- border-color: #069;
- background: #069;
- color: #fff;
- }
- <div id="app" class="score-case">
- <div class="table">
- <table>
- <thead>
- <tr>
- <th>姓名</th>
- <th>科目</th>
- <th>成绩</th>
- <th>操作</th>
- </tr>
- </thead>
- <tbody>
- <!-- <tr>
- <td>1</td>
- <td>语文</td>
- <td class="red">46</td>
- <td><a href="#">删除</a></td>
- </tr> -->
- </tbody>
-
- <tfoot>
- <tr>
- <td colspan="5">
- <span class="total">总分:246</span>
- <span style="margin-left: 50px" class="average"
- >平均分:79</span
- >
- </td>
- </tr>
- </tfoot>
- </table>
- </div>
- <div class="form">
- <div class="form-item">
- <div class="label">姓名:</div>
- <div class="input">
- <input type="text" placeholder="请输入姓名" class="username" />
- </div>
- </div>
- <div class="form-item">
- <div class="label">科目:</div>
- <div class="input">
- <input type="text" placeholder="请输入科目" class="subject" />
- </div>
- </div>
- <div class="form-item">
- <div class="label">分数:</div>
- <div class="input">
- <input type="text" placeholder="请输入分数" class="score" />
- </div>
- </div>
- <div class="form-item">
- <div class="label"></div>
- <div class="input">
- <button class="submit">添加</button>
- </div>
- </div>
- </div>
- </div>
- <script>
- const list = [
- {
- uname: '张三',
- subject: '语文',
- score: 20,
- },
- {
- uname: '李四',
- subject: '数学',
- score: 20,
- },
- {
- uname: '王五',
- subject: '英文',
- score: 20,
- },
- ]
- // 1 基于数据渲染页面
- function render() {
- let str = ''
- let sum = 0
- for (let i = 0; i < list.length; i++) {
- sum += list[i].score
- str += `
- <tr>
- <td>${list[i].uname}</td>
- <td>${list[i].subject}</td>
- <td class="red">${list[i].score}</td>
- <td><a href="#" data-id=${i}>删除</a></td>
- </tr>
- `
- }
- document.querySelector('.score-case tbody').innerHTML = str
- // 计算总分 平均分 渲染到页面
- document.querySelector('.total').innerHTML = `总分:${sum}`
- document.querySelector('.average').innerHTML = `平均分:${
- (sum / list.length).toFixed(2) === 'NaN'
- ? 0
- : (sum / list.length).toFixed(2)
- }`
- }
- render()
-
- // 2 添加业务
- const submit = document.querySelector('.submit')
- submit.addEventListener('click', function () {
- const uname = document.querySelector('.username')
- const subject = document.querySelector('.subject')
- const score = document.querySelector('.score')
- const uname_v = uname.value.trim()
- const subject_v = subject.value.trim()
- const score_v = +score.value.trim()
- if (!uname_v || !subject_v || !score_v) {
- alert('姓名、科目 或分数都不能为空 ')
- return
- }
- list.push({
- uname: uname_v,
- subject: subject_v,
- score: score_v,
- })
- // 重新渲染
- render()
- // 清空文本框
- uname.value = ''
- subject.value = ''
- score.value = ''
- })
-
- // 3 删除
- document.querySelector('tbody').addEventListener('click', function (e) {
- console.log(e.target.dataset.id)
- // 把数组中对应的数据删除
- list.splice(e.target.dataset.id, 1)
- // 重新渲染
- render()
- })
- </script>
- <!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" />
- <link rel="stylesheet" href="./styles/index.css" />
- <title>Document</title>
- </head>
-
- <body>
- <div id="app" class="score-case">
- <div class="table">
- <table>
- <thead>
- <tr>
- <th>姓名</th>
- <th>科目</th>
- <th>成绩</th>
- <th>操作</th>
- </tr>
- </thead>
- <tbody>
- <!-- <tr>
- <td>1</td>
- <td>语文</td>
- <td class="red">46</td>
- <td><a href="#">删除</a></td>
- </tr> -->
- </tbody>
-
- <tfoot>
- <tr>
- <td colspan="5">
- <span class="total">总分:246</span>
- <span style="margin-left: 50px" class="average"
- >平均分:79</span
- >
- </td>
- </tr>
- </tfoot>
- </table>
- </div>
- <div class="form">
- <div class="form-item">
- <div class="label">姓名:</div>
- <div class="input">
- <input type="text" placeholder="请输入姓名" class="username" />
- </div>
- </div>
- <div class="form-item">
- <div class="label">科目:</div>
- <div class="input">
- <input type="text" placeholder="请输入科目" class="subject" />
- </div>
- </div>
- <div class="form-item">
- <div class="label">分数:</div>
- <div class="input">
- <input type="text" placeholder="请输入分数" class="score" />
- </div>
- </div>
- <div class="form-item">
- <div class="label"></div>
- <div class="input">
- <button class="submit">添加</button>
- </div>
- </div>
- </div>
- </div>
-
- <script>
- const list = [
- {
- uname: '张三',
- subject: '语文',
- score: 20,
- },
- {
- uname: '李四',
- subject: '数学',
- score: 20,
- },
- {
- uname: '王五',
- subject: '英文',
- score: 20,
- },
- ]
- // 1 基于数据渲染页面
- function render() {
- let str = ''
- let sum = 0
- for (let i = 0; i < list.length; i++) {
- sum += list[i].score
- str += `
- <tr>
- <td>${list[i].uname}</td>
- <td>${list[i].subject}</td>
- <td class="red">${list[i].score}</td>
- <td><a href="#" data-id=${i}>删除</a></td>
- </tr>
- `
- }
- document.querySelector('.score-case tbody').innerHTML = str
- // 计算总分 平均分 渲染到页面
- document.querySelector('.total').innerHTML = `总分:${sum}`
- document.querySelector('.average').innerHTML = `平均分:${
- (sum / list.length).toFixed(2) === 'NaN'
- ? 0
- : (sum / list.length).toFixed(2)
- }`
- }
- render()
-
- // 2 添加业务
- const submit = document.querySelector('.submit')
- submit.addEventListener('click', function () {
- const uname = document.querySelector('.username')
- const subject = document.querySelector('.subject')
- const score = document.querySelector('.score')
- const uname_v = uname.value.trim()
- const subject_v = subject.value.trim()
- const score_v = +score.value.trim()
- if (!uname_v || !subject_v || !score_v) {
- alert('姓名、科目 或分数都不能为空 ')
- return
- }
- list.push({
- uname: uname_v,
- subject: subject_v,
- score: score_v,
- })
- // 重新渲染
- render()
- // 清空文本框
- uname.value = ''
- subject.value = ''
- score.value = ''
- })
-
- // 3 删除
- document.querySelector('tbody').addEventListener('click', function (e) {
- console.log(e.target.dataset.id)
- // 把数组中对应的数据删除
- list.splice(e.target.dataset.id, 1)
- // 重新渲染
- render()
- })
- </script>
- </body>
- </html>
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。