1 /** 2 * @fileOverview queue of anim objects 3 * @author yiminghe@gmail.com 4 */ 5 KISSY.add("anim/queue", function(S, DOM) { 6 7 var /*队列集合容器*/ 8 queueCollectionKey = S.guid("ks-queue-" + S.now() + "-"), 9 /*默认队列*/ 10 queueKey = S.guid("ks-queue-" + S.now() + "-"), 11 // 当前队列是否有动画正在执行 12 processing = "..."; 13 14 function getQueue(elem, name, readOnly) { 15 name = name || queueKey; 16 17 var qu, 18 quCollection = DOM.data(elem, queueCollectionKey); 19 20 if (!quCollection && !readOnly) { 21 DOM.data(elem, queueCollectionKey, quCollection = {}); 22 } 23 24 if (quCollection) { 25 qu = quCollection[name]; 26 if (!qu && !readOnly) { 27 qu = quCollection[name] = []; 28 } 29 } 30 31 return qu; 32 } 33 34 function removeQueue(elem, name) { 35 name = name || queueKey; 36 var quCollection = DOM.data(elem, queueCollectionKey); 37 if (quCollection) { 38 delete quCollection[name]; 39 } 40 if (S.isEmptyObject(quCollection)) { 41 DOM.removeData(elem, queueCollectionKey); 42 } 43 } 44 45 var q = { 46 47 queueCollectionKey:queueCollectionKey, 48 49 queue:function(anim) { 50 var elem = anim.elem, 51 name = anim.config.queue, 52 qu = getQueue(elem, name); 53 qu.push(anim); 54 if (qu[0] !== processing) { 55 q.dequeue(anim); 56 } 57 return qu; 58 }, 59 60 remove:function(anim) { 61 var elem = anim.elem, 62 name = anim.config.queue, 63 qu = getQueue(elem, name, 1),index; 64 if (qu) { 65 index = S.indexOf(anim, qu); 66 if (index > -1) { 67 qu.splice(index, 1); 68 } 69 } 70 }, 71 72 removeQueues:function(elem) { 73 DOM.removeData(elem, queueCollectionKey); 74 }, 75 76 removeQueue:removeQueue, 77 78 dequeue:function(anim) { 79 var elem = anim.elem, 80 name = anim.config.queue, 81 qu = getQueue(elem, name, 1), 82 nextAnim = qu && qu.shift(); 83 84 if (nextAnim == processing) { 85 nextAnim = qu.shift(); 86 } 87 88 if (nextAnim) { 89 qu.unshift(processing); 90 nextAnim._runInternal(); 91 } else { 92 // remove queue data 93 removeQueue(elem, name); 94 } 95 } 96 97 }; 98 return q; 99 }, { 100 requires:['dom'] 101 });