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

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

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 { // 兼容老IE
parent.attachEvent('on' + type, handle)
}
function eventFn(e) {
const event = e || window.event;
const target = event.target || event.srcElement;// 兼容老IE
if (matchSelector(target, selector)) {
if (handle) {
handle.call(target, e); // 让handle执行时的this指向target
}
}
}
}

效果:

           

手写事件代理函数 (Delegated function)的更多相关文章

  1. 依据ECMA规范,手写一个bind函数

    Function.prototype.bind 函数,参见ECMA规范地址 如题,这次来实现一个boundFunction函数,不挂载在Function.prototype上,而是一个单独声明的函数. ...

  2. 手写简化版printf函数

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

  3. 前端面试手写代码——JS函数柯里化

    目录 1 什么是函数柯里化 2 柯里化的作用和特点 2.1 参数复用 2.2 提前返回 2.3 延迟执行 3 封装通用柯里化工具函数 4 总结和补充 1 什么是函数柯里化 在计算机科学中,柯里化(Cu ...

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

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

  5. cs224d 作业 problem set2 (一) 用tensorflow纯手写实现sofmax 函数,线性判别分析,命名实体识别

    Hi Dear Today we will use tensorflow to implement the softmax regression and linear classifier algor ...

  6. 手写map, filter函数

    function map(arr, fn) { let newArr = []; for (let i = 0; i < arr.length; i++) { newArr[i] = fn(ar ...

  7. 常见的JS手写函数汇总(代码注释、持续更新)

    最近在复习面试中常见的JS手写函数,顺便进行代码注释和总结,方便自己回顾也加深记,内容也会陆陆续续进行补充和改善. 一.手写深拷贝 <script> const obj1 = { name ...

  8. springmvc 动态代理 JDK实现与模拟JDK纯手写实现。

    首先明白 动态代理和静态代理的区别: 静态代理:①持有被代理类的引用  ② 代理类一开始就被加载到内存中了(非常重要) 动态代理:JDK中的动态代理中的代理类是动态生成的.并且生成的动态代理类为$Pr ...

  9. 22 道高频 JavaScript 手写面试题及答案

    实现防抖函数(debounce) 防抖函数原理:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时. 那么与节流函数的区别直接看这个动画实现即可. 手写简化版: // 防抖函数 cons ...

随机推荐

  1. Django1.8文档阅读手记

    主要集中在新特性上. Django1.8好像开始推荐使用python3 Django的QuerySet是延迟加载的,这个文档里面一般会明言,通过Connection SQL显示测试,外键对象也是延迟加 ...

  2. Redis linux 外部telnet访问不通

    外部访问不通: 1.修改redis.conf中的daemonize的值设为no: 2.修改redis.conf中的bind的值127.0.0.1为linux本身的ip地址,如192.168.1.120

  3. Effective C++ 读书笔记(46-50)

    条款四十六:需要类型转换时请为模板定义非成员函数 条款四十七:请使用traits classes 表现类型信息 1.整合重载技术后,traits classes 有可能在编译期对类型执行if...el ...

  4. Github发现优秀的开源项目

    先上个大logo,哈哈. github上有非常多的资源,我们可以在github上搜索到非常多的开源项目.那么如何使用github查找资源? 罗列出一下几种方式. 1.Explore 登录GitHub, ...

  5. The more,the better。

    贪婪是好的, 贪婪是对的, 贪婪是有用的, 贪婪是可以清理一切的, 贪婪是不断进化和进步的精华所在, 贪婪就是一切形式所在: 对于生活,对于爱情,对于知识我们一定要贪婪, 贪婪就是人们的动力. The ...

  6. Python3实现ICMP远控后门(中)之“嗅探”黑科技

    ICMP后门 前言 第一篇:Python3实现ICMP远控后门(上) 第二篇:Python3实现ICMP远控后门(上)_补充篇 在上两篇文章中,详细讲解了ICMP协议,同时实现了一个具备完整功能的pi ...

  7. .NET开发设计模式-单例模式

    解释:单例模式主要特点:确保一个类只有一个实例,并提供一个访问它的全局访问点 意思就是说:在多线程的情况下:A先进行创建了该实例.B再进来访问时就不需要再创建了. using System; usin ...

  8. python捕获异常、处理异常

    https://blog.csdn.net/jmilk/article/details/50047457

  9. C Primer Plus 第6章 C控制语句:循环 编程练习

    记录下写的最后几题. 14. #include <stdio.h> int main() { double value[8]; double value2[8]; int index; f ...

  10. sql优化总结

    在项目前期目标是确保功能能够正常运行,但是随着时间的推移,数据的增加,逻辑的复杂,导致数据查询会越来越慢,这个时候我们首先想到的应该就是尽量优化sql. sql优化常见注意点: 1.对查询进行优化,应 ...