‘手写 ’ 这个词 ,面试是不是听过无数遍呢 !

今天我们来手写一个这样的事件委托函数 =》

function( parent, selector, type ,  handle)  {}

你需要传递的参数分别是:

parent: 事件绑定的父级

selector: 选择器,

type:  事件类型

handle: 事件处理函数

写之前 先了解一下事件委托的概念:

    它是通过事件冒泡机制,

即子元素上触发的事件会冒泡到父级上, 即父级也会触发该类型的事件,

通过父级触发的事件拿到事件源对象e.target  就可以 知道 真正触发事件的元素是什么。

举个例子, 一个ul 下面有 1000 个  li   , 我们 要给  li  绑定  点击事件 , 如果给每个li都绑定一个

点击事件  会  大量占用 内存   , 不利于性能优化, 这种情况下 我们 只需要在ul上绑定一个点击事件,

通过class 或者 id 来识别每个li ,  这样就大大减少了事件注册, 而且 再 有新增的li时 我们也无需再去注册点击事件

我们来写个小demo

HTML:

<ul id="parent"><li>1</li><li>2</li><li>3</li>
</ul>

css:

.active{background-color: green;
}

js:

const parent = document.getElementById('parent');
function changeColor() {
  if (this.classList.contains('active')) {      this.classList.remove('active')  } else {      this.classList.add('active');  }
 } 

function delegate(parent, selector, type, handle) { } delegate(parent, 'li', 'click',changeColor);

我们要实现点哪个li  , 哪个li就变成原谅色, 再次点击取消。并 做 浏览器的兼容

我们开始写 delegate函数:

function matchSelector(target, selector) {if (selector.match(/^#/g)) { // 匹配以#开头的字符串return target.id === selector.slice(1); // 截取#后面的字符串
    }if (selector.match(/^\./g)) {  // . 要转义,匹配以点开头的字符转return target.classList.contains(selector.slice(1))}return target.nodeName.toLowerCase() ===  selector; // 匹配标签
}
function delegate(parent, selector, type, handle) {if (parent.addEventListener) {parent.addEventListener(type, eventFn, false)} else {   // 兼容老IEparent.attachEvent('on' + type, handle)}function eventFn(e) {const event = e || window.event;const target = event.target || event.srcElement;// 兼容老IEif (matchSelector(target, selector)) {if (handle) {handle.call(target, e); // 让handle执行时的this指向target}}}
}

效果:

           

转载于:https://www.cnblogs.com/LHLVS/p/10712952.html

手写事件代理函数 (Delegated function)相关推荐

  1. vue渲染大量数据如何优化_Vue3 Compiler 优化细节,如何手写高性能渲染函数

    送5本<你不知道的 JavaScript 上卷>点我抽奖,祝大家好运 Vue3 的 Compiler 与 runtime 紧密合作,充分利用编译时信息,使得性能得到了极大的提升.本文的目的 ...

  2. JS高级——纯函数、柯里化(手写自动柯里化函数)、组合函数(手写自动组合函数)

    一.理解JavaScript纯函数 函数式编程中有一个非常重要的概念叫纯函数,JavaScript符合函数式编程的范式,所以也有纯函数的概念: 在react开发中纯函数是被多次提及的: 比如react ...

  3. 手写一个bind函数

    我们先看代码,bind 函数的使用方法 function test(a, b, c) {console.log(a, b, c);console.log('this', this)return '我是 ...

  4. 手写简化版printf函数

    2019.02.01更新:经同学提醒,myprintf函数应有返回值为输出的字符数. 期末的大作业,手写一个myprintf函数,支持如下一些操作. 也就是  % -(负号控制左右对齐) 数(控制字段 ...

  5. asp.net GridView手写事件,包括取主键、取值、更新、选择、删除

    图片是本网站后台的友情链接管理页面: 前两者的代码比较固定,一般都是:  代码如下 复制代码 protected void gvFriendLink_RowEditing(object sender, ...

  6. 【OpenCV学习笔记】之六 手写图像旋转函数---万丈高楼平地起

    话说,平凡之处显真格,这一点也没错!  比如,对旋转图像进行双线性插值,很简单吧?  可,对我,折腾了大半天,也没有达到预期效果!  尤其是三个误区让我抓瞎好久: 1,坐标旋转公式.   这东西,要用 ...

  7. 【EventBus】事件通信框架 ( 总结 | 手写事件通信框架完整代码示例 | 测试上述框架 )

    文章目录 一.消息中心 二.订阅方法时的注解 三.订阅方法封装 四.订阅对象-方法封装 五.线程模式 六.Activity 中测试上述框架 七.博客源码 一.消息中心 该消息中心是事件通信框架的核心代 ...

  8. 如何手写一个闭包函数

    function fa(){let a = 10;return function fb(){console.log(a)} } let fc = fa(); fc()//fc=null 为什么需要一个 ...

  9. 原生js已载入就执行函数_手写CommonJS 中的 require函数

    前言 来自于圣松大佬的文章<手写CommonJS 中的 require函数> 什么是 CommonJS ? node.js 的应用采用的commonjs模块规范. 每一个文件就是一个模块, ...

最新文章

  1. R语言基础与入门实践
  2. tomca7.0 mysql配置连接池_tomcat7.0+mysql连接池配置
  3. spring+mybatis+springmvc项目配置
  4. RDA8955烧写程序摘要
  5. mysql自增主键归零的方法
  6. spoj 375 Query on a tree (树链剖分)
  7. CUDA 4.0真技术解析
  8. Redis系列(十四)、Redis6新特性之RESP3与客户端缓存(Client side caching)
  9. Android SQLite (二) 基本用法
  10. strtok_r实现方式之一
  11. CCF201812-2 小明放学
  12. IT凭什么拿高薪?!
  13. java对获取的字节数组进行处理
  14. 基于注解的组件扫描——Spring IOC/DI(五)
  15. 爱加密Android APk 原理解析
  16. 音视频封装到MP4/MP3ffmpeg(十四)
  17. Python、C、Java 和 C++ 四足鼎立,其他已无胜算? | TIOBE 10 月编程语言排行榜
  18. SQLITE数据库修复
  19. rocksdb配置解析
  20. 谷歌SEO外链:1400刀保证能多少条外链

热门文章

  1. 电厂人员定位技术在安全管理方面应用解读
  2. window bat脚本 扩充变量 %dp0
  3. 怎样查看python的安装路径win7_win7下查找指定程序的安装目录
  4. 量化交易参考书目-董可人
  5. MATLAB算法实战应用案例精讲-【深度学习】多尺度特征融合(补充篇)
  6. 工作流——启动事件(Start Event)
  7. 华为智能家居鸿蒙,美的集团首发支持华为鸿蒙 年内推出配套智能家居
  8. MySQL的视图定义、规则与视图作用、创建视图和修改视图,以及视图的保存
  9. Python交互数据库(Mysql | Mongodb | Redis)
  10. AI魔法秀:D-ID助你打造视频虚拟数字人