1 /** 2 * @fileOverview simple event target for loader 3 * @author yiminghe@gmail.com 4 */ 5 (function (S) { 6 7 if (typeof require !== 'undefined') { 8 return; 9 } 10 11 var time = S.now(), 12 p = "__events__" + time; 13 14 function getHolder(self) { 15 return self[p] || (self[p] = {}); 16 } 17 18 function getEventHolder(self, name, create) { 19 var holder = getHolder(self); 20 if (create) { 21 holder[name] = holder[name] || []; 22 } 23 return holder[name]; 24 } 25 26 S.Loader.Target = 27 /** 28 * @lends KISSY.Loader# 29 */ 30 { 31 /** 32 * register callback for specified eventName from loader 33 * @param {String} eventName event name from kissy loader 34 * @param {Function} callback function to be executed when event of eventName is fired 35 */ 36 on:function (eventName, callback) { 37 getEventHolder(this, eventName, 1).push(callback); 38 }, 39 40 /** 41 * remove callback for specified eventName from loader 42 * @param {String} [eventName] eventName from kissy loader. 43 * if undefined remove all callbacks for all events 44 * @param {Function } [callback] function to be executed when event of eventName is fired. 45 * if undefined remove all callbacks fro this event 46 */ 47 detach:function (eventName, callback) { 48 if (!eventName) { 49 delete this[p]; 50 return; 51 } 52 var fns = getEventHolder(this, eventName); 53 if (fns) { 54 if (callback) { 55 var index = S.indexOf(callback, fns); 56 if (index != -1) { 57 fns.splice(index, 1); 58 } 59 } 60 if (!callback || !fns.length) { 61 delete getHolder(this)[eventName]; 62 } 63 } 64 }, 65 66 /** 67 * @private 68 */ 69 fire:function (eventName, obj) { 70 var fns = getEventHolder(this, eventName); 71 S.each(fns, function (f) { 72 f.call(null, obj); 73 }); 74 } 75 }; 76 })(KISSY);