博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
手写事件代理函数 (Delegated function)
阅读量:4921 次
发布时间:2019-06-11

本文共 1845 字,大约阅读时间需要 6 分钟。

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

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

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

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

parent: 事件绑定的父级

selector: 选择器,

type:  事件类型

handle: 事件处理函数

 

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

    它是通过事件冒泡机制,

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

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

 

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

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

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

 

我们来写个小demo

HTML:

  • 1
  • 2
  • 3

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            }        }    }}

 

 效果:

 

 

 

           

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

你可能感兴趣的文章
Delphi 的内存操作函数(2): 给数组指针分配内存
查看>>
三款SDR平台对比:HackRF,bladeRF和USRP
查看>>
通过js获得html标签的值
查看>>
Sqoop 1.4.7安装与配置
查看>>
浅谈数据库资源使用的按需分配方法
查看>>
linux运维面试题1
查看>>
fabric网关模式文件上传与执行
查看>>
转:一千行 MySQL 学习笔记
查看>>
hadoop控制map个数(转)
查看>>
SVProgressHUD 用法
查看>>
【BZOJ】【1046】/【POJ】【3613】【USACO 2007 Nov】Cow Relays 奶牛接力跑
查看>>
Django表单
查看>>
ini 文件操作记要(2): 使用 TMemIniFile
查看>>
(第3篇)HDFS是什么?HDFS适合做什么?我们应该怎样操作HDFS系统?
查看>>
隐藏 DataGrid 中 DataSource 为 DataTable 的 DataColumn (Visual C#)
查看>>
【译 】Solr in Action 第一章
查看>>
计算几何初步模板
查看>>
POJ 数据结构(2)
查看>>
HDU 3869 Color the Simple Cycle (Polya计数法)
查看>>
String字符串常用方法
查看>>