5 X.Timer = ( function(){
\r
6 var setTimeout = window.setTimeout,
\r
7 clearTimeout = window.clearTimeout,
\r
26 queue = list[ --i ];
\r
27 if( 0 < ( queue[ INDEX_LAST ] -= c ) ) continue;
\r
28 f = queue[ INDEX_CALLBACK ];
\r
29 c = queue[ INDEX_COUNT ];
\r
31 if( ret & X.Callback.UN_LISTEN || c === 1 ){
\r
32 list.splice( i, 1 );
\r
37 if( 1 < c ) --queue[ INDEX_COUNT ];
\r
38 queue[ INDEX_LAST ] = queue[ INDEX_TIME ];
\r
44 var list = TICKET_LIST,
\r
49 timerId !== -1 && clearTimeout( timerId );
\r
54 ( last = list[ --l ][ INDEX_LAST ] ) < n && ( n = last );
\r
56 if( n < next || timerId === 0 ){
\r
57 timerId !== 0 && clearTimeout( timerId );
\r
58 timerId = setTimeout( loop, INTERVAL_TIME * n );
\r
59 endTime = X.getTime() + INTERVAL_TIME * n;
\r
64 // http://havelog.ayumusato.com/develop/javascript/e528-ios6_scrolling_timer_notcall.html
\r
65 // iOS6 スクロール中のタイマー発火絡みのバグ備忘
\r
67 window.addEventListener( 'scroll', function(){
\r
69 clearTimeout( timerId );
\r
70 timerId = setTimeout( loop, Math.max( 0, endTime - X.getTime() ) );
\r
76 window.requestAnimationFrame ||
\r
77 window.webkitRequestAnimationFrame ||
\r
78 window.mozRequestAnimationFrame ||
\r
79 window.oRequestAnimationFrame ||
\r
80 window.msRequestAnimationFrame ||
\r
83 window.cancelRequestAnimationFrame ||
\r
84 window.webkitCancelAnimationFrame ||
\r
85 window.webkitCancelRequestAnimationFrame ||
\r
86 window.mozCancelRequestAnimationFrame ||
\r
87 window.oCancelRequestAnimationFrame ||
\r
88 window.msCancelRequestAnimationFrame ||
\r
90 REQUEST_FRAME_LIST = [],
\r
93 function onEnterFrame( time ){
\r
94 var list = REQUEST_FRAME_LIST,
\r
97 time = time || ( Date.now ? Date.now() : +new Date );
\r
99 ( f = list[ --i ] )( time );
\r
101 f.kill && f.kill();
\r
107 add : function( time, opt_count, args1, args2, args3 ){
\r
108 time = time < INTERVAL_TIME ? 1 : ( time / INTERVAL_TIME ) | 0; // 正の数で使える「Math.floor(x)」を「(x | 0)」に;
\r
110 if( typeof opt_count !== 'number' ){
\r
117 TICKET_LIST[ TICKET_LIST.length ] = [ time, time, opt_count, X.Callback.create( args1, args2, args3 ), ++uid ];
\r
121 once : function( time, args1, args2, args3 ){
\r
122 return X.Timer.add( time, 1, args1, args2, args3 );
\r
124 remove : function( uid ){
\r
125 var list = TICKET_LIST,
\r
130 if( ( q = list[ --i ] )[ INDEX_UID ] === uid ){
\r
131 list.splice( i, 1 );
\r
132 f = q[ INDEX_CALLBACK ];
\r
133 f.kill && f.kill();
\r
134 ( /* q[ INDEX_COUNT ] <= next || */ l === 1 ) && update();
\r
141 // string only ie4-
\r
142 _loop : X.UA.IE && X.UA.IE < 5 && (function( r ){
\r
143 loop = 'X.Timer._loop()';
\r
147 requestFrame : function( args1, args2, args3 ){
\r
148 var i = REQUEST_FRAME_LIST.length,
\r
150 i === 0 && ( requestID = ( enterFrame ? enterFrame( onEnterFrame ) : X.Timer.add( 0, 1, onEnterFrame ) ) );
\r
151 f = REQUEST_FRAME_LIST[ i ] = X.Callback.create( args1, args2, args3 );
\r
152 return f.uid = ++uid;
\r
154 cancelFrame : function( uid ){
\r
155 var list = REQUEST_FRAME_LIST,
\r
160 if( ( f = list[ --i ] ).uid < uid ) break;
\r
161 if( f.uid === uid ){
\r
162 list.splice( i, 1 );
\r
164 f.kill && f.kill();
\r
165 l === 1 && ( cancelFrame ? cancelFrame( requestID ) : X.Timer.remove( requestID ) );
\r