6 window.requestAnimationFrame ||
\r
7 window.webkitRequestAnimationFrame ||
\r
8 window.mozRequestAnimationFrame ||
\r
9 window.oRequestAnimationFrame ||
\r
10 window.msRequestAnimationFrame ||
\r
13 window.cancelRequestAnimationFrame ||
\r
14 window.webkitCancelAnimationFrame ||
\r
15 window.webkitCancelRequestAnimationFrame ||
\r
16 window.mozCancelRequestAnimationFrame ||
\r
17 window.oCancelRequestAnimationFrame ||
\r
18 window.msCancelRequestAnimationFrame ||
\r
28 busy : false, // for Opera7
\r
30 REQUEST_FRAME_LIST : [],
\r
34 var next = X.Timer.next,
\r
35 list = X.Timer.TICKET_LIST,
\r
43 X.Timer.busy = true;
\r
47 if( 0 < ( q.l -= next ) ) continue;
\r
50 if( f() & X.Callback.UN_LISTEN || c === 1 ){
\r
51 list.splice( i, 1 );
\r
59 X.Timer.timerId = 0;
\r
60 X.Timer.busy = false;
\r
63 _update : function(){
\r
64 var list = X.Timer.TICKET_LIST,
\r
69 X.Timer.timerId && window.clearTimeout( X.Timer.timerId );
\r
70 X.Timer.timerId = 0;
\r
74 ( l = list[ --i ].l ) < n && ( n = l );
\r
76 if( n < X.Timer.next || X.Timer.timerId === 0 ){
\r
77 X.Timer.timerId && window.clearTimeout( X.Timer.timerId );
\r
78 X.Timer.timerId = window.setTimeout( X.Timer._loop, X.Timer.INTERVAL_TIME * n );
\r
79 X.Timer.endTime = X.getTime() + X.Timer.INTERVAL_TIME * n; // iOS
\r
84 _onEnterFrame : function ( time ){
\r
85 var list = X.Timer.REQUEST_FRAME_LIST,
\r
88 time = time || ( Date.now ? Date.now() : +new Date );
\r
90 ( f = list[ --i ] )( time );
\r
97 add : function( time, opt_count, args1, args2, args3 ){
\r
98 var list = X.Timer.TICKET_LIST;
\r
99 time = time < X.Timer.INTERVAL_TIME ? 1 : ( time / X.Timer.INTERVAL_TIME ) | 0; // 正の数で使える「Math.floor(x)」を「(x | 0)」に;
\r
101 if( typeof opt_count !== 'number' ){
\r
108 list[ list.length ] = {
\r
112 f : X.Callback.create( args1, args2, args3 ),
\r
115 !X.Timer.busy && X.Timer._update();
\r
116 return X.Timer.uid;
\r
118 once : function( time, args1, args2, args3 ){
\r
119 return X.Timer.add( time, 1, args1, args2, args3 );
\r
121 remove : function( uid ){
\r
122 var list = X.Timer.TICKET_LIST,
\r
129 if( ( q = list[ --i ] ).u === uid ){
\r
130 list.splice( i, 1 );
\r
132 f.kill && f.kill();
\r
133 !X.Timer.busy && ( /* q[ INDEX_COUNT ] <= next || */ l === 1 ) && X.Timer._update();
\r
140 requestFrame : _enterFrame ?
\r
141 (function( args1, args2, args3 ){
\r
142 var i = X.Timer.REQUEST_FRAME_LIST.length,
\r
144 i === 0 && ( X.Timer.requestID = _enterFrame( X.Timer._onEnterFrame ) );
\r
145 f = X.Timer.REQUEST_FRAME_LIST[ i ] = X.Callback.create( args1, args2, args3 );
\r
146 return f.uid = ++X.Timer.uid;
\r
148 (function( args1, args2, args3 ){
\r
149 var i = X.Timer.REQUEST_FRAME_LIST.length,
\r
151 i === 0 && ( X.Timer.requestID = X.Timer.add( 0, 1, X.Timer._onEnterFrame ) );
\r
152 f = X.Timer.REQUEST_FRAME_LIST[ i ] = X.Callback.create( args1, args2, args3 );
\r
153 return f.uid = ++X.Timer.uid;
\r
156 cancelFrame : _cancelFrame ?
\r
158 var list = X.Timer.REQUEST_FRAME_LIST,
\r
163 if( ( f = list[ --i ] ).uid < uid ) break;
\r
164 if( f.uid === uid ){
\r
167 list.splice( i, 1 );
\r
169 f.kill && f.kill();
\r
170 l === 1 && _cancelFrame( X.Timer.requestID );
\r
176 var list = X.Timer.REQUEST_FRAME_LIST,
\r
181 if( ( f = list[ --i ] ).uid < uid ) break;
\r
182 if( f.uid === uid ){
\r
183 list.splice( i, 1 );
\r
185 f.kill && f.kill();
\r
186 l === 1 && X.Timer.remove( X.Timer.requestID );
\r
194 // http://havelog.ayumusato.com/develop/javascript/e528-ios6_scrolling_timer_notcall.html
\r
195 // iOS6 スクロール中のタイマー発火絡みのバグ備忘
\r
197 window.addEventListener( 'scroll', function(){
\r
198 if( X.Timer.timerId ){
\r
199 window.clearTimeout( X.Timer.timerId );
\r
200 X.Timer.timerId = window.setTimeout( X.Timer._loop, Math.max( 0, X.Timer.endTime - X.getTime() ) );
\r
205 if( X.UA.IE && ( X.UA.IE < 5 || X.UA.MacIE ) ){
\r
206 X.Timer[ '_ie_loop' ] = X.Timer._loop;
\r
207 X.Timer._loop = 'X.Timer._ie_loop()';
\r
210 console.log( 'X.Core.Timer' );
\r