addEventListener在一个节点上添加多个相同的事件(类似jq里面事件委托的味道)
<button id='btn'>attachEvent</button>
window.onload=function(){
var Obtn = document.getElementById('btn'); Obtn.onclick=function(){ alert(1) } // 只兼容IE // Obtn.attachEvent('onclick',function(){ // alert(1) // }) function add(){ alert(2) }
//绑定事件 三个参数最后一个参数默认为false 兼容:firefox、chrome、IE、safari、opera;不兼容IE 7 8
Obtn.addEventListener('click',add,false)
//解除事件绑定 //Obtn.removeEventListener('click',add,false)
}
removeEventListener使用
const list = document.querySelector('ul'); const buttons = list.querySelectorAll('button'); buttons.forEach((button) => { button.addEventListener('click', function fun(evt) { console.log(evt.target.parentNode) const target = evt.target; target.parentNode.className = 'completed'; setTimeout(() => { list.removeChild(target.parentNode); }, 2000); target.removeEventListener('click', fun); // 防止重复点击 上面点击完就移除函数 }) });
formEl.addEventListener('submit', function submitData(evt) { fetch('path/to/url', { method: 'POST', body: JSON.stringify(formData), ... }); formEl.removeEventListener('submit', submitData); // 防止重复提交 })
还可以把过程抽象出来
function once(fn) { return function (...arge) { if (fn) { let res = fn.apply(this, arge) fn = null return res } } } const list = document.querySelector('ul'); const buttons = document.querySelectorAll('button') buttons.forEach((btn) => { btn.addEventListener('click', once((evt) => { // debugger let target = evt.target target.parentNode.className = 'completed' setTimeout(() => { list.removeChild(target.parentNode) }, 1000) // target.disabled = true; })) })
和单独添加onclick事件的区别
demo如下,得出结果onclick只出现一次alert:我是click2【很正常第一次click事件会被第二次所覆盖】,
但是addEventListener却可以先后运行,不会被覆盖【正如:它允许给一个事件注册多个监听器。
在使用DHTML库或者 Mozilla extensions
这样需要保证能够和其他的库或者差距并存的时候非常有用。】
<ul id="color-list"> <li id="addEvent">red</li> <li id="on_click">yellow</li> </ul>
<script type="text/javascript"> (function () { var addEvent = document.getElementById("addEvent"); addEvent.addEventListener("click", function () { alert("我是addEvent1"); }, false); addEvent.addEventListener("click", function () { alert("我是addEvent2"); }, false); var addEvent = document.getElementById("on_click"); on_click.onclick = function () { alert("我是click1"); } on_click.onclick = function () { alert("我是click2"); } })(); </script>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?