事件委托:是JavaScript中注册事件的常用技巧,也称事件委派、事件代理
简单理解:原本需要注册在子元素的事件委托给父元素,让父元素担当事件监听的职务
优点:减少注册次数,可提高程序性能
原理:事件委托其实是利用事件冒泡的特点
- 给父亲注册时间,当触发子元素时,会冒泡到父元素身上,从而触发父元素事件
案例讲解:
这是一个使用事件委托实现的Tab栏切换效果。代码包含HTML、CSS样式和JavaScript交互逻辑。Tab栏包含5个导航项(精选、美食、百货、个护、预告)和对应的内容区。通过鼠标悬停事件,JavaScript动态切换active类实现内容切换效果,避免为每个导航项单独绑定事件,提高了性能。CSS样式定义了Tab栏的布局和交互状态下的样式变化。
效果图:
代码
<!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>事件委托版本tab栏切换</title><style>* {margin: 0;padding: 0;}.tab {width: 590px;height: 340px;margin: 20px;border: 1px solid #e4e4e4;}.tab-nav {width: 100%;height: 60px;line-height: 60px;display: flex;justify-content: space-between;}.tab-nav h3 {font-size: 24px;font-weight: normal;margin-left: 20px;}.tab-nav ul {list-style: none;display: flex;justify-content: flex-end;}.tab-nav ul li {margin: 0 20px;font-size: 14px;}.tab-nav ul li a {text-decoration: none;border-bottom: 2px solid transparent;color: #333;}.tab-nav ul li a.active {border-color: #e1251b;color: #e1251b;}.tab-content {padding: 0 16px;}.tab-content .item {display: none;}.tab-content .item.active {display: block;}</style>
</head><body><div class="tab"><div class="tab-nav"><h3>每日特价</h3><ul><li><a class="active" href="javascript:;" data-id="0">精选</a></li><li><a href="javascript:;" data-id="1">美食</a></li><li><a href="javascript:;" data-id="2">百货</a></li><li><a href="javascript:;" data-id="3">个护</a></li><li><a href="javascript:;" data-id="4">预告</a></li></ul></div><div class="tab-content"><div class="item active"><img src="./images/tab00.png" alt="" /></div><div class="item"><img src="./images/tab01.png" alt="" /></div><div class="item"><img src="./images/tab02.png" alt="" /></div><div class="item"><img src="./images/tab03.png" alt="" /></div><div class="item"><img src="./images/tab04.png" alt="" /></div></div></div><script>const ul = document.querySelector('.tab-nav ul');const items = document.querySelectorAll('.tab-content .item');ul.addEventListener('mouseover', function (e) {if (e.target.tagName === 'A') {// 排他思想,其余a去掉active类document.querySelector('.tab-nav .active').classList.remove('active');// 当前元素添加active类e.target.classList.add('active');// 给5个链接添加自定义属性标注好序号document.querySelector('.tab-content .active').classList.remove('active');// 根据序号选择对应的底部盒子items[e.target.dataset.id].classList.add('active');}})</script>
</body></html>