event-custom-complex-debug.js revision d6c79e40fdf7212ce31b58d0b4805875e3242778
0fdefaa9ca017edfb76b736c825b34186f33045aTripp * Adds event facades, preventable default behavior, and bubbling.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @module event-custom
a75ebc38c1de401b679953a9b87bd323f0f48d02Tripp * @submodule event-custom-complex
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Wraps and protects a custom event for use when emitFacade is set to true.
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Requires the event-custom-complex module
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @class EventFacade
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @param e {Event} the custom event
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @param currentTarget {HTMLElement} the element the listener was attached to
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * The arguments passed to fire
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @property details
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @type Array
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * The event type, this can be overridden by the fire() payload
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @property type
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @type string
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * The real event type
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @property type
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @type string
a89ad754cce3cfc8aee71760e10217b54020360dTripp //////////////////////////////////////////////////////
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Node reference for the targeted eventtarget
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @propery target
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @type Node
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Node reference for the element that the listener was attached to.
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @propery currentTarget
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @type Node
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Node reference to the relatedTarget
c093c1aed867e18aa4778708592e1ceb45d18cffTripp * @propery relatedTarget
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @type Node
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Stops the propagation to the next bubble target
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @method stopPropagation
a89ad754cce3cfc8aee71760e10217b54020360dTripp stopPropagation: function() {
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Stops the propagation to the next bubble target and
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * prevents any additional listeners from being exectued
a89ad754cce3cfc8aee71760e10217b54020360dTripp * on the current target.
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @method stopImmediatePropagation
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * Prevents the event's default behavior
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @method preventDefault
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp preventDefault: function() {
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Stops the event propagation and prevents the default
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * event behavior.
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @method halt
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @param immediate {boolean} if true additional listeners
a89ad754cce3cfc8aee71760e10217b54020360dTripp * on the current target will not be executed
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp var es, ef, q, queue, ce, ret, events, subs, postponed,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self = this, host = self.host || self, next, oldbubble;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // queue this event if the current item in the queue bubbles
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (self.queuable && self.type != self.stack.next.type) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp return true;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // id of the first event in the stack
bf801d6851ecf7ed14742ef3639a077daecb5cf8Tripp // defaultFnQueue: new Y.Queue(),
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self.stopped = (self.type !== es.type) ? 0 : es.stopped;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self.prevented = (self.type !== es.type) ? 0 : es.prevented;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self.details = args.slice(); // original arguments in the details
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // self.log("Firing " + self + ", " + "args: " + args);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self._facade = null; // kill facade to eliminate stale properties
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // if (subCount) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // self._procSubs(Y.merge(self.subscribers), args, ef);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // bubble if this is hosted in an event target and propagation has not been stopped
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // self.bubbling = true;
a89ad754cce3cfc8aee71760e10217b54020360dTripp // if (host !== ef.target || es.type != self.type) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self.prevented = Math.max(self.prevented, es.prevented);
c093c1aed867e18aa4778708592e1ceb45d18cffTripp // self.bubbling = false;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ((!self.defaultTargetOnly && !es.defaultTargetOnly) || host === ef.target)) {
c093c1aed867e18aa4778708592e1ceb45d18cffTripp // broadcast listeners are fired as discreet events on the
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp // YUI instance and potentially the YUI global.
7947db4b7d8682ea81598e3a4283e659a8103be6Tripp // Queue the after
7947db4b7d8682ea81598e3a4283e659a8103be6Tripp if (es.id === self.id || self.type != host._yuievt.bubbling) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // set up stack to allow the next item to be processed
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp // if the first argument is an object literal, apply the
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // properties to the event facade
a89ad754cce3cfc8aee71760e10217b54020360dTripp // protect the event facade properties
a89ad754cce3cfc8aee71760e10217b54020360dTripp // mix the data
a89ad754cce3cfc8aee71760e10217b54020360dTripp // restore ef
a89ad754cce3cfc8aee71760e10217b54020360dTripp // Allow the event type to be faked
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // update the details field with the arguments
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // ef.type = this.type;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // use the original target when the event bubbled to this target
a89ad754cce3cfc8aee71760e10217b54020360dTripp return this._facade;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * Stop propagation to bubble targets
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @for CustomEvent
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @method stopPropagation
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if (this.stack) {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Stops propagation to bubble targets, and prevents any remaining
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * subscribers on the current target from executing.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method stopImmediatePropagation
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if (this.stack) {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Prevents the execution of this event's defaultFn
b57ff76ab2ce5f3017d61855f13ed04ab46a965cTripp * @method preventDefault
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if (this.stack) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * Stops the event propagation and prevents the default
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * event behavior.
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @method halt
b57ff76ab2ce5f3017d61855f13ed04ab46a965cTripp * @param immediate {boolean} if true additional listeners
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * on the current target will not be executed
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * Registers another EventTarget as a bubble target. Bubble order
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * is determined by the order registered. Multiple targets can
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * be specified.
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * Events can only bubble if emitFacade is true.
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Included in the event-custom-complex submodule.
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @method addTarget
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @param o {EventTarget} the target to add
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @for EventTarget
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Returns an array of bubble targets for this object.
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @method getTargets
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @return EventTarget[]
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * Removes a bubble target
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @method removeTarget
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @param o {EventTarget} the target to remove
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @for EventTarget
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Propagate an event. Requires the event-custom-complex module.
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @method bubble
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @param evt {CustomEvent} the custom event to propagate
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @return {boolean} the aggregated return value from Event.Custom.fire
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @for EventTarget
a89ad754cce3cfc8aee71760e10217b54020360dTripp originalTarget = target || (evt && evt.target) || this,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // Y.log('Bubbling ' + evt.type);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp for (i in targs) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // if this event was not published on the bubble target,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // continue propagating the event.
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // set the original target to that the target payload on the
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // facade is correct.
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // default publish may not have emitFacade true -- that
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // shouldn't be what the implementer meant to do
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ret = ret && ce.fire.apply(ce, args || evt.details || []);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // stopPropagation() was called