OK. Thanks. I’m going to try and rework events sometime over the next few days and I hope to get rid of EventTarget, make it more PAYG and I’ll fix this too.
Stay tuned… Harbs > On Dec 26, 2019, at 7:56 PM, Josh Tynjala <[email protected]> wrote: > > I seem to recall recently being surprised to learn that you can capture an > event that doesn't bubble. > > I just tried in Flash, and I can confirm that a non-bubbling event can be > seen by a parent during the capture phase. > > var sprite:Sprite = new Sprite(); > var child:Sprite = new Sprite(); > sprite.addChild(child); > > sprite.addEventListener(Event.CHANGE, function(event:Event):void > { > trace("parent (capture):", event.eventPhase); > }, true); > > child.dispatchEvent(new Event(Event.CHANGE, false)); > > > > -- > Josh Tynjala > Bowler Hat LLC <https://bowlerhat.dev> > > > On Wed, Dec 25, 2019 at 2:25 AM Harbs <[email protected]> wrote: > >> Capture phase will only work if the event.bubbles is true. >> >> I think that’s correct behavior. Someone please correct me if I’m wrong. >> >>> On Dec 25, 2019, at 12:23 PM, [email protected] wrote: >>> >>> This is an automated email from the ASF dual-hosted git repository. >>> >>> harbs pushed a commit to branch develop >>> in repository https://gitbox.apache.org/repos/asf/royale-asjs.git >>> >>> >>> The following commit(s) were added to refs/heads/develop by this push: >>> new 2f8ef75 Fixed event bubbling >>> 2f8ef75 is described below >>> >>> commit 2f8ef759d700f439fa40cc2abf6aefbb04ab4bdb >>> Author: Harbs <[email protected]> >>> AuthorDate: Wed Dec 25 12:23:13 2019 +0200 >>> >>> Fixed event bubbling >>> --- >>> .../org/apache/royale/events/EventDispatcher.as | 72 >> ++++++---------------- >>> 1 file changed, 18 insertions(+), 54 deletions(-) >>> >>> diff --git >> a/frameworks/projects/Core/src/main/royale/org/apache/royale/events/EventDispatcher.as >> b/frameworks/projects/Core/src/main/royale/org/apache/royale/events/EventDispatcher.as >>> index 34871d5..510b531 100644 >>> --- >> a/frameworks/projects/Core/src/main/royale/org/apache/royale/events/EventDispatcher.as >>> +++ >> b/frameworks/projects/Core/src/main/royale/org/apache/royale/events/EventDispatcher.as >>> @@ -90,8 +90,23 @@ package org.apache.royale.events >>> //console.log("assigned target to >> event ",event); >>> } >>> } else return false; >>> + var ancestorsTree:Array = null; >>> + if(event1.bubbles) >>> + { >>> + var ancestor:Object = >> this.getParentEventTarget(); >>> + if (ancestor) { >>> + ancestorsTree = []; >>> + var ancestorCount:int = 1; >>> + for (; ancestor; ancestor = >> ancestor.getParentEventTarget()) { >>> + ancestorsTree.push(ancestor); >>> + // goog.asserts.assert( >>> + // (++ancestorCount < >> goog.events.EventTarget.MAX_ANCESTORS_), >>> + // 'infinite loop'); >>> + } >>> + } >>> + } >>> >>> - return super.dispatchEvent(event1); >>> + return >> goog.events.EventTarget.dispatchEventInternal_(_dispatcher, event1, >> ancestorsTree); >>> } >>> /** >>> * @royaleignorecoercion org.apache.royale.core.IChild >>> @@ -129,59 +144,8 @@ package org.apache.royale.events >>> } >>> >>> public function toString():String >>> - { >>> - return "[object Object]"; >>> - } >>> - private static function installOverride():Boolean{ >>> - goog.events.EventTarget.dispatchEventInternal_ = >> dispatchEventInternal; >>> - return true; >>> + { >>> + return "[object Object]"; >>> } >>> - private static var overrideInstalled:Boolean = >> installOverride(); >>> - /** >>> - * Dispatches the given event on the ancestorsTree. >>> - * >>> - * @param {!Object} target The target to dispatch on. >>> - * @param {goog.events.Event|Object|string} e The event object. >>> - * @param {Array<goog.events.Listenable>=} opt_ancestorsTree The >> ancestors >>> - * tree of the target, in reverse order from the closest ancestor >>> - * to the root event target. May be null if the target has no >> ancestor. >>> - * @return {boolean} If anyone called preventDefault on the event >> object (or >>> - * if any of the listeners returns false) this will also return >> false. >>> - * @private >>> - */ >>> -private static function dispatchEventInternal(target:EventDispatcher, >> e:org.apache.royale.events.Event, opt_ancestorsTree:Array):Boolean { >>> - /** @suppress {missingProperties} */ >>> - var type:String = e.type; >>> - >>> - var rv:Boolean = true, currentTarget:Object; >>> - >>> - // Executes all capture listeners on the ancestors, if any. >>> - if (opt_ancestorsTree) { >>> - for (var i:int = opt_ancestorsTree.length - 1; >> !e.propagationStopped_ && i >= 0; >>> - i--) { >>> - currentTarget = e.currentTarget = opt_ancestorsTree[i]; >>> - rv = currentTarget.fireListeners(type, true, e) && rv; >>> - } >>> - } >>> - >>> - // Executes capture and bubble listeners on the target. >>> - if (!e.propagationStopped_) { >>> - currentTarget = e.currentTarget = target; >>> - rv = currentTarget.fireListeners(type, true, e) && rv; >>> - if (!e.propagationStopped_) { >>> - rv = currentTarget.fireListeners(type, false, e) && rv; >>> - } >>> - } >>> - >>> - // Executes all bubble listeners on the ancestors, if any. >>> - if (opt_ancestorsTree && e.bubbles) { >>> - for (i = 0; !e.propagationStopped_ && i < opt_ancestorsTree.length; >> i++) { >>> - currentTarget = e.currentTarget = opt_ancestorsTree[i]; >>> - rv = currentTarget.fireListeners(type, false, e) && rv; >>> - } >>> - } >>> - >>> - return rv; >>> -}; >>> } >>> } >>> >> >>
