0
|
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");
|