你真的了解Canvas吗--解密七【ZRender篇】

embedded/2024/10/18 22:34:04/

书接上文你真的了解Canvas吗--解密六【ZRender篇】

目录

❓解惑环节

再次梳理流程 

step - 1

step - 2 

step - 3 

step - 4

冒泡函数dispatchToElement

总结


❓解惑环节

首先来回答一下

先来看看目前调用on函数的地方

Eventful的属性_$handlers的key就有'click', 'dbclick', 'mousewheel', 'mouseout',
'mouseup', 'mousedown', 'mousemove', 'contextmenu'
Eventful的属性_$handlers的key只有'click'
再次梳理流程 

我们点击图形的时候是通过addEventListener监听到我们的事件,流程为

  • step - 1
HandlerProxy.js

addEventListener将所有的事件都进行了监听,上一篇也提到了分为3大块mouse、touch和pointer

  • step - 2 
HandlerProxy.js

回调函数的触发,执行trigger函数,this为HandlerProxy。所以答案出来了我们拿到的Eventful的属性_$handlers的key值为'click', 'dbclick', 'mousewheel', 'mouseout','mouseup', 'mousedown', 'mousemove', 'contextmenu'。截个图

  • step - 3 
Eventful.js

极简版trigger函数,也是因为_$handlers存在才能走到这。接下来就走Handler里面的click

  • step - 4
Handler.js

到这里,一步步的事件监听捕获算是结束了,下一步就是冒泡函数 

冒泡函数dispatchToElement

Handler.js

 显而易见三点

  1. 通过while循环实现冒泡的机制
  2. 通过el = el.parent循环往上查找父视图
  3. 通过外部属性cancelBubble控制循环是否break

其实冒泡的原理不就是这样吗,需要一个循环体一层层往父视图遍历,当不需要冒泡了外部设置一个属性将循环体打破即可!!!

总结

最终打印的结果如下图

这篇文章主要是解答上一篇文章遗留下来的问题、顺带又梳理了一遍ZRender里面事件捕获的流程以及最后的事件冒泡函数的实现原理。大家有什么不懂的可以和我留言哦!

留个思考的问题,如果是下面的code,又会是怎样的输出呢?

javascript">circle.on("click", function (e) {console.log("Circle");
});
g1.on("click", function (e) {console.log("Group 1");
});
g3.on("click", function (e) {console.log("Group 3");
});
g4.on("click", function (e) {console.log("Group 4");
});

如果觉得有收获,麻烦给个赞和关注。你的鼓励是我写作的动力,大家一起学习一起进步。


http://www.ppmy.cn/embedded/126321.html

相关文章

Golang 垃圾回收机制

垃圾回收机制 垃圾回收是程序语言自行管理内存的一种机制,它的主要原理是检测哪些内存块已经不再被使用的情况,然后回收这些内存块,以供后续程序使用. GC和手动释放内存的比较 GC的优势在于不需要程序员在编写程序时关心内存分配问题,只需专注于程序的编写即可,而手动释放内…

K210(openMV)与STM32 通信教程

目录 前言: 一、K210 串口部分教程 二、STM32部分 前言: 很多打比赛的同学,通常只是用K210 或者openMV来进行视觉部分的信息采集,传输数据给STM32(或者其他主控那边)进行对分析,对小车或者舵…

【操作系统】引导(Boot)电脑的奇妙开机过程

🌹😊🌹博客主页:【Hello_shuoCSDN博客】 ✨操作系统详见 【操作系统专项】 ✨C语言知识详见:【C语言专项】 目录 什么是操作系统的引导? 操作系统的引导(开机过程) Windows操作系…

什么是CSV?超详细+通俗易懂版!!

CSV,全称为Comma-Separated Values(逗号分隔值),是一种常用的文本文件格式,用于存储表格数据,如电子表格或数据库。CSV文件由一行或多行文本组成,每行文本包含由逗号分隔的一个或多个字段。这些…

设计模式--swift单例模式

单例模式(Singleton Pattern)是一种设计模式,确保一个类只有一个实例,并且提供一个全局访问点。 可以想象成有很多个相同的门,打开后都通往一个房间。 iOS中的单例模式: UIApplication.shard:…

JavaEE: 深入解析HTTP协议的奥秘(3)

文章目录 HTTP认识 "报头"(Header)认识 "状态码"(status code) HTTP JavaEE: 深入解析HTTP协议的奥秘(2) 书接上文~ 认识 “报头”(Header) Header 的整体的格式是"键值对"结构. 每个键值对占一行,键和值之间使用分号分隔. Host 表示服务器主…

算法:974.和可以被K整除的子数组

题目 链接:leetcode链接 思路分析(前缀和 同余定理) 首先,我们要了解一下什么是同余定理 同余定理: 如果(a - b)/ p k …… 0 则 a % p b % p 证明我写在草稿纸上,如下图: 初…

appium中的uiautomatorviewer显示的界面为横屏解决方法

uiautomatorviewer显示的界面为横屏解决方法 解决方法: 修改模拟器的分辨率,比如540:900就可解决了