【问题标题】:How flash dispatchEvent really works?flash dispatchEvent 是如何工作的?
【发布时间】:2011-02-13 00:12:56
【问题描述】:

docs 中提到,EventDispatcher 的 dispatchEvent “...将事件分派到事件流中”。这句话很好看,并没有真正解释什么。

假设,我们有两个侦听器在等待对象“a”上的事件“A”,那么我们在调用时必须期待什么行为:

a.dispatchEvent("A")?

在从 distpatchEvent 返回之前是否会立即调用两个侦听器?或者它们会在一些内部 Flash 播放器队列中排队,并通过进入下一帧进行处理?我们可以在这里依赖 Flash 播放器的某些已定义行为还是未定义行为?应该如何阅读“将事件发送到事件流”?这个问题很重要,因为在实践中它会影响代码的控制流。

【问题讨论】:

    标签: events flash dispatchevent


    【解决方案1】:

    这完全取决于您的显示列表层次结构。

    Flash 的事件结构基于其internal event model

    1. 舞台将是第一个对象 通知,然后事件将 向下滴流显示列表,直到 它达到了它的目标。这个阶段是 称为捕获阶段。要启用它,请将useCapture 设置为 true 在事件监听器上。请注意 这样做是没有意义的,除非 监听的对象是 以事件为目标的对象。这 称为事件拦截

    2. 下一阶段是目标 阶段。这是最常见的行为 众所周知的事件。这 目标显示对象(一个 有一个事件监听器)将 接收事件并执行 监听器中的代码。

    3. 最后阶段称为 冒泡阶段。这是事件在显示列表中冒泡的时候 收到事件之后。事件冒泡对于 调度自定义事件,正如你将 需要知道如何倾听 由对象调度的事件 孩子们。

    在调度事件时,我一般使用这种语法(Event.CHANGE 只是一个常见的例子):

    Object.dispatchEvent(new Event("CHANGE", true, false));

    Object 是您从中调度的对象。第一个参数是您要调度的事件。第二个是bubbles 参数。最后是cancelable 属性。 Event.cancelable 用于防止通过Event.preventDefault() 进行事件的默认操作(即鼠标单击)。

    参考:

    【讨论】:

      【解决方案2】:

      只需使用信号代替:P

      https://github.com/robertpenner/as3-signals/wiki

      不,但实际上,它们非常易于使用和理解,是对 AS3 工具箱的一个很好的补充。

      您还可以通过阅读 Rob Penner 的评论(向下滚动到 wiki 页面底部)了解很多关于原生 AS3 事件的工作原理

      【讨论】:

        猜你喜欢
        • 2014-07-09
        • 2012-12-12
        • 1970-01-01
        • 2013-06-06
        • 2022-01-01
        • 2014-07-17
        • 1970-01-01
        • 2012-11-24
        • 2018-07-31
        相关资源
        最近更新 更多