封装绑定事件的处理函数(事件代理)

    <ul id="list">
      <li id="li1">项目一</li>
      <li>项目二</li>
      <li>项目三</li>
      <li>项目四</li>
    </ul>
复制代码
      const list = document.getElementById('list')
      const li1 = document.getElementById('li1')
      function addEvent(ele, type, selector, cb) {
        if (!cb) {
          cb = selector
          selector = null
        }
        ele.addEventListener(type, function (e) {
          // e.stopPropagation()
          const target = e.target
          if (selector) {
            if (target.matches(selector)) cb.call(target, e) // matches方法用来判断是不是点击了li,也可以用来判断是不是点击了某个选择器。也可以用e.target.nodeName==='LI'或e.target.constructor===HTMLLIElement来判断是不是点击了li元素
          } else {
            cb.call(target, e)
          }
        })
      }
      addEvent(li1, 'click', function (e) {
        console.log(1, e.target.innerHTML)
        console.log(2, this.innerHTML)
        console.log(this === e.target)
      })
      addEvent(list, 'click', 'li', function (e) {
        console.log(1, e.target.innerHTML)
        console.log(2, this.innerHTML)
        console.log(this === e.target)
      })
复制代码

  1、this的指向:谁调用就指向谁

  2、addEvent定义在window中,调用addEvent时是window调用的,只是window省略不写,其中的this指向window

  3、事件函数中this指向事件侦听的DOM对象

  4、当addEvent中使用call将cb的this指向target时,再调用addEvent其中的this就指向target了,此时e.target === this

  5、以上都是在普通匿名函数中,若使用箭头函数,注意this会指向上一级this

 

posted @   吴小明-  阅读(102)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结
点击右上角即可分享
微信分享提示