手写事件代理函数 (Delegated function)
‘手写 ’ 这个词 ,面试是不是听过无数遍呢 !
今天我们来手写一个这样的事件委托函数 =》
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)的更多相关文章
- 依据ECMA规范,手写一个bind函数
Function.prototype.bind 函数,参见ECMA规范地址 如题,这次来实现一个boundFunction函数,不挂载在Function.prototype上,而是一个单独声明的函数. ...
- 手写简化版printf函数
2019.02.01更新:经同学提醒,myprintf函数应有返回值为输出的字符数. 期末的大作业,手写一个myprintf函数,支持如下一些操作. 也就是 % -(负号控制左右对齐) 数(控制字段 ...
- 前端面试手写代码——JS函数柯里化
目录 1 什么是函数柯里化 2 柯里化的作用和特点 2.1 参数复用 2.2 提前返回 2.3 延迟执行 3 封装通用柯里化工具函数 4 总结和补充 1 什么是函数柯里化 在计算机科学中,柯里化(Cu ...
- 【OpenCV学习笔记】之六 手写图像旋转函数---万丈高楼平地起
话说,平凡之处显真格,这一点也没错! 比如,对旋转图像进行双线性插值,很简单吧? 可,对我,折腾了大半天,也没有达到预期效果! 尤其是三个误区让我抓瞎好久: 1,坐标旋转公式. 这东西,要用 ...
- cs224d 作业 problem set2 (一) 用tensorflow纯手写实现sofmax 函数,线性判别分析,命名实体识别
Hi Dear Today we will use tensorflow to implement the softmax regression and linear classifier algor ...
- 手写map, filter函数
function map(arr, fn) { let newArr = []; for (let i = 0; i < arr.length; i++) { newArr[i] = fn(ar ...
- 常见的JS手写函数汇总(代码注释、持续更新)
最近在复习面试中常见的JS手写函数,顺便进行代码注释和总结,方便自己回顾也加深记,内容也会陆陆续续进行补充和改善. 一.手写深拷贝 <script> const obj1 = { name ...
- springmvc 动态代理 JDK实现与模拟JDK纯手写实现。
首先明白 动态代理和静态代理的区别: 静态代理:①持有被代理类的引用 ② 代理类一开始就被加载到内存中了(非常重要) 动态代理:JDK中的动态代理中的代理类是动态生成的.并且生成的动态代理类为$Pr ...
- 22 道高频 JavaScript 手写面试题及答案
实现防抖函数(debounce) 防抖函数原理:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时. 那么与节流函数的区别直接看这个动画实现即可. 手写简化版: // 防抖函数 cons ...
随机推荐
- Kotlin : Retrofit + RxAndroid + Realm
https://jqs7.com/kotlin-retrofit-rxandroid-realm/ 原作者:Ahmed Rizwan 原文链接:Kotlin : Retrofit + RxAndroi ...
- linux定时清理数据库过期记录
cron服务是Linux的内置服务,但它不会开机自动启动.可以用以下命令启动和停止服务: /sbin/service crond start//没打开的话首先要打开. /sbin/service cr ...
- Java基础知识总结【转+整合】
写代码: 1.明确需求.自己要做什么? 2.分析思路.怎么做? 3.确定步骤.每个思路部分用到哪些语句,方法和对象. 4.代码实现.用具体的java语言代码把思路体现出来. 学习新技术的四点: 1,该 ...
- DevOps之一 Gitlab的安装与配置
gitlab的安装 参考治疗:https://www.gitlab.com.cn/installation/#centos-7 http://www.21yunwei.com/archives/435 ...
- 理解Python中的类对象、实例对象、属性、方法
class Animal(object): # 类对象 age = 0 # 公有类属性 __like = None # 私有类属性 def __init__(self): # 魔法方法 self.na ...
- python爬虫入门(一)urllib和urllib2
爬虫简介 什么是爬虫? 爬虫:就是抓取网页数据的程序. HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的 ...
- java(二、基础语法和基本数据类型)
Java 基础语法 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一 ...
- CentOS在线安装RabbitMQ3.7
一.通过yum命令在线安装RabbitMQ yum在线安装,简单.快捷.自动安装相关依赖包. 1.安装Erlang环境(RabbitMQ由Erlang语言开发) 1.1)下载rpm安装包 官方地址:h ...
- Java NIO Channel to Channel Transfers通道传输接口
原文链接:http://tutorials.jenkov.com/java-nio/channel-to-channel-transfers.html 在Java NIO中如果一个channel是Fi ...
- capwap学习笔记——capwap的前世今生(转)
1 capwap的前世今生 1.1 胖AP.瘦AP.AC 传统的WLAN网络都是为企业或家庭内少量移动用户的接入而组建的.因此,只需要一个无线路由器就可以搞定了,就好像现在家用的无线路由器就是胖AP. ...