事件委托:是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>