手写事件代理函数 (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 ...
随机推荐
- Install OpenCV on Ubuntu or Debian
http://milq.github.io/install-OpenCV-ubuntu-debian/转注:就用第一个方法吧,第二个方法的那个sh文件执行失败,因为我价格kurento.org的源,在 ...
- jenkins构建基于gradle的springboot项目CI采坑(采用jar方式部署)
试了一堆插件,最后用的还是 publish over SSH jenkins基本配置不多说了,就是配置一下git仓储,配置一下gradle执行命令 clean bootRepackage 之后执行Se ...
- 关于HTTP请求、Ajax请求,请求的同步和异步
使用了很长时间的Ajax请求了,一直都是在以异步的方式在使用.昨天听了一个讲座涉及到apache server,偶然想到了这Ajax请求和HTTP请求的一些区别和联系,就在网上好好搜了一顿,把搜到的结 ...
- 部署Dubbo监控中心
1.部署监控中心: [root@localhost ~]# cp dubbo-admin-2.5.4.war apache-tomcat-7.0.47/webapps/dubbo-admin.war ...
- Python_NAT
sockMiddle_server.py import sys import socket import threading #回复消息,原样返回 def replyMessage(conn): wh ...
- spring事务机制
一.Java动态代理 1.定义 Java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 默认情况下会采用JDK的动态代理实现AOP . 2. ...
- mysql导入数据中文乱码_ubuntu
1.在ubuntu中mysql的部分编码格式不是utf-8,故在导文件的时候会出现中文乱码,Windows中编码格式为gbk,因此要修改mysql的编码方式为utf-8. 2.查看MySQL编码格式: ...
- Elasticsearch: 权威指南 » 深入搜索 » 多字段搜索 » 多数字段 good
跨字段实体搜索 » 多数字段编辑 全文搜索被称作是 召回率(Recall) 与 精确率(Precision) 的战场: 召回率 ——返回所有的相关文档:精确率 ——不返回无关文档.目的是在结果的 ...
- Reactor模式的.net版本简单实现--DEMO
近期在学习DotNetty,遇到不少的问题.由于dotnetty是次netty的.net版本的实现.导致在网上叙述dotnetty的原理,以及实现技巧方面的东西较少,这还是十分恼人的.在此建议学习和使 ...
- tkiner中Radiobutton单选框控件(七)
Radiobutton控件 由于本次内容中好多知识都是之前重复解释过的,本次就不做解释了.不太清楚的内容请参考tkinter1-6节中的内容 import tkinter wuya = tkinter ...