鼠标经过事件
1.mouseover和mouseout会有冒泡效果 2.mouseenter和mouseleave没有冒泡效果
阻止默认行为,比如链接点击不跳转,表单域的不提交
//语法
e.preventDefault()
两种注册事件的区别
事件委托
事件委托是利用事件流的特征解决一些开发需求的指示技巧
优点:给父级元素加事件(可以提高性能)
原理:事件委托其实是利用事件冒泡的特性,给父元素加事件,子元素可以触发
实现:事件对象.target 可以获得真正触发事件的元素
//e.target
//渲染信息案例,点击录入按钮,可以增加学生信息,点击删除时也可以删除
<head>
<style>
* {
margin: 0;
padding: 0;
}
a {
text-decoration: none;
color:#721c24;
}
h1 {
text-align: center;
color:#333;
margin: 20px 0;
}
table {
margin:0 auto;
width: 800px;
border-collapse: collapse;
color:#004085;
}
th {
padding: 10px;
background: #cfe5ff;
font-size: 20px;
font-weight: 400;
}
td,th {
border:1px solid #b8daff;
}
td {
padding:10px;
color:#666;
text-align: center;
font-size: 16px;
}
tbody tr {
background: #fff;
}
tbody tr:hover {
background: #e1ecf8;
}
.info {
width: 900px;
margin: 50px auto;
text-align: center;
}
.info input {
width: 80px;
height: 25px;
outline: none;
border-radius: 5px;
border:1px solid #b8daff;
padding-left: 5px;
}
.info button {
width: 60px;
height: 25px;
background-color: #004085;
outline: none;
border: 0;
color: #fff;
cursor: pointer;
border-radius: 5px;
}
.info .age {
width: 50px;
}
</style>
</head>
<body>
<h1>新增学员</h1>
<div class="info">
姓名:<input type="text" class="uname" /> 年龄:<input type="text" class="age" />
性别:
<select name="gender" id="" class="gender">
<option value="男">男</option>
<option value="女">女</option>
</select>
薪资:<input type="text" class="salary" /> 就业城市:<select name="city" id="" class="city">
<option value="北京">北京</option>
<option value="上海">上海</option>
<option value="广州">广州</option>
<option value="深圳">深圳</option>
<option value="曹县">曹县</option>
</select>
<button class="add">录入</button>
</div>
<h1>就业榜</h1>
<table>
<thead>
<tr>
<th>学号</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>薪资</th>
<th>就业城市</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<!-- <tr>
<td>1</td>
<td>这是名称</td>
<td>这是年龄</td>
<td>这是性别</td>
<td>这是工资</td>
<td>这是所在城市</td>
<td>
<a href="javascript:" class="del">删除</a>
</td>
</tr> -->
</tbody>
</table>
<script>
// 获取数据
// 姓名
let uname = document.querySelector('.uname')
// 性别
let gender = document.querySelector('.gender')
// 年龄
let age = document.querySelector('.age')
// 资新
let salary = document.querySelector('.salary')
// 城市
let city = document.querySelector('.city')
let tbody = document.querySelector('tbody')
// 录入
let add = document.querySelector('.add')
// 删除按钮
let del = document.querySelector('.del')
// 1. 准备好数据后端的数据
let arr = [
// {
// stuId: 1005,
// uname: '瓜摊老板',
// age: 32,
// gender: '男',
// salary: '4300',
// city: '广州'
// }
]
// 封装成函数
function init() {
// 遍历数据
let str = ''//结构
for (let i = 0; i < arr.length; i++) {
str += `
<tr>
<td>${arr[i].stuId}</td>
<td>${arr[i].uname}</td>
<td>${arr[i].age}</td>
<td>${arr[i].gender}</td>
<td>${arr[i].salary}</td>
<td>${arr[i].city}</td>
<td>
<a href="javascript:" class="del" id='${arr[i].stuId}'>删除</a>
</td>
</tr>`
}
// 填充结构
tbody.innerHTML = str
}
// 调用函数
init()
// 数据的新增
// 1.准备好需要新增的数据,添加到数据源
// 2.渲染,将生成的数据对象,追加到数组中,重新渲染
// 点击录入生成数据
add.addEventListener('click', function () {
let obj = {
stuId: arr.length > 0 ? arr[arr.length - 1].stuId + 1 : 1001,
uname: uname.value,
age: age.value,
gender: gender.value,
salary: salary.value,
city: city.value
}
arr.push(obj)
init()
})
// 动态渲染的元素(未来的元素)的事件绑定需要事件委托,给父元素绑定,让子元素触发
tbody.addEventListener('click', function (e) {
// console.log(e.target.id);
// 点击删除才真正有效
if (e.target.className = 'del') {
// 获取当前删除的id
let id = e.target.id
for (let i = 0; i < arr.length; i++) {
if (id == arr[i].stuId) {
// 找到指定id直接删除
arr.splice(i, 1)
init()
}
}
}
})
</script>
</body>