事件操作语法

操作类型语法说明
冒泡绑定addEventListener(事件类型, 处理函数, false)从触发元素开始,依次向上触发祖先元素的同名事件
捕获绑定addEventListener(事件类型, 处理函数, true)从DOM根元素开始,依次向下触发目标元素的事件
阻止冒泡事件对象.stopPropagation()阻止事件向上传播,限制在当前元素内
阻止默认行为事件对象.preventDefault()阻止元素的默认行为,如链接跳转、表单提交等
解绑事件removeEventListener(事件类型, 处理函数, [阶段])移除之前绑定的事件监听器

示例代码

javascript
// 获取元素
const father = document.querySelector('.father')
const son = document.querySelector('.son')
const btn = document.querySelector('button')
const form = document.querySelector('form')

// 事件冒泡示例
function grandpaClick() {
  alert('我是爷爷')
}

function fatherClick() {
  alert('我是爸爸')
}

function sonClick(e) {
  alert('我是儿子')
  // 阻止冒泡
  e.stopPropagation()
}

// 绑定事件
document.addEventListener('click', grandpaClick)
father.addEventListener('click', fatherClick)
son.addEventListener('click', sonClick)

// 解绑事件示例
function btnClick() {
  alert('按钮被点击了')
}

// 绑定按钮事件
btn.addEventListener('click', btnClick)

// 解绑按钮事件
// btn.removeEventListener('click', btnClick)

// 阻止默认行为示例
const form = document.querySelector('form')
form.addEventListener('click', function(e) {
  // 阻止表单默认提交行为
  e.preventDefault()
  alert('表单提交已被阻止')
})

事件流的实际应用:事件委托

原理

给父元素注册事件,当触发子元素的事件时,会冒泡到父元素身上,从而触发父元素的事件。使用 事件对象.target 可以获得真正触发事件的元素。

完整示例

html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>事件委托示例</title>
    <style>
        ul {
            list-style: none;
            padding: 0;
        }
        li {
            padding: 10px;
            border: 1px solid #ccc;
            margin: 5px 0;
            cursor: pointer;
        }
        li:hover {
            background-color: #f5f5f5;
        }
    </style>
</head>
<body>
    <h3>事件委托示例</h3>
    <ul id="myList">
        <li>项目1</li>
        <li>项目2</li>
        <li>项目3</li>
        <li>项目4</li>
        <li>项目5</li>
    </ul>
    <p id="result">点击列表项查看结果</p>

    <script>
        // 获取父元素
        const ul = document.getElementById('myList')
        const result = document.getElementById('result')

        // 给父元素绑定点击事件
        ul.addEventListener('click', function(e) {
            // 获得真正触发事件的元素
            if (e.target.tagName === 'LI') {
                // 执行操作
                result.textContent = '点击了: ' + e.target.textContent
                // 可以在这里添加更多操作,比如添加样式
                e.target.style.backgroundColor = '#e3f2fd'
            }
        })
    </script>
</body>
</html>