Mercurial > nebulaweb3
diff default/node_modules/shoestring/src/events/bind.js @ 0:1d038bc9b3d2 default tip
Up:default
author | Liny <dev@neowd.com> |
---|---|
date | Sat, 31 May 2025 09:21:51 +0800 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/default/node_modules/shoestring/src/events/bind.js Sat May 31 09:21:51 2025 +0800 @@ -0,0 +1,163 @@ +//>>excludeStart("exclude", pragmas.exclude); +define([ "shoestring", "dom/closest" ], function(){ +//>>excludeEnd("exclude"); + + function initEventCache( el, evt ) { + if ( !el.shoestringData ) { + el.shoestringData = {}; + } + if ( !el.shoestringData.events ) { + el.shoestringData.events = {}; + } + if ( !el.shoestringData.loop ) { + el.shoestringData.loop = {}; + } + if ( !el.shoestringData.events[ evt ] ) { + el.shoestringData.events[ evt ] = []; + } + } + + function addToEventCache( el, evt, eventInfo ) { + var obj = {}; + obj.isCustomEvent = eventInfo.isCustomEvent; + obj.callback = eventInfo.callfunc; + obj.originalCallback = eventInfo.originalCallback; + obj.namespace = eventInfo.namespace; + + el.shoestringData.events[ evt ].push( obj ); + + if( eventInfo.customEventLoop ) { + el.shoestringData.loop[ evt ] = eventInfo.customEventLoop; + } + } + + /** + * Bind a callback to an event for the currrent set of elements. + * + * @param {string} evt The event(s) to watch for. + * @param {object,function} data Data to be included with each event or the callback. + * @param {function} originalCallback Callback to be invoked when data is define.d. + * @return shoestring + * @this shoestring + */ + shoestring.fn.bind = function( evt, data, originalCallback ){ + + //>>includeStart("development", pragmas.development); + if( arguments.length > 3 ){ + shoestring.error( 'on-delegate' ); + } + if( typeof data === "string" ){ + shoestring.error( 'on-delegate' ); + } + //>>includeEnd("development"); + if( typeof data === "function" ){ + originalCallback = data; + data = null; + } + + var evts = evt.split( " " ); + + // NOTE the `triggeredElement` is purely for custom events from IE + function encasedCallback( e, namespace, triggeredElement ){ + var result; + + if( e._namespace && e._namespace !== namespace ) { + return; + } + + e.data = data; + e.namespace = e._namespace; + + var returnTrue = function(){ + return true; + }; + + e.isDefaultPrevented = function(){ + return false; + }; + + var originalPreventDefault = e.preventDefault; + var preventDefaultConstructor = function(){ + if( originalPreventDefault ) { + return function(){ + e.isDefaultPrevented = returnTrue; + originalPreventDefault.call(e); + }; + } else { + return function(){ + e.isDefaultPrevented = returnTrue; + e.returnValue = false; + }; + } + }; + + // thanks https://github.com/jonathantneal/EventListener + e.target = triggeredElement || e.target || e.srcElement; + e.preventDefault = preventDefaultConstructor(); + e.stopPropagation = e.stopPropagation || function () { + e.cancelBubble = true; + }; + + result = originalCallback.apply(this, [ e ].concat( e._args ) ); + + if( result === false ){ + e.preventDefault(); + e.stopPropagation(); + } + + return result; + } + + return this.each(function(){ + var domEventCallback, + customEventCallback, + customEventLoop, + oEl = this; + + for( var i = 0, il = evts.length; i < il; i++ ){ + var split = evts[ i ].split( "." ), + evt = split[ 0 ], + namespace = split.length > 0 ? split[ 1 ] : null; + + domEventCallback = function( originalEvent ) { + if( oEl.ssEventTrigger ) { + originalEvent._namespace = oEl.ssEventTrigger._namespace; + originalEvent._args = oEl.ssEventTrigger._args; + + oEl.ssEventTrigger = null; + } + return encasedCallback.call( oEl, originalEvent, namespace ); + }; + customEventCallback = null; + customEventLoop = null; + + initEventCache( this, evt ); + + this.addEventListener( evt, domEventCallback, false ); + + addToEventCache( this, evt, { + callfunc: customEventCallback || domEventCallback, + isCustomEvent: !!customEventCallback, + customEventLoop: customEventLoop, + originalCallback: originalCallback, + namespace: namespace + }); + } + }); + }; + + shoestring.fn.on = shoestring.fn.bind; + + //>>includeStart("development", pragmas.development); + shoestring.fn.live = function(){ + shoestring.error( 'live-delegate' ); + }; + + shoestring.fn.delegate = function(){ + shoestring.error( 'live-delegate' ); + }; + //>>includeEnd("development"); + +//>>excludeStart("exclude", pragmas.exclude); +}); +//>>excludeEnd("exclude");