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>
复制代码

 

posted @   xuanPhoto  阅读(2033)  评论(0编辑  收藏  举报
编辑推荐:
· 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爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示