INTERVAL_TIME = 16,\r
TICKET_LIST = [],\r
uid = 0,\r
- timerId = -1,\r
+ timerId = 0,\r
+ endTime = 0,\r
next = 0,\r
INDEX_TIME = 0,\r
INDEX_LAST = 1,\r
ret = f();\r
if( ret & X.Callback.UN_LISTEN || c === 1 ){\r
list.splice( i, 1 );\r
- f.kill();\r
+ f.kill && f.kill();\r
queue.length = 0;\r
continue;\r
} else\r
if( 1 < c ) --queue[ INDEX_COUNT ];\r
queue[ INDEX_LAST ] = queue[ INDEX_TIME ];\r
};\r
- timerId = -1;\r
+ timerId = 0;\r
update();\r
};\r
function update(){\r
last;\r
if( l === 0 ){\r
timerId !== -1 && clearTimeout( timerId );\r
- timerId = -1;\r
+ timerId = 0;\r
return;\r
};\r
for( ; l; ){\r
( last = list[ --l ][ INDEX_LAST ] ) < n && ( n = last );\r
};\r
- if( n < next || timerId === -1 ){\r
- timerId !== -1 && clearTimeout( timerId );\r
- timerId = setTimeout( loop, INTERVAL_TIME * n );\r
+ if( n < next || timerId === 0 ){\r
+ timerId !== 0 && clearTimeout( timerId );\r
+ timerId = setTimeout( loop, INTERVAL_TIME * n );\r
+ endTime = X.getTime() + INTERVAL_TIME * n;\r
next = n;\r
};\r
};\r
\r
+ // http://havelog.ayumusato.com/develop/javascript/e528-ios6_scrolling_timer_notcall.html\r
+ // iOS6 スクロール中のタイマー発火絡みのバグ備忘\r
+ if( X.UA.iOS ){\r
+ window.addEventListener( 'scroll', function(){\r
+ if( timerId ){\r
+ clearTimeout( timerId );\r
+ timerId = setTimeout( loop, Math.max( 0, endTime - X.getTime() ) );\r
+ };\r
+ } );\r
+ };\r
+ \r
var enterFrame =\r
window.requestAnimationFrame ||\r
window.webkitRequestAnimationFrame ||\r
for( ; i; ){\r
( f = list[ --i ] )( time );\r
delete f.uid;\r
- f.kill();\r
+ f.kill && f.kill();\r
};\r
list.length = 0;\r
};\r
return uid;\r
},\r
once : function( time, args1, args2, args3 ){\r
- X.Timer.add( time, 1, args1, args2, args3 );\r
+ return X.Timer.add( time, 1, args1, args2, args3 );\r
},\r
remove : function( uid ){\r
- var queue,\r
- list = TICKET_LIST,\r
+ var list = TICKET_LIST,\r
i = list.length,\r
- l = i;\r
+ l = i,\r
+ f, q;\r
for( ; i; ){\r
- if( ( queue = list[ --i ] )[ INDEX_UID ] === uid ){\r
+ if( ( q = list[ --i ] )[ INDEX_UID ] === uid ){\r
list.splice( i, 1 );\r
- X.Callback._correct( queue[ INDEX_CALLBACK ] );\r
- ( /* queue[ INDEX_COUNT ] <= next || */ l === 1 ) && update();\r
- queue.length = 0;\r
+ f = q[ INDEX_CALLBACK ];\r
+ f.kill && f.kill();\r
+ ( /* q[ INDEX_COUNT ] <= next || */ l === 1 ) && update();\r
+ q.length = 0;\r
break;\r
};\r
};\r
- }\r
+ },\r
\r
// string only ie4-\r
- ,_loop : X.UA.IE && X.UA.IE < 5 && (function(){\r
- var _loop = loop;\r
+ _loop : X.UA.IE && X.UA.IE < 5 && (function( r ){\r
loop = 'X.Timer._loop()';\r
- return _loop;\r
- })()\r
+ return r;\r
+ })( loop ),\r
\r
- ,requestFrame : function( args1, args2, args3 ){\r
+ requestFrame : function( args1, args2, args3 ){\r
var i = REQUEST_FRAME_LIST.length,\r
f;\r
- i === 0 && ( requestID = ( enterFrame ? enterFrame( onEnterFrame ) : X.Timer.add( 16, 1, onEnterFrame ) ) );\r
+ i === 0 && ( requestID = ( enterFrame ? enterFrame( onEnterFrame ) : X.Timer.add( 0, 1, onEnterFrame ) ) );\r
f = REQUEST_FRAME_LIST[ i ] = X.Callback.create( args1, args2, args3 );\r
return f.uid = ++uid;\r
},\r
cancelFrame : function( uid ){\r
var list = REQUEST_FRAME_LIST,\r
- i = list.length,\r
- l = i,\r
+ l = list.length,\r
+ i = l,\r
f;\r
for( ; i; ){\r
if( ( f = list[ --i ] ).uid < uid ) break;\r
if( f.uid === uid ){\r
list.splice( i, 1 );\r
delete f.uid;\r
- X.Callback._correct( f );\r
- l === 1 && cancelFrame ? cancelFrame( requestID ) : X.Timer.remove( requestID );\r
- break; \r
+ f.kill && f.kill();\r
+ l === 1 && ( cancelFrame ? cancelFrame( requestID ) : X.Timer.remove( requestID ) );\r
+ break;\r
};\r
};\r
}\r