如何针对事件流的 GUI 的特定对象
How does one target specific object of a gui for an event flow?
我正在开发一个javascript框架,用于使用基本的复合模式在带有嵌套精灵的html画布上创建简单的动画。
我一直在对杂乱和闪光(非常相似的结构)进行建模。"舞台"包含屏幕上的所有项目,即"显示对象"。这些可以聚合到"DisplayObjectContainer"中,该容器继承自"DisplayObject"。"Stage"本身也是一个"DisplayObjectContainer"。所有这些都继承自"事件调度程序"。
在过去的几天里,我花了大部分时间阅读这些系统的事件流程,并在各种开源项目中搜索示例。
据我了解,当调度事件时,它应该遵循一定的传播路径:它从舞台流入显示对象层次结构("捕获"阶段),直到到达该事件的"目标",然后"冒泡"返回显示层次结构。如果这还不够清楚,位于此处的图像应该有助于解释:
http://help.adobe.com/en_US/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7e4f.html
http://docs.clutter-project.org/docs/clutter/1.4/event-flow.png
这其中有一个方面我无法理解,我无法判断是只有我一个人,还是像我认为的那样不清楚:
假设我正在处理点击。我单击显示并使用浏览器的本机事件处理来检索单击的 x/y 坐标,然后将其向下发送到显示层次结构以确定我单击了哪个对象。
到目前为止,这是我代码中的"捕获"阶段。但这与文档完全不一致,该文档指出目标在进入事件流时应该已经附加到事件
。我真的应该遍历显示项的图表两次吗?
如能就此问题提供任何建议或专门知识,将不胜感激。
有趣的问题!是的,我相信您需要先遍历DisplayList
以计算事件target
,然后再开始事件流的capture
阶段。我从来没有设计过事件系统,对此并不完全确定,但也许当你计算target
对象时,你可以缓存分层路由并将其用作事件流的基础,而不是再次遍历DisplayList
。
我认为,如果您从实现的角度而不是从设计事件系统(以及现有事件系统的术语)的抽象角度来考虑它,那么您不清楚的一点会更加明显。想象一下,一个小部件由一个父对象和许多需要对鼠标点击做出反应的子项组成。您可能决定只侦听父对象上的事件,但根据事件源自的目标对象做出反应。在 ActionScript
中,如果您使用的是事件流的捕获阶段,则处理程序将在到达事件目标之前触发,但在这种情况下,目标是事件对象的基本属性。
正如评论中所建议的,可能值得查看 easeljs 的源代码,因为它声称提供了一个"Flash开发人员熟悉的"API。但是,请注意,出于性能原因,easeljs 当前不支持功能齐全的事件流(请参阅此处)。
我的两分钱;事件流很难理解(更不用说设计了),实现一个功能齐全的事件系统可能与你创建一个轻量级库的目标不一致。我建议您在此阶段保持简单,并且仅在发现需要时才添加事件bubbling
等功能。
- 引用对象中的通用值
- jQuery匹配JSON对象的部分文本
- 节点导出返回一个空对象
- 如何在Javascript中将JSon对象转换为数组
- 我可以在json对象中添加一个函数吗
- 使用JS将数组转换为json对象
- 全局变量和全局对象的属性之间有什么区别吗
- 比较从函数和生成的日期对象
- Javascript,访问一个主要对象模块模式中的每个对象
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 调整窗口大小时,可拖动的对象会出现在容器外部
- 如何针对事件流的 GUI 的特定对象
- 日期.从对象生成的GUI
- 三个js-dat-gui:更改来自OBJMTLLoader的对象的不透明度和可见性
- 更新dat.基于所选对象的GUI
- dat.当我更改对象时,GUI不会更新
- 动态添加数据.对象数组中的GUI元素
- 是否可以在没有任何对象的情况下使用Dat.gui添加滑块?
- js通过GUI打开和关闭对象可见性
- 用dat设置三个js中的一个对象的颜色.GUI选择颜色