HTML模板
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>事件 演示</title> <style> div { border: 1px solid #ccc; margin: 10px 0; padding: 0 10px; } </style> </head> <body> <button id="btn1">一个按钮</button> <div id="div1"> <p id="p1">激活</p> <p id="p2">勾销</p> <p id="p3">勾销</p> <p id="p4">勾销</p> </div> <div id="div2"> <p id="p5">勾销</p> <p id="p6">勾销</p> </div> <div id="div3"> <a href="#">a1</a><br> <a href="#">a2</a><br> <a href="#">a3</a><br> <a href="#">a4</a><br> <button>加载更多...</button> </div> <script src="./event.js"></script> </body></html>
事件绑定
// 一般绑定const btn1 = document.getElementById('btn1')bindEvent(btn1, 'click', function (event) { // console.log(event.target) // 获取触发的元素 event.preventDefault() // 阻止默认行为 alert(this.innerHTML)})// 代理绑定const div3 = document.getElementById('div3')bindEvent(div3, 'click', 'a', function (event) { event.preventDefault() alert(this.innerHTML)})
事件冒泡
- 基于DOM树形构造
- 事件会顺着触发元素往上冒泡
- 利用场景:事件代理
const p1 = document.getElementById('p1')bindEvent(p1, 'click', event => { event.stopPropagation() // 阻止冒泡 console.log('激活')})const body = document.bodybindEvent(body, 'click', event => { console.log('勾销') // console.log(event.target)})const div2 = document.getElementById('div2')bindEvent(div2, 'click', event => { console.log('div2 clicked') console.log(event.target)})
思考题:有限下拉列表,如何监听每个图片的点击
- 事件代理
- 用e.target获取触发元素
- 用matches来判断是否是触发元素