}\r
\r
.PageRoot {\r
- height : 100%;\r
+ height : 100%;\r
position : relative;\r
}\r
\r
top : 0;\r
left : 0;\r
width : 100%;\r
+ height : auto;\r
padding : 0;\r
margin : 0;\r
/* ブラウザのレイアウト機能による auto なサイズ指定は行わない */\r
visibility : hidden;\r
/*z-index : 99;*/\r
}\r
+.hidden-iframe {\r
+ z-index : -1;\r
+ visibility : hidden;\r
+ overflow : hidden;\r
+ border : 0;\r
+ outline : 0;\r
+ margin : -10px 0 0 -10px;\r
+ padding : 0;\r
+ min-width : 0;\r
+ min-height : 0;\r
+ width : 10px;\r
+ height : 10px;\r
+ max-width : 10px;\r
+ max-height : 10px;\r
+ top : -20px;\r
+ left : -20px;\r
+}\r
+\r
+/* Fix for WebAudio\r
+ * see http://qiita.com/sou/items/5688d4e7d3a37b4e2ff1\r
+--------------------------------------------------------------------------------------*/\r
+ #fps-slowdown-make-sound-noisy {\r
+ width: 0px;\r
+ height: 0px;\r
+ position: absolute;\r
+ -webkit-animation-name: anim-void;\r
+ -webkit-animation-duration: 1s;\r
+ -webkit-animation-iteration-count: infinite;\r
+ }\r
+ @-webkit-keyframes anim-void {\r
+ from {\r
+ top: 0px;\r
+ }\r
+ to {\r
+ top: 1px;\r
+ }\r
+ }\r
\r
/* Scrollbox\r
--------------------------------------------------------------------------------------*/\r
X_Callback_PREVENT_DEFAULT = 8, // 結果動作のキャンセル,\r
/** @const */\r
X_Callback_MONOPOLY = 16, // move event を独占する\r
+ \r
+ X_Callback_CAPTURE_POINTER = 16,\r
+ X_Callback_RELEASE_POINTER = 32,\r
+ \r
/** @const */\r
- X_Callback_SYS_CANCEL = 32 | 4 | 2;\r
+ X_Callback_SYS_CANCEL = 64 | 4 | 2;\r
\r
/*\r
* handleEvent という関数のメンバーを持つオブジェクト\r
/**\r
* X.UI に於いて、ポインターイベントの戻り値に指定すると、以降のポインターベントを独占する。\r
*/\r
- 'MONOPOLY' : X_Callback_MONOPOLY\r
+ 'MONOPOLY' : X_Callback_MONOPOLY,\r
+ \r
+ 'CAPTURE_POINTER' : X_Callback_CAPTURE_POINTER,\r
+ \r
+ 'RELEASE_POINTER' : X_Callback_RELEASE_POINTER\r
};\r
\r
// ------------------------------------------------------------------------- //\r
var i = X_Timer_REQ_FRAME_LIST.length,\r
f;\r
i === 0 && ( X_Timer_requestID = X_Timer_REQ_ANIME_FRAME( X_Timer_onEnterFrame ) );\r
- f = X_Timer_REQ_FRAME_LIST[ i ] = X_Callback_classifyCallbackArgs( args1, args2, args3 );\r
+ f = X_Callback_classifyCallbackArgs( args1, args2, args3 );\r
+ if( !f.kind ) f = { func : f };\r
+ X_Timer_REQ_FRAME_LIST[ i ] = f;\r
return f.uid = ++X_Timer_uid;\r
}) :\r
(function( args1, args2, args3 ){\r
var i = X_Timer_REQ_FRAME_LIST.length,\r
f;\r
i === 0 && ( X_Timer_requestID = X_Timer_add( 0, 1, X_Timer_onEnterFrame ) );\r
- f = X_Timer_REQ_FRAME_LIST[ i ] = X_Callback_classifyCallbackArgs( args1, args2, args3 );\r
+ f = X_Callback_classifyCallbackArgs( args1, args2, args3 );\r
+ if( !f.kind ) f = { func : f };\r
+ X_Timer_REQ_FRAME_LIST[ i ] = f;\r
return f.uid = ++X_Timer_uid;\r
}),\r
\r
* requestAnimationFrame を解除します。登録時に受け取ったタイマーIDを使用します。\r
* @alias X.Timer.cancelFrame\r
* @function\r
- * @param {number} タイマーID\r
+ * @param {number|string} タイマーID, 数字文字の場合もある!\r
+ * @return {number} 0 が返る\r
+ * @example if( timerID ) timerID = X.Timer.cancelFrame( timerID );\r
*/\r
X_Timer_cancelFrame = X_Timer_CANCEL_ANIME_FRAME ?\r
(function( uid ){\r
l = list.length,\r
i = l,\r
f;\r
- // fire 中の cancel\r
+\r
if( X_Timer_busyOnFrame ){\r
+ // fire 中の cancel\r
if( !X_Timer_removal ) X_Timer_removal = {};\r
X_Timer_removal[ uid ] = true;\r
} else {\r
if( ( f = list[ --i ] ).uid < uid ) break;\r
if( f.uid === uid ){\r
list.splice( i, 1 );\r
- // gecko では無い場合がある\r
+ // gecko では cancelRequestAnimationFrame が無い場合がある\r
l === 1 && X_Timer_CANCEL_ANIME_FRAME && X_Timer_CANCEL_ANIME_FRAME( X_Timer_requestID );\r
break;\r
};\r
}; \r
};\r
+ return 0;\r
}) :\r
(function( uid ){\r
var list = X_Timer_REQ_FRAME_LIST,\r
l = list.length,\r
i = l,\r
f;\r
- // fire 中の cancel\r
+\r
if( X_Timer_busyOnFrame ){\r
+ // fire 中の cancel\r
if( !X_Timer_removal ) X_Timer_removal = {};\r
X_Timer_removal[ uid ] = true;\r
} else {\r
};\r
};\r
};\r
+ return 0;\r
});\r
\r
\r
* @param {*} args2\r
* @param {*} args3\r
* @return {number} タイマーID。1 以上の数値。タイマーの解除に使用。\r
- * @example X.Timer.add( 1000, 5, thisContext, onTimer );\r
+ * @example timerID = X.Timer.add( 1000, 5, thisContext, onTimer );\r
*/\r
function X_Timer_add( time, opt_count, args1, args2, args3 ){\r
var list = X_Timer_TICKET_LIST,\r
* タイマーを解除します。登録時に受け取ったタイマーIDを使用します。\r
* @alias X.Timer.remove\r
* @param {number} タイマーID\r
+ * @return {number} 0 が返る\r
+ * @example if( timerID ) timerID = X.Timer.remove( timerID );\r
*/\r
function X_Timer_remove( uid ){\r
var list = X_Timer_TICKET_LIST,\r
i = list.length,\r
l = i,\r
f, q, eventDispatcher, lazy, listeners;\r
- // fire 中の cancel\r
+ \r
if( X_Timer_busyTimeout ){\r
+ // fire 中の cancel\r
if( !X_Timer_removal ) X_Timer_removal = {};\r
X_Timer_removal[ uid ] = true;\r
} else {\r
* lazyDispatch 中の EventDispatcher の有無を調べる\r
*/\r
if( X_EventDispatcher_LAZY_TIMERS[ uid ] ){\r
- // eventDispatcher = X_EventDispatcher_LAZY_TIMERS[ uid ];\r
delete X_EventDispatcher_LAZY_TIMERS[ uid ];\r
- /*\r
- listeners = eventDispatcher[ '_listeners' ];\r
- if( listeners && !listeners[ X_Listeners_.DISPATCHING ] && listeners[ X_Listeners_.KILL_RESERVED ] ){\r
- for( uid in X_EventDispatcher_LAZY_TIMERS ){\r
- if( X_EventDispatcher_LAZY_TIMERS[ uid ] === eventDispatcher ){\r
- lazy = true;\r
- break;\r
- };\r
- }; \r
- !lazy && eventDispatcher[ 'kill' ]();\r
- }; */\r
};\r
\r
!X_Timer_skipUpdate && ( q.last <= X_Timer_waitTime || l === 1 ) && X_Timer_update();\r
};\r
}; \r
};\r
+ return 0;\r
};\r
\r
if( X_UA[ 'IE4' ] || X_UA[ 'MacIE' ] ){\r
\r
if( X_Timer_removal && X_Timer_removal[ q.uid ] ) continue;\r
\r
- if( q.k ){\r
+ if( q.kind ){\r
X_Callback_proxyCallback( q, args || ( args = [ time ] ) );\r
} else {\r
- q( time );\r
+ q.func( time );\r
};\r
};\r
\r
X_Dom_detectFontSize = !( X_UA[ 'IE' ] < 9 || X_UA[ 'iOS' ] ) && function(){
var size = X_Node_fontSizeNode[ '_rawObject' ].offsetHeight;
if( X_ViewPort_baseFontSize !== size ){
- X_ViewPort_baseFontSize && X_ViewPort[ 'asyncDispatch' ]( X_EVENT_BASE_FONT_RESIZED );
X_ViewPort_baseFontSize = size;
+ X_ViewPort_baseFontSize && X_ViewPort[ 'asyncDispatch' ]( X_EVENT_BASE_FONT_RESIZED );
};
},
function X_Node_call( name /*, opt_args... */ ){\r
var l = arguments.length - 1,\r
raw, func, args, params, i;\r
- \r
- X_Node_updateTimerID && X_Node_startUpdate();\r
- \r
+\r
switch( name ){\r
case 'nodeType' :\r
return this[ '_tag' ] ? 1 : 3;\r
return v;\r
case 'fontSize' :\r
return X_Node_CSS_getCharSize( this );\r
- case 'GPU' :\r
- return this[ '_flags' ] & X_Node_State.GPU_NOW ? 'NOW' :\r
- this[ '_flags' ] & X_Node_State.GPU_RELEASE_RESERVED ? '解除予約' : '';\r
case 'inGPU' :\r
return !!( this[ '_flags' ] & ( X_Node_State.GPU_NOW | X_Node_State.GPU_RELEASE_RESERVED ) );\r
};\r
\r
+ X_Node_updateTimerID && X_Node_startUpdate();\r
+ \r
raw = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
if( !raw ) return;\r
\r
if( time ){\r
// X.Timer 経由でないと発火しない このイベントでサイズを取ると無限ループに\r
X_System[ '_listeners' ] && X_System[ '_listeners' ][ X_EVENT_UPDATED ] && X_System[ 'dispatch' ]( X_EVENT_UPDATED ); \r
+ } else {\r
+ X_System[ '_listeners' ] && X_System[ '_listeners' ][ X_EVENT_UPDATED ] && X_System[ 'asyncDispatch' ]( X_EVENT_UPDATED );\r
};\r
\r
X_ViewPort[ '_listeners' ] && X_ViewPort[ '_listeners' ][ X_EVENT_AFTER_UPDATE ] && X_ViewPort[ 'asyncDispatch' ]( X_EVENT_AFTER_UPDATE );\r
X_Node_Anime_reserved = false,\r
X_Node_Anime_updateTimerID = 0,\r
X_Node_Anime_needsDetection = false,\r
+ X_Node_Anime_onTransition = false,\r
+ \r
X_Node_Anime_hasTransform = !!X_Node_CSS_VENDER_PREFIX[ 'transform' ],\r
/* Opera mobile で translateZ(0) が有効だと XY が 0 0 になる */\r
/* GPUレイヤーにいる間に要素のコンテンツを変更をすると transitionend が動かなくなるっぽい Mac safari と firefox, 手当てが済むまでここは常に false */\r
X_Node_Anime_transitionProps = X_Node_Anime_hasTransform ? X_Node_CSS_VENDER_PREFIX[ 'transform' ] : 'left,top',\r
// transitionEnd イベント中に要素の更新( X_Node_startUpdate() )ができるか?\r
// iOS3+4 では可能、iOS6.1.5 で不可。TODO iOS5 及び他の環境で調査。ダメな場合、anime.html が正しく描画されない。\r
- X_Node_updateOnTransitionEnd = X_UA[ 'iOS' ] < 6,\r
- X_Node_Anime_onTransition = false;\r
+ X_Node_updateOnTransitionEnd = X_UA[ 'iOS' ] < 6;\r
\r
// gpu化だけ transformX , willChange\r
// 終了位置の変更\r
\r
X_Node_Anime_reserveUpdate( true );\r
} else {\r
- X_System[ 'unlisten' ]( X_EVENT_UPDATED, X_Node_Anime_updateAnimationsNoTransition );\r
- X_Node_Anime_updateTimerID || ( X_Node_Anime_updateTimerID = X_Timer_requestFrame( X_Node_Anime_updateAnimationsNoTransition ) );\r
+ if( !X_Node_Anime_reserved ){\r
+ X_Node_Anime_reserved = true;\r
+ if( X_Node_updateTimerID ){\r
+ X_System[ 'listen' ]( X_EVENT_UPDATED, X_Node_Anime_updateAnimationsNoTransition );\r
+ X_Node_Anime_updateTimerID && X_Timer_cancelFrame( X_Node_Anime_updateTimerID );\r
+ X_Node_Anime_updateTimerID = 0;\r
+ } else {\r
+ X_System[ 'unlisten' ]( X_EVENT_UPDATED, X_Node_Anime_updateAnimationsNoTransition );\r
+ X_Node_Anime_updateTimerID = X_Timer_requestFrame( X_Node_Anime_updateAnimationsNoTransition );\r
+ };\r
+ };\r
\r
- isNew && this[ 'dispatch' ]( { type : X_EVENT_ANIME_START, gpu : false } );\r
+ isNew && this[ 'dispatch' ]( { type : X_EVENT_ANIME_START, 'gpu' : false } );\r
};\r
\r
// console.log( 'animate() ' + this[ '_id' ] + ' y:' + obj.startY + ' > ' + obj.destY + ' d:' + obj.duration );\r
} else {\r
X_Node_ANIMATIONS.splice( X_Node_ANIMATIONS.indexOf( this ), 1 );\r
//obj.gpuTimerID && X_Timer_remove( obj.gpuTimerID );\r
- delete this[ '_anime' ]; \r
+ delete this[ '_anime' ];\r
};\r
return this;\r
};\r
//console.log( '開始位置 ' + phase );\r
X_Node_Anime_updatePosition( xnode, obj.startX, obj.startY, obj.startA, phase === 8 );\r
\r
- xnode[ 'dispatch' ]( { type : X_EVENT_ANIME_START, gpu : phase === 8 } );\r
+ xnode[ 'dispatch' ]( { type : X_EVENT_ANIME_START, 'gpu' : phase === 8 } );\r
++obj.phase;\r
break;\r
case 1 :\r
obj.phase = obj.gpuParent ? 10 : 4;\r
// このタイミングで animation 関連の css を削除したところ(X_Node_Anime_clearTransition)、iOS3、4 で再描画忘れが度々起きるように、、、\r
if( !obj.gpuParent ) X_Node_Anime_clearTransition( xnode );\r
- xnode[ 'dispatch' ]( { type : X_EVENT_ANIME_END, gpu : obj.gpuParent } );\r
+ xnode[ 'dispatch' ]( { type : X_EVENT_ANIME_END, 'gpu' : obj.gpuParent } );\r
break;\r
\r
case 4 :\r
X_Node_Anime_clearTransition( xnode );\r
X_Node_Anime_updatePosition( xnode, obj.destX, obj.destY, obj.destA, phase === 14 );\r
obj.phase = phase === 14 ? 10 : 4;\r
- xnode[ 'dispatch' ]( { type : X_EVENT_ANIME_END, gpu : obj.gpuParent } );\r
+ xnode[ 'dispatch' ]( { type : X_EVENT_ANIME_END, 'gpu' : obj.gpuParent } );\r
} else {\r
current = X_Node_Anime_getComputedPosition( xnode );\r
obj.startX = current.x;\r
this[ '_anime' ].phase = 3;\r
\r
X_Node_Anime_onTransition = true;\r
- this[ 'dispatch' ]( { type : X_EVENT_ANIME_END, gpu : this[ '_anime' ].gpuParent } );\r
+ this[ 'dispatch' ]( { type : X_EVENT_ANIME_END, 'gpu' : this[ '_anime' ].gpuParent } );\r
X_Node_Anime_onTransition = false;\r
\r
X_Node_Anime_needsDetection = true;\r
\r
function X_Node_Anime_gpuReleased(){\r
//console.log( 'GPU レイヤーが解放されました' );\r
- this[ 'dispatch' ]( { type : X_EVENT_GPU_RELEASED, gpu : true } );\r
+ this[ 'dispatch' ]( { type : X_EVENT_GPU_RELEASED, 'gpu' : true } );\r
};\r
\r
function X_Node_Anime_clearTransition( xnode ){\r
};\r
};\r
\r
-function X_Node_Anime_updateAnimationsNoTransition(){\r
+function X_Node_Anime_updateAnimationsNoTransition( e ){\r
var i = X_Node_ANIMATIONS.length,\r
now = X_Timer_now(),\r
obj,\r
X_Node_ANIMATIONS.splice( i, 1 );\r
\r
// filter な 親が解除されないと子要素への filter が反映されない\r
- xnode[ 'asyncDispatch' ]( { type : X_EVENT_ANIME_END, gpu : false } );\r
+ xnode[ 'asyncDispatch' ]( { type : X_EVENT_ANIME_END, 'gpu' : false } );\r
} else {\r
easing = obj.easing.fn( ( now - obj.startTime ) / obj.duration );\r
newX = ( obj.destX - obj.startX ) * easing + obj.startX;\r
};\r
};\r
\r
- if( c ){\r
+ c && console.log( 'anime... ' + X_Node_updateTimerID );\r
+ \r
+ if( X_Node_Anime_reserved = c ){\r
if( X_Node_updateTimerID ){\r
- X_System[ 'listen' ]( X_EVENT_UPDATED, X_Node_Anime_updateAnimationsNoTransition );\r
+ // scrollbox では X_System X_EVENT_UPDATED は不可。。。\r
+ !e || e.type !== X_EVENT_UPDATED ?\r
+ X_System[ 'listen' ]( X_EVENT_UPDATED, X_Node_Anime_updateAnimationsNoTransition ) :\r
+ X_Node_Anime_updateTimerID && X_Timer_cancelFrame( X_Node_Anime_updateTimerID );\r
X_Node_Anime_updateTimerID = 0;\r
} else {\r
+ X_System[ 'unlisten' ]( X_EVENT_UPDATED, X_Node_Anime_updateAnimationsNoTransition );\r
X_Node_Anime_updateTimerID = X_Timer_requestFrame( X_Node_Anime_updateAnimationsNoTransition );\r
};\r
} else {\r
+ X_System[ 'unlisten' ]( X_EVENT_UPDATED, X_Node_Anime_updateAnimationsNoTransition );\r
X_Node_Anime_updateTimerID = 0;\r
};\r
};\r
var // Opera7.6+, Safari1.2+, khtml3.?+, Gecko0.9.7+\r
// ie7 ではローカルリソースには ActiveX の XHR を使う\r
X_Net_XHR_W3C = ( !X_UA[ 'IE7' ] || !X_URL_IS_LOCAL ) && window[ 'XMLHttpRequest' ] && new XMLHttpRequest(),\r
+ X_Net_XHR_progress = false && X_Net_XHR_W3C && X_Net_XHR_W3C.onprogress !== undefined,\r
+ X_Net_XHR_upload = false && X_Net_XHR_W3C && !!X_Net_XHR_W3C.upload,\r
\r
X_Net_XHR_X_DOMAIN = window[ 'XDomainRequest' ] && new XDomainRequest(),\r
X_Net_XHR_VERSION = 0,\r
*/\r
'FLASH' : false,\r
\r
-// https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r
-// Progress Events Chrome7, firefox3.5, ie10, opera12, Safari?, Chrome for Android 0.16\r
- 'PROGRESS' : false, //\r
+/**\r
+ * https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r
+ * Progress Events Chrome7, firefox3.5, ie10, opera12, Safari?, Chrome for Android 0.16\r
+ */\r
+ 'PROGRESS' : X_Net_XHR_progress, //\r
\r
- 'UL_PROGRESS' : false,\r
+ 'UL_PROGRESS' : X_Net_XHR_upload,\r
\r
'CORS' : X_Net_XHR_X_DOMAIN || ( X_Net_XHR_W3C && X_Net_XHR_W3C.withCredentials !== undefined )\r
};\r
if( !X_Net_XHR_ACTIVE_X && X_Type_isFunction( raw.setRequestHeader ) ){\r
\r
// http://nakigao.sitemix.jp/blog/?p=2040\r
- // SafariでHTTP/412のエラー\r
- // headers[ 'If-Modified-Since' ] = ( new Date ).toUTCString();\r
+ // json 取得時に SafariでHTTP/412のエラー。但し相手が audio の場合、この指定があるとロードに失敗する。 iOS8.2, iOS7.1 では遭遇せず\r
+ if( this._type === 'json' ){\r
+ console.log( 'If-Modified-Since : ' + this._type );\r
+ headers[ 'If-Modified-Since' ] = ( new Date ).toUTCString();\r
+ };\r
\r
for( p in headers ){\r
if( X_EMPTY_OBJECT[ p ] ) continue;\r
// Timeout した Gecko の xhr.response に触るとエラー??\r
if( X_UA[ 'Opera' ] || X_UA[ 'Webkit' ] || X_UA[ 'Gecko' ] ){\r
if( this._error ){\r
+ \r
+ if( X_Net_XHR_upload ){\r
+ this[ '_rawObject' ].upload.removeEventListener( 'progress', X_NET_XHRWrapper.onUploadProgress );\r
+ };\r
+ \r
X_EventDispatcher_toggleAllEvents( this, false );\r
this[ '_rawObject' ] = new XMLHttpRequest();\r
X_EventDispatcher_toggleAllEvents( this, true );\r
+ \r
+ if( X_Net_XHR_upload ){\r
+ this[ '_rawObject' ].upload.addEventListener( 'progress', X_NET_XHRWrapper.onUploadProgress );\r
+ };\r
};\r
};\r
\r
this._timerID = 0;\r
},\r
\r
- onUploadProgress : X[ 'Net' ][ 'XHR' ][ 'UL_PROGRESS' ] && function( e ){\r
+ onUploadProgress : X_Net_XHR_upload && function( e ){\r
var raw = X_NET_XHRWrapper[ '_rawObject' ].upload,\r
live = !X_NET_XHRWrapper._canceled,\r
states, data;\r
if( X_Net_XHR_ACTIVE_X ){ // win ie5-6\r
X_NET_XHRWrapper[ 'listen' ]( 'readystatechange' );\r
} else \r
- if( X[ 'Net' ][ 'XHR' ][ 'PROGRESS' ] ){\r
+ if( X_Net_XHR_progress ){\r
X_NET_XHRWrapper[ 'listen' ]( [ 'load', 'progress', 'error', 'timeout' ] ); //, 'abort'\r
} else {\r
X_NET_XHRWrapper[ 'listen' ]( [ 'load', 'readystatechange', 'error', 'timeout' ] ); //, 'abort'\r
};\r
\r
- if( X_NET_XHRWrapper.onUploadProgress ){\r
+ if( X_Net_XHR_upload ){\r
X_NET_XHRWrapper[ '_rawObject' ].upload.addEventListener( 'progress', X_NET_XHRWrapper.onUploadProgress );\r
};\r
};\r
}
);
+ /*
+ * http://qiita.com/sou/items/5688d4e7d3a37b4e2ff1
+ * L-01F 等の一部端末で Web Audio API の再生結果に特定条件下でノイズが混ざることがある。
+ * 描画レート(描画 FPS)が下がるとノイズが混ざり始め、レートを上げると再生結果が正常になるというもので、オーディオ処理が描画スレッドに巻き込まれているような動作を見せる。
+ */
+ if( X_UA[ 'Android' ] && X_UA[ 'Chrome' ] ){
+ X_Node_systemNode.create( 'div', { id : 'fps-slowdown-make-sound-noisy' } );
+ };
X_Audio_BACKENDS.push(
{
X_UI_rootData[ 'listenOnce' ]( X.UI.Event.LAYOUT_COMPLETE, this, X_UI_ScrollBox_onLayoutComplete );\r
};\r
},\r
- \r
- scrollBy : function( x, y, opt_time, opt_easing ){\r
- this.scrollTo( this.scrollX + x, this.scrollY + y, opt_time, opt_easing );\r
- },\r
\r
scrollTo : function( x, y, opt_time, opt_easing, opt_release ){\r
//if( this.scrollX === x && this.scrollY === y ) return;\r
// scroll の停止、GPU の解除\r
var font = this.fontSize = this._containerXNode.call( 'fontSize' );\r
\r
- this.maxScrollX = ( this.boxWidth - this._containerNode.boxWidth ) * font;\r
- this.maxScrollY = ( this.boxHeight - this._containerNode.boxHeight ) * font;\r
+ this.maxScrollX = ( this.boxWidth - this._containerNode.boxWidth ) * font | 0;\r
+ this.maxScrollY = ( this.boxHeight - this._containerNode.boxHeight ) * font | 0;\r
\r
this.hasHScroll = this.scrollXEnabled && this.maxScrollX < 0;\r
this.hasVScroll = this.scrollYEnabled && this.maxScrollY < 0;\r
easing = '',\r
newX, newY,\r
momentumX, momentumY,\r
- duration, distanceX, distanceY, font;\r
+ duration, distanceX, distanceY;\r
\r
this[ 'unlisten' ]( X.UI.Event._POINTER_MOVE, this, X_UI_ScrollBox_onMove );\r
this[ 'unlisten' ]( [ X.UI.Event._POINTER_UP, X.UI.Event._POINTER_CANCEL ], this, X_UI_ScrollBox_onEnd );\r
// we scrolled less than 10 pixels\r
if( !this.moved ){\r
// this[ 'dispatch' ]( X_EVENT_CANCELED );\r
+ console.log( 'we scrolled less than 10 pixels' );\r
return ret;\r
};\r
\r
// start momentum animation if needed\r
if( this.momentumEnabled && duration < 300 ){\r
- font = this.fontSize;\r
momentumX = this.hasHScroll ?\r
- X_UI_ScrollBox_momentum( this.scrollX, this.startX, duration, this.maxScrollX, this.bounceEnabled ? this.boxWidth * font : 0, this.deceleration ) :\r
+ X_UI_ScrollBox_momentum( this.scrollX, this.startX, duration, this.maxScrollX, this.bounceEnabled ? this.boxWidth * this.fontSize : 0, this.deceleration ) :\r
{ destination: newX, duration: 0 };\r
momentumY = this.hasVScroll ?\r
- X_UI_ScrollBox_momentum( this.scrollY, this.startY, duration, this.maxScrollY, this.bounceEnabled ? this.boxHeight * font : 0, this.deceleration ) :\r
+ X_UI_ScrollBox_momentum( this.scrollY, this.startY, duration, this.maxScrollY, this.bounceEnabled ? this.boxHeight * this.fontSize : 0, this.deceleration ) :\r
{ destination: newY, duration: 0 };\r
newX = momentumX.destination;\r
newY = momentumY.destination;\r
time = Math.max( momentumX.duration, momentumY.duration ) | 0;\r
this.isInTransition = true;\r
} else {\r
- //console.log( '慣性無し' );\r
+ console.log( '慣性無し' );\r
};\r
\r
if( newX != this.scrollX || newY != this.scrollY ){\r
easing = 'quadratic';\r
};\r
\r
- //console.log( 'end2 x:' + newX + ' y:' + newY + ' t:' + time );\r
+ console.log( 'end2 x:' + newX + ' y:' + newY + ' t:' + time );\r
this.scrollTo( newX, newY, time, easing, 1000 );\r
return ret;\r
};\r
\r
- //console.log( 'end1 x:' + newX + ' y:' + newY );\r
+ console.log( 'end1 x:' + newX + ' y:' + newY );\r
this.scrollTo( newX, newY, 0, '', 1000 ); // ensures that the last position is rounded\r
\r
this[ 'dispatch' ]( X.UI.Event.SCROLL_END );\r
};\r
\r
if( x === that.scrollX && y === that.scrollY ){\r
- //console.log( 'no バウンド y:' + y + ' max:' + that.maxScrollY );\r
+ console.log( 'no バウンド y:' + y + ' max:' + that.maxScrollY );\r
return false;\r
};\r
\r
if( e.target !== this._containerXNode || !this.isInTransition ){\r
return X_Callback_NONE;\r
};\r
- //this.xnodeScroller.stop();\r
if( !X_UI_ScrollBox_resetPosition( this, this.bounceTime ) ){\r
this.isInTransition = false;\r
this.dispatch( X.UI.Event.SCROLL_END );\r
X_UI_eventBusy = false;
function X_UI_eventRellay( e ){
- var font = X[ 'ViewPort' ][ 'getBaseFontSize' ](),
+ var font = X_ViewPort_baseFontSize,
x = e.clientX / font,
y = e.clientY / font,
type = X.UI.Event.NameToID[ e.type ],
} );
// hover や rollover rollout のための move イベントの追加
- this.xnodeInteractiveLayer[ 'listen' ]( 'pointermove', X_UI_eventRellay );
+ ( X.UA.IE < 9 ? X_ViewPort_document : X_ViewPort )[ 'listen' ]( 'pointermove', X_UI_eventRellay );
if( counter[ X.UI.Event._POINTER_MOVE ] ){
++counter[ X.UI.Event._POINTER_MOVE ];
} else {