1.事件委托是利用事件流的特征解决一些开发需求的知识技巧
➢优点:减少注册次数,可以提高程序性能
➢原理:事件委托其实是利用事件冒泡的特点
➢给父元素注册事件,当我们触发子元素的时候,会冒泡到父元素身上,从而触发父元素的事件
➢实现:
事件对象.target.tagName 可以获得真正触发事件的元素
【示例代码】
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<p>我不需要变色</p>
</ul>
<script>
// 点击某个li 当前li文字变为红色
// 委托给父级
const ul = document.querySelector('ul')
ul.addEventListener('click', function (e) {
// e.target 是我们点击的那个对象
// 但要求只有点击li时才变红色
if (e.target.tagName === 'LI') { // 注意标签名大写
e.target.style.color = 'red'
}
})
</script>
</body>
</html>
2.案例-tab栏切换改造
需求:优化程序,将tab切换案例改为事件委托写法
【部分代码】
html
<script>
// 获取父元素
const ul = document.querySelector('.tab-nav ul')
// 给父元素添加鼠标经过事件
ul.addEventListener('click', function (e) {
// console.log(e.target)
// 只有点击了 a 才会进行 添加、删除类
if (e.target.tagName === 'A') {
document.querySelector('.tab-nav .active').classList.remove('active')
e.target.classList.add('active')
// 下部大盒子模块
console.log(e.target.dataset.id) //得到的是字符串类型
const i = +e.target.dataset.id
document.querySelector('.tab-content .active').classList.remove('active')
document.querySelector(`.tab-content .item:nth-child(${i + 1})`).classList.add('active')
}
})
</script>