博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js事件委托总结
阅读量:6415 次
发布时间:2019-06-23

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

补充一直没写的总结?当简单回顾咯

DOM事件流

DOM事件流包括三个阶段:事件捕获阶段,处于目标阶段与事件冒泡阶段

clipboard.png

即比如点击td元素时,由外至内层会经历捕获阶段,目标阶段,冒泡阶段三个阶段,相应地会触发路径元素上的事件

此外,addEventListener(type, listener[, useCapture])函数默认设置在冒泡阶段,路径元素的事件才会触发,此参数为可选值,默认值为false,示例代码一并标出
示例代码:

grandFather

father1

son1

father2

点击son1 div时,会冒泡触发father1与grandFather事件

clipboard.png

若将grandFather的use capture参数改为true,则会相应改变执行顺序

grandFather.addEventListener('click', function(event){console.log('I am grandFather')},true);

clipboard.png

以上是事件流的简单总结,下面事件委托是对事件冒泡的应用

事件委托

如果在需要有多个DOM事件需要监听的情况下(比如几百条微博点击事件注册),给每一个DOM都绑定监听函数,对性能会有极大的影响,因此,有一解决方案为事件委托。

事件委托利用了事件冒泡event.target

event.currentTarget与event.target

currentTarget:表示此事件绑定的元素

target:通俗理解为表示触发一系列事件的源头
我们再次修改grandFather的监听函数

grandFather.addEventListener('click', function(event){    console.log('I am grandFather!!!')    console.log('currentTarget:');    console.log(event.currentTarget);     console.log('target:');    console.log(event.target);},false); //这里已改回false

再次点击son1,进入grandFather的监听函数后显示如下

clipboard.png

事件委托具体步骤

了解冒泡与target后,不难可以想到若是在几百个dom监听之中,只需把监听函数绑定在父容器上即可,这里依旧拿这个简单的例子修改,我们要做的是点击某个div便显示打印'I am xxx'

首先,给div都绑定自定义的data-name属性

grandFather

father1

son1

father2

接着改写grandFather的监听函数

grandFather.addEventListener('click', function(event){            console.log('I am ' + event.target.getAttribute('data-name'));        },false);        //这些可以注释掉了!        // father1.addEventListener('click', function(event){console.log('I am father1')},false);        // son1.addEventListener('click', function(event){console.log('I am son1')},false);        // father2.addEventListener('click', function(event){console.log('I am father2')},false);

这样子就是一个简单的委托,更多的应用可以结合switch等等

参考资料

《Javascript高级程序设计》

转载地址:http://cwcra.baihongyu.com/

你可能感兴趣的文章
java随机范围内的日期
查看>>
spring事务学习(转账案例)(二)
查看>>
[官方教程] [ES4封装教程]1.使用 VMware Player 创建适合封装的虚拟机
查看>>
http协议与http代理
查看>>
【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例...
查看>>
Redis+Spring缓存实例
查看>>
Storm集群安装详解
查看>>
centos7.x搭建svn server
查看>>
原码编译安装openssh6.7p1
查看>>
项目实战:自定义监控项--监控CPU信息
查看>>
easyui-datetimebox设置默认时分秒00:00:00
查看>>
蚂蚁分类信息系统5.8多城市UTF8开源优化版
查看>>
在django1.2+python2.7环境中使用send_mail发送邮件
查看>>
“Metro”,移动设备视觉语言的新新人类
查看>>
PHP源代码下载(本代码供初学者使用)
查看>>
Disruptor-NET和内存栅栏
查看>>
Windows平台ipod touch/iphone等共享笔记本无线上网设置大全
查看>>
播放加密DVD
查看>>
产品设计体会(3013)项目的“敏捷沟通”实践
查看>>
RHEL6.3基本网络配置(1)ifconfig命令
查看>>