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