一个函数处理多个事件,可以使用type属性,stopPropagation

本文介绍了一个HTML页面中按钮事件处理的实例,展示了如何使用JavaScript为同一个按钮的不同事件(如点击和鼠标悬停)绑定事件处理函数,并通过event对象区分事件类型。
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<input type="button" id="btn">
<script>
window.onload = function() {
var btn = document.getElementById('btn');
var fun = function (event) {
switch (event.type){
case "click":
alert('1');
break;
case "mouseover":
alert('2');
break;
}
};
btn.onclick = fun;
btn.onmouseover = function (event) {
//立刻停止事件在DOM层次中的传播,所以这边onmouseover的时候不会弹出2。如果去掉这个方法,会弹出2
event.stopPropagation('mouseover');
}

}
</script>
</body>
</html>

转载于:https://www.cnblogs.com/shenq/p/6692938.html

<think>我们需要在同一个元素上添加多个事件监听器。有几种方法可以实现: 1. 多次调用addEventListener,每次添加一个事件。 2. 使用一个事件处理函数,在函数内部根据事件类型进行分支处理。 3. 使用事件委托(如果多个事件有共同的父元素)。 下面将详细说明每一种方法。 </think>### 在 JavaScript 中添加多个事件监听器的方法 在 JavaScript 中,可以通过多种方式为同一元素添加多个事件监听器。以下是四种常用方法及其实现原理: --- #### 方法 1:多次调用 `addEventListener()` **实现思路**:直接为同一个元素多次调用 `addEventListener()`,每次添加一个事件类型 ```javascript const button = document.getElementById('myButton'); // 添加第一个点击事件 button.addEventListener('click', () => { console.log('第一个点击事件触发'); }); // 添加第二个点击事件 button.addEventListener('click', () => { console.log('第二个点击事件触发'); }); // 添加鼠标移入事件 button.addEventListener('mouseenter', () => { console.log('鼠标移入按钮'); }); ``` **特性**: - 事件按添加顺序触发(先添加先执行) - 同一事件多个监听器会按注册顺序依次执行 - 支持所有标准事件类型(`click`, `mouseover`, `keydown` 等) --- #### 方法 2:事件委托(Event Delegation) **实现思路**:在父元素上添加单个监听器,通过事件冒泡处理多个子元素的事件 ```javascript document.getElementById('parent').addEventListener('click', (event) => { if (event.target.matches('.child')) { console.log('处理子元素点击事件', event.target.id); } if (event.target.matches('.special')) { console.log('处理特殊元素点击事件'); } }); ``` **优势**: - 减少内存占用(单个监听器处理多个元素) - 自动处理动态添加的子元素 - 统一事件处理逻辑 --- #### 方法 3:使用命名函数组合调用 **实现思路**:创建多个处理函数,在单个监听器中组合调用 ```javascript const button = document.getElementById('myButton'); // 定义多个处理函数 function handler1() { console.log('处理函数1执行'); } function handler2() { console.log('处理函数2执行'); } // 组合事件监听器 button.addEventListener('click', (event) => { handler1(event); handler2(event); }); ``` **适用场景**: - 需要确保执行顺序严格可控 - 多个处理函数需要共享事件对象 - 需要统一错误处理机制 --- #### 方法 4:创建事件监听器管理类 **实现思路**:封装自定义类管理多个监听器及其生命周期 ```javascript class EventManager { constructor(element) { this.element = element; this.handlers = new Map(); // [eventType: Set[handlers]] } add(eventType, handler) { if (!this.handlers.has(eventType)) { this.handlers.set(eventType, new Set()); this.element.addEventListener(eventType, (e) => { this.handlers.get(eventType).forEach(h => h(e)); }); } this.handlers.get(eventType).add(handler); } remove(eventType, handler) { if (this.handlers.has(eventType)) { this.handlers.get(eventType).delete(handler); } } } // 使用示例 const btn = document.getElementById('btn'); const manager = new EventManager(btn); const log1 = () => console.log('Log 1'); const log2 = () => console.log('Log 2'); manager.add('click', log1); manager.add('click', log2); // 移除单个处理器 manager.remove('click', log1); ``` --- ### 注意事项 1. **事件执行顺序** 同一事件多个监听器按注册顺序执行(先注册先执行) 2. **移除监听器** 使用具名函数才能正确移除: ```javascript // 正确移除方式 const handler = () => {...}; element.addEventListener('click', handler); element.removeEventListener('click', handler); ``` 3. **性能优化** 对于高频事件(如 `scroll`, `mousemove`),建议: - 使用节流(throttling)或防抖(debouncing) - 在不需要时及时移除监听器 4. **事件冒泡控制** 使用 `event.stopPropagation()` 需谨慎: ```javascript element.addEventListener('click', (e) => { e.stopPropagation(); // 阻止向父元素冒泡 }); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值