要求
1.严格使用素材所给布局
2.必须使用表单提交事件
3.必须将输入的数据存储在数组中,根据数组渲染表格内容
4.删除行的时候,必须将数组中数据也进行删除,不允许出现点击一次按钮,表格中出现多个行的场景
5.仅限使用原生js
6.对表单元素各项都有验证
基本布局
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>表格动态添加和删除title>
head>
<body>
<form action="http://www.baidu.com">
<table>
<caption>
<h2>表格添加h2>
caption>
<tbody>
<tr>
<td>游戏名称:td>
<td><input type="text" name="gamename">td>
tr>
<tr>
<td>开发公司:td>
<td>
<input type="radio" name="company" value="腾讯">腾讯
<input type="radio" name="company" value="暴雪">暴雪
<input type="radio" name="company" value="网易">网易
<input type="radio" name="company" value="任天堂">任天堂
td>
tr>
<tr>
<td>适用人群:td>
<td>
<input type="checkbox" name="people" value="小学生">小学生
<input type="checkbox" name="people" value="大学生">大学生
<input type="checkbox" name="people" value="白领">白领
<input type="checkbox" name="people" value="老年人">老年人
td>
tr>
<tr>
<td>游戏类别:td>
<td>
<select name="kind">
<option value="0">请选择游戏类别option>
<option value="益智类">益智类option>
<option value="动作类">动作类option>
<option value="冒险类">冒险类option>
<option value="策略类">策略类option>
<option value="模拟类">模拟类option>
select>
td>
tr>
<tr>
<td>游戏描述:td>
<td>
<textarea name="detail" cols="30" rows="10">textarea>
td>
tr>
<tr>
<td>td>
<td>
<input type="reset">
<input type="submit" value="添加">
td>
tr>
tbody>
table>
form>
<table width=800 border=1>
<caption>
<h2>表格展示h2>
caption>
<thead>
<tr>
<th>游戏名称th>
<th>开发公司th>
<th>适用人群th>
<th>游戏类别th>
<th>游戏描述th>
<th>操作th>
tr>
thead>
<tbody>tbody>
table>
body>
html>
邀请回答才收到,这边已经有人贴答案了,还需要我们继续么?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>表格动态添加和删除</title>
<script>
(function(){
})()
window.onload = function(){
document.querySelector('input[type=button]').onclick = function(){
// 同样,多个 form ,自行修改选择器
frm = document.querySelector('form')
// 自行修改提示,验证我只做简单的是否填值了,正则长度之类的我就不写了
data = {
'gamename': frm['gamename'].value
,'company': frm['company'].value
,'people':(function(){
people = ''
frm['people'].forEach(function(el){
if (el.checked)
{
people += ',' + el.value
}
})
return people.substr(1)
})()
,'kind': (function(){
if (frm['kind'].selectedIndex > 0)
{
return frm['kind'].options[frm['kind'].selectedIndex].value
}
return ''
})()
,'detail': frm['detail'].value
}
//console.log(check)
// 自行添加验证
if (!data.gamename)
{
alert('名字')
return
}
if (!data.company)
{
alert('公司')
return
}
if (!data.people)
{
alert('人群')
return
}
if (!data.kind)
{
alert('类型')
return
}
if (!data.detail)
{
alert('评价')
return
}
// 如果有多个 table 自行修改 querySelector 的选择器
tb = document.querySelector('form ~ table');
var tr = document.createElement('tr')
tb.append(tr)
for (var k in data)
{
var td = document.createElement('td')
td.innerText = data[k]
tr.append(td)
}
var td = document.createElement('td')
td.innerText = '删除'
tr.append(td)
td.onclick = function(){
if (confirm('确定删除?'))
{
this.parentNode.remove()
}
}
frm.reset()
}
}
</script>
</head>
<body>
<form action="http://www.baidu.com">
<table>
<caption>
<h2>表格添加</h2>
</caption>
<tbody>
<tr>
<td>游戏名称:</td>
<td><input type="text" name="gamename"></td>
</tr>
<tr>
<td>开发公司:</td>
<td>
<label><input type="radio" name="company" value="腾讯">腾讯</label>
<label><input type="radio" name="company" value="暴雪">暴雪</label>
<label><input type="radio" name="company" value="网易">网易</label>
<label><input type="radio" name="company" value="任天堂">任天堂</label>
</td>
</tr>
<tr>
<td>适用人群:</td>
<td>
<label><input type="checkbox" name="people" value="小学生">小学生</label>
<label><input type="checkbox" name="people" value="大学生">大学生</label>
<label><input type="checkbox" name="people" value="白领">白领</label>
<label><input type="checkbox" name="people" value="老年人">老年人</label>
</td>
</tr>
<tr>
<td>游戏类别:</td>
<td>
<select name="kind">
<option value="0">请选择游戏类别</option>
<option value="益智类">益智类</option>
<option value="动作类">动作类</option>
<option value="冒险类">冒险类</option>
<option value="策略类">策略类</option>
<option value="模拟类">模拟类</option>
</select>
</td>
</tr>
<tr>
<td>游戏描述:</td>
<td>
<textarea name="detail" cols="30" rows="10"></textarea>
</td>
</tr>
<tr>
<td></td>
<td>
<input type="reset">
<input type="button" value="添加">
</td>
</tr>
</tbody>
</table>
</form>
<table width=800 border=1>
<caption>
<h2>表格展示</h2>
</caption>
<thead>
<tr>
<th>游戏名称</th>
<th>开发公司</th>
<th>适用人群</th>
<th>游戏类别</th>
<th>游戏描述</th>
<th>操作</th>
</tr>
</thead>
<tbody></tbody>
</table>
</body>
</html>
(提示:这题打开开发者工具后会非常的卡,特别是电脑配置不高的,所以调试的时候请耐心并且多做记录,记住调试过和当前调试到的位置,如调试过程中卡主了,可以关掉网页重新打开,然后快速回到自己刚才调试的地方)
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
好的,这里是实现表格动态添加和删除的原生JS代码,代码中加入了对表单元素的各项验证。
```
var gamelist = []; // 定义数组存储游戏列表数据
window.onload = function() {
var form = document.querySelector('form');
var table = document.querySelector('table tbody');
// 当表单提交时执行add函数
form.addEventListener('submit', add, false);
// 当删除按钮点击时执行del函数
table.addEventListener('click', del, false);
}
// 添加游戏的函数
function add(e) {
e.preventDefault(); // 禁止表单的默认行为
var gamename = this.gamename.value.trim();
var company = this.company.value ? this.company.value : null;
var people = getCheckedValues(this.people);
var kind = this.kind.value !== '0' ? this.kind.value : null;
var detail = this.detail.value.trim();
// 进行表单验证
if (!gamename || gamename.length > 10) {
alert('游戏名称为1~10个汉字!');
return;
}
if (!company) {
alert('请选择开发公司!');
return;
}
if (!people.length) {
alert('请选择适用人群!');
return;
}
if (!kind) {
alert('请选择游戏类别!');
return;
}
if (!detail) {
alert('请填写游戏描述!');
return;
}
// 将数据存入数组
gamelist.push({
gamename: gamename,
company: company,
people: people,
kind: kind,
detail: detail
});
// 渲染表格
renderTable();
// 清空表单
this.reset();
}
// 获取多选框的选中值
function getCheckedValues(els) {
var arr = [];
for (var i = 0, len = els.length; i < len; i++) {
if (els[i].checked) {
arr.push(els[i].value);
}
}
return arr;
}
// 删除游戏的函数
function del(e) {
if (e.target.tagName.toLowerCase() === 'a' && e.target.innerText === '删除') {
var index = e.target.parentElement.parentElement.dataset.index; // 获取要删除行的下标
// 从数组中删除对应数据
gamelist.splice(index, 1);
// 渲染表格
renderTable();
}
}
// 渲染表格的函数
function renderTable() {
var tbody = document.querySelector('table tbody');
var html = '';
gamelist.forEach(function(item, index) {
html += '' + item.gamename + '' + item.company + '' + item.people + '' + item.kind + '' + item.detail + '删除';
});
tbody.innerHTML = html;
}
``
// 获取表格元素
var table = document.querySelector('table');
// 获取表单元素
var form = document.querySelector('form');
// 获取表格中的tbody元素
var tbody = table.querySelector('tbody');
// 定义数据数组,用于存储表格中的数据
var data = [];
// 添加表单提交事件处理函数
form.addEventListener('submit', function(event) {
// 阻止表单默认提交行为
event.preventDefault();
// 获取表单元素的值
var gameName = form.elements.gamename.value.trim();
var company = form.elements.company.value.trim();
var people = Array.from(form.elements.people).filter(function(item) {
return item.checked;
}).map(function(item) {
return item.value;
});
var kind = form.elements.kind.value.trim();
var detail = form.elements.detail.value.trim();
// 验证表单元素的值
if (!gameName) {
alert('游戏名称不能为空!');
return;
}
if (!company) {
alert('开发公司不能为空!');
return;
}
if (people.length === 0) {
alert('适用人群不能为空!');
return;
}
if (kind === '0') {
alert('请选择游戏类别!');
return;
}
if (!detail) {
alert('游戏描述不能为空!');
return;
}
// 将表单数据存入数组中
var item = {
gameName: gameName,
company: company,
people: people.join(','),
kind: kind,
detail: detail
};
data.push(item);
// 渲染表格中的数据
renderTable();
// 清空表单元素的值
form.reset();
});
// 添加表格点击事件处理函数
table.addEventListener('click', function(event) {
// 判断点击的是否为删除按钮
if (event.target.classList.contains('delete-btn')) {
// 获取点击的删除按钮所在的行
var row = event.target.parentElement.parentElement;
// 从数据数组中删除对应的数据
var index = row.rowIndex - 1;
data.splice(index, 1);
// 从表格中删除对应的行
tbody.removeChild(row);
}
});
// 渲染表格中的数据
function renderTable() {
// 清空表格中的数据
tbody.innerHTML = '';
// 遍历数据数组,渲染表格中的数据
data.forEach(function(item) {
var row = document.createElement('tr');
row.innerHTML = `
<td>${item.gameName}</td>
<td>${item.company}</td>
<td>${item.people}</td>
<td>${item.kind}</td>
<td>${item.detail}</td>
<td><button class="delete-btn">删除</button></td>
`;
tbody.appendChild(row);
});