Mercurial > nebulaweb3
comparison 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 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1d038bc9b3d2 |
---|---|
1 //>>excludeStart("exclude", pragmas.exclude); | |
2 define([ "shoestring", "dom/closest" ], function(){ | |
3 //>>excludeEnd("exclude"); | |
4 | |
5 function initEventCache( el, evt ) { | |
6 if ( !el.shoestringData ) { | |
7 el.shoestringData = {}; | |
8 } | |
9 if ( !el.shoestringData.events ) { | |
10 el.shoestringData.events = {}; | |
11 } | |
12 if ( !el.shoestringData.loop ) { | |
13 el.shoestringData.loop = {}; | |
14 } | |
15 if ( !el.shoestringData.events[ evt ] ) { | |
16 el.shoestringData.events[ evt ] = []; | |
17 } | |
18 } | |
19 | |
20 function addToEventCache( el, evt, eventInfo ) { | |
21 var obj = {}; | |
22 obj.isCustomEvent = eventInfo.isCustomEvent; | |
23 obj.callback = eventInfo.callfunc; | |
24 obj.originalCallback = eventInfo.originalCallback; | |
25 obj.namespace = eventInfo.namespace; | |
26 | |
27 el.shoestringData.events[ evt ].push( obj ); | |
28 | |
29 if( eventInfo.customEventLoop ) { | |
30 el.shoestringData.loop[ evt ] = eventInfo.customEventLoop; | |
31 } | |
32 } | |
33 | |
34 /** | |
35 * Bind a callback to an event for the currrent set of elements. | |
36 * | |
37 * @param {string} evt The event(s) to watch for. | |
38 * @param {object,function} data Data to be included with each event or the callback. | |
39 * @param {function} originalCallback Callback to be invoked when data is define.d. | |
40 * @return shoestring | |
41 * @this shoestring | |
42 */ | |
43 shoestring.fn.bind = function( evt, data, originalCallback ){ | |
44 | |
45 //>>includeStart("development", pragmas.development); | |
46 if( arguments.length > 3 ){ | |
47 shoestring.error( 'on-delegate' ); | |
48 } | |
49 if( typeof data === "string" ){ | |
50 shoestring.error( 'on-delegate' ); | |
51 } | |
52 //>>includeEnd("development"); | |
53 if( typeof data === "function" ){ | |
54 originalCallback = data; | |
55 data = null; | |
56 } | |
57 | |
58 var evts = evt.split( " " ); | |
59 | |
60 // NOTE the `triggeredElement` is purely for custom events from IE | |
61 function encasedCallback( e, namespace, triggeredElement ){ | |
62 var result; | |
63 | |
64 if( e._namespace && e._namespace !== namespace ) { | |
65 return; | |
66 } | |
67 | |
68 e.data = data; | |
69 e.namespace = e._namespace; | |
70 | |
71 var returnTrue = function(){ | |
72 return true; | |
73 }; | |
74 | |
75 e.isDefaultPrevented = function(){ | |
76 return false; | |
77 }; | |
78 | |
79 var originalPreventDefault = e.preventDefault; | |
80 var preventDefaultConstructor = function(){ | |
81 if( originalPreventDefault ) { | |
82 return function(){ | |
83 e.isDefaultPrevented = returnTrue; | |
84 originalPreventDefault.call(e); | |
85 }; | |
86 } else { | |
87 return function(){ | |
88 e.isDefaultPrevented = returnTrue; | |
89 e.returnValue = false; | |
90 }; | |
91 } | |
92 }; | |
93 | |
94 // thanks https://github.com/jonathantneal/EventListener | |
95 e.target = triggeredElement || e.target || e.srcElement; | |
96 e.preventDefault = preventDefaultConstructor(); | |
97 e.stopPropagation = e.stopPropagation || function () { | |
98 e.cancelBubble = true; | |
99 }; | |
100 | |
101 result = originalCallback.apply(this, [ e ].concat( e._args ) ); | |
102 | |
103 if( result === false ){ | |
104 e.preventDefault(); | |
105 e.stopPropagation(); | |
106 } | |
107 | |
108 return result; | |
109 } | |
110 | |
111 return this.each(function(){ | |
112 var domEventCallback, | |
113 customEventCallback, | |
114 customEventLoop, | |
115 oEl = this; | |
116 | |
117 for( var i = 0, il = evts.length; i < il; i++ ){ | |
118 var split = evts[ i ].split( "." ), | |
119 evt = split[ 0 ], | |
120 namespace = split.length > 0 ? split[ 1 ] : null; | |
121 | |
122 domEventCallback = function( originalEvent ) { | |
123 if( oEl.ssEventTrigger ) { | |
124 originalEvent._namespace = oEl.ssEventTrigger._namespace; | |
125 originalEvent._args = oEl.ssEventTrigger._args; | |
126 | |
127 oEl.ssEventTrigger = null; | |
128 } | |
129 return encasedCallback.call( oEl, originalEvent, namespace ); | |
130 }; | |
131 customEventCallback = null; | |
132 customEventLoop = null; | |
133 | |
134 initEventCache( this, evt ); | |
135 | |
136 this.addEventListener( evt, domEventCallback, false ); | |
137 | |
138 addToEventCache( this, evt, { | |
139 callfunc: customEventCallback || domEventCallback, | |
140 isCustomEvent: !!customEventCallback, | |
141 customEventLoop: customEventLoop, | |
142 originalCallback: originalCallback, | |
143 namespace: namespace | |
144 }); | |
145 } | |
146 }); | |
147 }; | |
148 | |
149 shoestring.fn.on = shoestring.fn.bind; | |
150 | |
151 //>>includeStart("development", pragmas.development); | |
152 shoestring.fn.live = function(){ | |
153 shoestring.error( 'live-delegate' ); | |
154 }; | |
155 | |
156 shoestring.fn.delegate = function(){ | |
157 shoestring.error( 'live-delegate' ); | |
158 }; | |
159 //>>includeEnd("development"); | |
160 | |
161 //>>excludeStart("exclude", pragmas.exclude); | |
162 }); | |
163 //>>excludeEnd("exclude"); |