最近刚好在学js的事件机制,写这个是看到这篇文章提到了一个腾讯的面试题。我先把文章的代码稍作改动贴在这里。

<body><div id="outer" style="width:100%; height:200px; background-color: cornflowerblue;"><div style="width:200px; height: 150px; background-color: pink;" id='middle'><div style="width:100px; height: 100px; background-color: yellowgreen;" id="inner"></div></div></div><script>function delegateEvent(interfaceEle, selector, type, fn) {if(interfaceEle.addEventListener) {interfaceEle.addEventListener(type, eventfn, false);} else {interfaceEle.attachEvent("on" + type, eventfn);}function eventfn(e) {var e = e || window.event;var target = e.target || e.srcElement;if(matchSelector(target, selector)) {if(fn) {fn.call(target, e);}}}}function matchSelector(ele, selector) {// if use idif(selector.charAt(0) === "#") {return ele.id === selector.slice(1);}// if use classif(selector.charAt(0) === ".") {return(" " + ele.className + " ").indexOf(" " + selector.slice(1) + " ") != -1;}// if use tagNamereturn ele.tagName.toLowerCase() === selector.toLowerCase();}//调用var outer = document.getElementById("outer");var middle = document.getElementById("middle");delegateEvent(outer, "#middle", "click", function() {console.log('test');})</script></body>作者:一只dororo
链接:https://www.jianshu.com/p/7ea01a3beb7a
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

显示效果如图:

但是这段代码有一个小问题:用鼠标点击绿色方块,不会输出‘test’,这仿佛违背了我们希望事件冒泡的初衷。
这是由于在绑定的时候,很关键的一个地方在eventfn函数,它限制了只有当target就是selector匹配的元素时,才会调用handler。
而事实上我们在调用这个函数的时候,target是selector匹配到的元素的子节点也可以。
在这里介绍一个新的api,parent.contains(node),他返回一个布尔值,判断node是不是parent节点的后代或parent本身。
因此我们修改代码为:

function delegateEvent(interfaceEle, selector, type, fn) {if(interfaceEle.addEventListener) {interfaceEle.addEventListener(type, eventfn, false);} else {interfaceEle.attachEvent("on" + type, eventfn);}function eventfn(e) {var $selector = document.querySelector(selector);var e = e || window.event;var target = e.target || e.srcElement;if(contain($selector, target)) {if(fn) {fn.call(target, e);}}}
}function contain(parent, node) {if (parent.contains) {return parent.contains(node)} else { //兼容不支持contains方法的浏览器while (node) {if (node === parentNode) {return true;} else {node = node.parentNode;}}return false;}
}

现在再点击绿色方块也可以打印'test'啦。

前端面试js-手写事件委托(一点小改进)相关推荐

  1. 前端面试高频手写代码题

    前端面试高频手写代码题 一.实现一个解析URL参数的方法 方法一:String和Array的相关API 方法二: Web API 提供的 URL 方法三:正则表达式+string.replace方法 ...

  2. 前端面试:手写代码JS实现字符串反转

    前端萌新面试:手写代码JS实现字符串反转 前言 因为做前年小红书的前端校招面试题,发现出现好几道关于字符串对象和数组对象的题目,说难不难,但突然要写的话一时想不起来,这不想着做个小总结. 首先明白字符 ...

  3. 前端面试高频手写题目

    高频手写题目 面试高频手写题目 1 实现防抖函数(debounce) 防抖函数原理:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时 手写简化版: // func是用户传入需要防抖的函 ...

  4. 前端面试之手写代码篇

    手写代码 1.手写instanceof方法 2.手写new操作符 3.手写Promise.all() 4.手写防抖函数 5.手写节流函数 6.手写call.apply函数 7.手写bind函数 8.封 ...

  5. 2020年前端面试之JS手写代码题合集

    2020年前端面试之JS手写代码题合集 预计会有上千道题,后续慢慢补! 1.  写一个把字符串大小写切换的方法 function caseConvert(str){return str.replace ...

  6. 前端面试 - JS总结(1) - 基础 (数据类型, 事件与函数, 原型链)

    你不走出舒适圈,又怎么知道自己多坚强?! 前端面试 - JS总结(1) - 基础 (数据类型, 事件与函数, 原型链) 前端面试 - JS总结(2) - ES6 (let, 箭头函数, this) 前 ...

  7. 2021年的几次面试让我死磕了17道JS手写题!

    1.浅拷贝.深拷贝的实现 浅拷贝 // 1. ...实现 let copy1 = {...{x:1}}// 2. Object.assign实现 let copy2 = Object.assign({ ...

  8. 【面试】970- 一文帮你搞定90%的JS手写题

    还在害怕手写题吗,本文可以帮你扩展并巩固自己的JS基础,顺便搞定90%的手写题.在工作中还可以对常用的需求进行手写实现,比如深拷贝.防抖节流等可以直接用于往后的项目中,提高项目开发效率.不说废话了,下 ...

  9. JS 面试问题: 手写 new

    JS 面试问题: 手写 new

  10. 用 Node.js 手写一个 DNS 服务器

    DNS 是实现域名到 IP 转换的网络协议,当访问网页的时候,浏览器首先会通过 DNS 协议把域名转换为 IP,然后再向这个 IP 发送 HTTP 请求. DNS 是我们整天在用的协议,不知道大家是否 ...

最新文章

  1. (0007) iOS 开发之Xcode8上传AppStore遇到的TencentOpenApi_IOS_Bundle.bundle
  2. 垃圾邮件分类实战(SVM)
  3. 1、【设计模式】组合模式
  4. 一行代码搞定 FTP 服务
  5. 使用线程——创建线程
  6. python的内置函数string_Python错误:内置函数或方法对象没有属性“StringIO”
  7. 不被大神Hinton认同,否定现有同行成果,谷歌这篇烧脑研究最终拿下ICML2019最佳论文...
  8. Java 日期格式化规则
  9. Session简单使用
  10. x,y,w,h与xmin,ymin,xmax,ymax的关系
  11. Spark 高难度对话 SQL Server - 续篇
  12. CodeForces - 1467C(枚举,思维)
  13. 英语六级高频词汇速记 + 2019-6-2听力 Day06
  14. L1正则化、L2正则化的多角度分析和概率角度的解释
  15. spring data redis 配置
  16. 三种基于自监督深度估计的语义分割方法(arXiv 2021)
  17. tomcat 服务器访问日志配置方法
  18. 黑马入门教程笔记01-OC
  19. 引起短波通讯服务器终端,短波通信终端设备
  20. querylist 入门query部署,获取网页的信息。

热门文章

  1. HBase集群环境部署
  2. thinkPHP的Excel插件
  3. protel中PCB板大小的自定义方法
  4. 提问:Server Application Unavailable
  5. 【Linux】Linux的关机和虚拟机克隆、快照
  6. 动态规划算法实验报告_搞懂这几点,动态规划算法就是那么简单
  7. 服务器内部错误_阿里云服务器被CC攻击怎么办
  8. base | 数值运算符和逻辑运算符
  9. 软硬交互代码示例_HarmonyOS应用开发-元程序交互
  10. python毕业设计总结范文大全_毕业设计心得体会范文【优秀】