X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F01_core%2F16_XTimer.js;h=2c005135135c3e6cb77c952632689a2cee194fa9;hb=dd4fcb6269ff74be253a767826aa5dfb96dd4acc;hp=744a33b37bb17dd60b898bf90d7695be59663770;hpb=ecfded871abcf085bbc2b862352232190b87fd27;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/01_core/16_XTimer.js b/0.6.x/js/01_core/16_XTimer.js index 744a33b..2c00513 100644 --- a/0.6.x/js/01_core/16_XTimer.js +++ b/0.6.x/js/01_core/16_XTimer.js @@ -44,9 +44,7 @@ var */ X_Timer_now = Date.now || ( function(){ return +new Date; } ), - X_Timer_SET_TIMEOUT = window.setTimeout, - X_Timer_CLEAR_TIMEOUT = window.clearTimeout, - + // TODO X.AF.request, X.AF.cancel // http://uupaa.hatenablog.com/entry/2012/02/01/083607 // Firefox 4 partial (request only), Mobile Firefox5 ready (request only), Firefox 11 ready (cancel impl) X_Timer_REQ_ANIME_FRAME = @@ -58,6 +56,7 @@ var false, X_Timer_CANCEL_ANIME_FRAME = + window.cancelAnimationFrame || window.cancelRequestAnimationFrame || window.webkitCancelAnimationFrame || window.webkitCancelRequestAnimationFrame || @@ -96,18 +95,18 @@ var f; i === 0 && ( X_Timer_requestID = X_Timer_REQ_ANIME_FRAME( X_Timer_onEnterFrame ) ); f = X_Closure_classifyCallbackArgs( args1, args2, args3 ); - if( !f.kind ) f = { func : f }; + if( !f.cbKind ) f = { func : f }; X_Timer_REQ_FRAME_LIST[ i ] = f; - return f.uid = ++X_Timer_uid; + return f._uid = ++X_Timer_uid; }) : (function( args1, args2, args3 ){ var i = X_Timer_REQ_FRAME_LIST.length, f; i === 0 && ( X_Timer_requestID = X_Timer_add( 0, 1, X_Timer_onEnterFrame ) ); f = X_Closure_classifyCallbackArgs( args1, args2, args3 ); - if( !f.kind ) f = { func : f }; + if( !f.cbKind ) f = { func : f }; X_Timer_REQ_FRAME_LIST[ i ] = f; - return f.uid = ++X_Timer_uid; + return f._uid = ++X_Timer_uid; }), /** @@ -131,8 +130,8 @@ var X_Timer_removal[ uid ] = true; } else { for( ; i; ){ - if( ( f = list[ --i ] ).uid < uid ) break; - if( f.uid == uid ){ + if( ( f = list[ --i ] )._uid < uid ) break; + if( f._uid == uid ){ list.splice( i, 1 ); // gecko では cancelRequestAnimationFrame が無い場合がある l === 1 && X_Timer_CANCEL_ANIME_FRAME && X_Timer_CANCEL_ANIME_FRAME( X_Timer_requestID ); @@ -154,8 +153,8 @@ var X_Timer_removal[ uid ] = true; } else { for( ; i; ){ - if( ( f = list[ --i ] ).uid < uid ) break; - if( f.uid == uid ){ + if( ( f = list[ --i ] )._uid < uid ) break; + if( f._uid == uid ){ list.splice( i, 1 ); l === 1 && X_Timer_remove( X_Timer_requestID ); break; @@ -182,6 +181,8 @@ var * @alias X.Timer */ X[ 'Timer' ] = { + // TODO IE4 の resolution は 64ms + 'RESOLUTION' : X_Timer_INTERVAL_TIME, 'now' : X_Timer_now, @@ -215,6 +216,7 @@ X[ 'Timer' ] = { function X_Timer_add( time, opt_count, args1, args2, args3 ){ var list = X_Timer_TICKET_LIST, hash, obj; + time = time < X_Timer_INTERVAL_TIME ? 1 : time / X_Timer_INTERVAL_TIME | 0; // 正の数で使える「Math.floor(x)」を「(x | 0)」に; if( !X_Type_isNumber( opt_count ) ){ @@ -227,11 +229,11 @@ X[ 'Timer' ] = { hash = X_Closure_classifyCallbackArgs( args1, args2, args3 ); if( !hash ) return -1; // dev only - if( !hash.kind ) hash = { func : hash }; - hash.time = time; - hash.last = time; - hash.count = opt_count; - hash.uid = ++X_Timer_uid; + if( !hash.cbKind ) hash = { func : hash }; + hash._time = time; + hash.last = time; + hash._count = opt_count; + hash._uid = ++X_Timer_uid; list[ list.length ] = hash; !X_Timer_busyTimeout && X_Timer_update(); @@ -270,7 +272,7 @@ X[ 'Timer' ] = { X_Timer_removal[ uid ] = true; } else { for( ; i; ){ - if( ( q = list[ --i ] ).uid == uid ){ // 数字の場合と文字の場合がある + if( ( q = list[ --i ] )._uid == uid ){ // 数字の場合と文字の場合がある list.splice( i, 1 ); /* @@ -289,7 +291,7 @@ X[ 'Timer' ] = { }; if( X_UA[ 'IE4' ] || X_UA[ 'MacIE' ] ){ - X.Timer[ '_' ] = X_Timer_onTimeout; + X[ 'Timer' ][ '_' ] = X_Timer_onTimeout; X_Timer_onTimeout = 'X.Timer._()'; }; @@ -314,17 +316,17 @@ function X_Timer_onTimeout(){ for( ; i < l; ++i ){ q = list[ i ]; if( - ( X_Timer_removal && X_Timer_removal[ q.uid ] ) || // timerId は remove 登録されている + ( X_Timer_removal && X_Timer_removal[ q._uid ] ) || // timerId は remove 登録されている 0 < ( q.last -= minus ) || // 時間が経過していない heavy && ( q.last = 1 ) // 時間は経過したが、ヘビーフラグが立っている ){ continue; }; - c = q.count; + c = q._count; - X_Timer_currentUID = q.uid; + X_Timer_currentUID = q._uid; - if( q.kind ){ + if( q.cbKind ){ r = X_Closure_proxyCallback( q, [] ); } else { r = q.func(); @@ -344,8 +346,8 @@ function X_Timer_onTimeout(){ --l; continue; } else - if( 1 < c ) --q.count; - q.last = q.time; + if( 1 < c ) --q._count; + q.last = q._time; }; X_Timer_timerId = X_Timer_currentUID = 0; X_Timer_busyTimeout = false; @@ -367,7 +369,7 @@ function X_Timer_update(){ i = list.length, n; if( i === 0 ){ - X_Timer_timerId && X_Timer_CLEAR_TIMEOUT( X_Timer_timerId ); + X_Timer_timerId && clearTimeout( X_Timer_timerId ); X_Timer_timerId = 0; return; }; @@ -378,12 +380,12 @@ function X_Timer_update(){ if( n < X_Timer_waitTime || X_Timer_timerId === 0 ){ if( X_Timer_timerId ){ - X_Timer_CLEAR_TIMEOUT( X_Timer_timerId ); - n -= ( X_Timer_now() - X_Timer_timeStamp ) / X_Timer_INTERVAL_TIME | 0; + clearTimeout( X_Timer_timerId ); + n -= ( X_Timer_now() - X_Timer_timeStamp ) / X_Timer_INTERVAL_TIME; 0 <= n || ( n = 0 ); // 負の数は 0 に }; X_Timer_timeStamp = X_Timer_now(); - X_Timer_timerId = X_Timer_SET_TIMEOUT( X_Timer_onTimeout, X_Timer_INTERVAL_TIME * n ); + X_Timer_timerId = setTimeout( X_Timer_onTimeout, X_Timer_INTERVAL_TIME * n | 0 ); X_Timer_waitTime = n; }; }; @@ -392,7 +394,7 @@ function X_Timer_update(){ // http://jsfiddle.net/warby_/X8YUZ/ Chrome で return が 0 の場合の挙動が他のブラウザと異なる function X_Timer_compareQueue( a, b ){ if( a.last === b.last ){ // Chrome のみ - return a.uid - b.uid; + return a._uid - b._uid; }; return a.last - b.last; // return a.last <= b.last ? -1 : 1; //a.last === b.last ? 0 : 1; @@ -404,10 +406,10 @@ if( X_UA[ 'iOS' ] ){ window.addEventListener( 'scroll', function(){ var last, now; if( X_Timer_timerId ){ - X_Timer_CLEAR_TIMEOUT( X_Timer_timerId ); + clearTimeout( X_Timer_timerId ); now = X_Timer_now(); last = X_Timer_timeStamp + X_Timer_INTERVAL_TIME * X_Timer_waitTime - now; - X_Timer_timerId = X_Timer_SET_TIMEOUT( X_Timer_onTimeout, 0 < last ? last : 0 ); + X_Timer_timerId = setTimeout( X_Timer_onTimeout, 0 < last ? last : 0 ); // 更新 X_Timer_timeStamp = now; X_Timer_waitTime = last / X_Timer_INTERVAL_TIME | 0; @@ -429,9 +431,9 @@ function X_Timer_onEnterFrame( time ){ for( ; i < l; ++i ){ q = list[ i ]; - if( X_Timer_removal && X_Timer_removal[ q.uid ] ) continue; + if( X_Timer_removal && X_Timer_removal[ q._uid ] ) continue; - if( q.kind ){ + if( q.cbKind ){ X_Closure_proxyCallback( q, args || ( args = [ time ] ) ); } else { q.func( time );