})();\r
\r
console.log( 'HTML5? ' + X_UA_ATagWrapDiv ); */\r
-\r
-var X_Script_VBS_ENABLED = X_UA[ 'Windows' ] && !X_UA[ 'WinCE' ] && !X_UA[ 'WinPhone' ] && X_UA[ 'IE' ] < 11,\r
- // 構文のサポート instanceof, in(for-in ではない), try-catch. JS version 1.5以上\r
- X_Script_gte15 = !( X_UA[ 'IE' ] < 5.5 ) && ( new Function( 'f,a', 'try{return f.apply({},a)}catch(e){}' ) );\r
-\r
-/**\r
- * js バージョン間の際を吸収\r
- * @namespace X.Script\r
- * @alias X.Script\r
- * @type {object}\r
- */\r
-X[ 'Script' ] = {\r
- 'tryCatch' : X_Script_try\r
-};\r
-\r
-if( X_Script_VBS_ENABLED ){\r
- X_Script_gte15 || document.write( '<script type=text/vbscript>' +\r
- [\r
- 'Function vbs_testAXO(v)',\r
- 'On Error Resume Next',\r
- 'Set ax = CreateObject(v)',\r
- 'If Err.Number Then',\r
- 'ax = 1',\r
- 'End If',\r
- 'Err.Clear',\r
- 'vbs_testAXO = ax',\r
- 'End Function' /*,\r
- \r
- 'Function vbs_try(jsFunc,a1,a2,a3,a4)',\r
- 'On Error Resume Next',\r
- 'Set rs = jsFunc(a1,a2,a3,a4)',\r
- 'If Err.Number != 0 Then',\r
- 'rs = 0',\r
- 'End If',\r
- 'Err.Clear',\r
- 'vbs_try = rs',\r
- 'End Function'\r
- \r
- // elementID .SRC = v\r
- 'Function vbs_setValue(id,k,v)',\r
- 'On Error Resume Next',\r
- 'Set rs = 1',\r
- 'Document.all[id][k]=v',\r
- 'If Err.Number != 0 Then',\r
- 'rs = 0',\r
- 'End If',\r
- 'Err.Clear',\r
- 'vbs_try = rs',\r
- 'End Function'\r
-\r
- * \r
- * \r
- * */\r
- ].join( '\n' ) + '</script>' );\r
-\r
- // TODO Object のメンバを辿る vba\r
- // byte Array を扱う vba\r
-};\r
-\r
-function X_Script_try( func, args ){\r
- if( !X_Script_gte15 ){\r
- //return func.apply( {}, args );\r
- return;\r
- };\r
- return X_Script_gte15( func, args || [] );\r
-};\r
-\r
-function X_Script_createActiveXObjectSafty( name ){\r
- if( !X_Script_gte15 ){\r
- if( X_Script_VBS_ENABLED ){\r
- // console.log( window[ 'vbs_testAXO' ]( name ) + ' ' + name );\r
- return !window[ 'vbs_testAXO' ]( name ) && X_Script_createActiveXObject( name );\r
- };\r
- return X_Script_createActiveXObject( name );\r
- };\r
- \r
- return X_Script_try( X_Script_createActiveXObject, [ name ] );\r
-};\r
-\r
-// TODO GeckoActiveX\r
-function X_Script_createActiveXObject( name ){\r
- return new ActiveXObject( name );\r
-};\r
-\r
-/*\r
- * http://archiva.jp/web/html-css/ie6_background_flickr.html\r
- * hover時の背景画像ちらつきに対処する\r
- * この問題はIE6固有の問題であり、他のモダンブラウザやIE5等では発現しない。\r
- */\r
-if( X_UA[ 'IE6' ] && // error @ NN7.2\r
- !X_Script_try( function(){ document.execCommand( 'BackgroundImageCache', false, true ); return 1; } ) ){\r
- /**\r
- * ie6 のみで実行する document.execCommand( 'BackgroundImageCache', false, true ) の失敗。\r
- * bonus: hotfix for IE6 SP1 (bug KB823727)\r
- * multipleIEs IE6 standalone 版では不可, IE5.5 は可,,,\r
- * @alias X.UA.ieExeComError */\r
- X_UA[ 'ieExeComError' ] = true;\r
-};\r
-\r
--- /dev/null
+var X_Script_VBS_ENABLED = X_UA[ 'Windows' ] && !X_UA[ 'WinCE' ] && !X_UA[ 'WinPhone' ] && X_UA[ 'IE' ] < 11,\r
+ // 構文のサポート instanceof, in(for-in ではない), try-catch. JS version 1.5以上\r
+ X_Script_gte15 = !( X_UA[ 'IE' ] < 5.5 ) && ( new Function( 'f,a', 'try{return f.apply({},a)}catch(e){}' ) );\r
+\r
+/**\r
+ * js バージョン間の差異を可能な限り吸収する\r
+ * @namespace X.Script\r
+ * @alias X.Script\r
+ * @type {object}\r
+ */\r
+X[ 'Script' ] = {\r
+ 'tryCatch' : X_Script_try\r
+ \r
+ // git, strict mode, asm.js, \r
+};\r
+\r
+if( X_Script_VBS_ENABLED ){\r
+ \r
+/**\r
+ * Visual Basic Script が使えるか?\r
+ * @alias X.Script.VBS\r
+ * @type {boolean}\r
+ */\r
+ X[ 'Script' ][ 'VBS' ] = true;\r
+ \r
+ X_Script_gte15 || document.write( '<script type=text/vbscript>' +\r
+ [\r
+ 'Function vbs_testAXO(v)',\r
+ 'On Error Resume Next',\r
+ 'Set ax = CreateObject(v)',\r
+ 'If Err.Number Then',\r
+ 'ax = 1',\r
+ 'End If',\r
+ 'Err.Clear',\r
+ 'vbs_testAXO = ax',\r
+ 'End Function' /*,\r
+ \r
+ 'Function vbs_try(jsFunc,a1,a2,a3,a4)',\r
+ 'On Error Resume Next',\r
+ 'Set rs = jsFunc(a1,a2,a3,a4)',\r
+ 'If Err.Number != 0 Then',\r
+ 'rs = 0',\r
+ 'End If',\r
+ 'Err.Clear',\r
+ 'vbs_try = rs',\r
+ 'End Function'\r
+ \r
+ // elementID .SRC = v\r
+ 'Function vbs_setValue(id,k,v)',\r
+ 'On Error Resume Next',\r
+ 'Set rs = 1',\r
+ 'Document.all[id][k]=v',\r
+ 'If Err.Number != 0 Then',\r
+ 'rs = 0',\r
+ 'End If',\r
+ 'Err.Clear',\r
+ 'vbs_try = rs',\r
+ 'End Function'\r
+\r
+ * \r
+ * \r
+ * */\r
+ ].join( '\n' ) + '</script>' );\r
+\r
+ // TODO Object のメンバを辿る vba\r
+ // byte Array を扱う vba\r
+};\r
+\r
+function X_Script_try( func, args ){\r
+ if( !X_Script_gte15 ){\r
+ //return func.apply( {}, args );\r
+ return;\r
+ };\r
+ return X_Script_gte15( func, args || [] );\r
+};\r
+\r
+function X_Script_createActiveXObjectSafty( name ){\r
+ if( !X_Script_gte15 ){\r
+ if( X_Script_VBS_ENABLED ){\r
+ // console.log( window[ 'vbs_testAXO' ]( name ) + ' ' + name );\r
+ return !window[ 'vbs_testAXO' ]( name ) && X_Script_createActiveXObject( name );\r
+ };\r
+ return X_Script_createActiveXObject( name );\r
+ };\r
+ \r
+ return X_Script_try( X_Script_createActiveXObject, [ name ] );\r
+};\r
+\r
+// TODO GeckoActiveX\r
+function X_Script_createActiveXObject( name ){\r
+ return new ActiveXObject( name );\r
+};\r
+\r
+/*\r
+ * http://archiva.jp/web/html-css/ie6_background_flickr.html\r
+ * hover時の背景画像ちらつきに対処する\r
+ * この問題はIE6固有の問題であり、他のモダンブラウザやIE5等では発現しない。\r
+ */\r
+if( X_UA[ 'IE6' ] && // error @ NN7.2\r
+ !X_Script_try( function(){ document.execCommand( 'BackgroundImageCache', false, true ); return 1; } ) ){\r
+ /**\r
+ * ie6 のみで実行する document.execCommand( 'BackgroundImageCache', false, true ) の失敗。\r
+ * bonus: hotfix for IE6 SP1 (bug KB823727)\r
+ * multipleIEs IE6 standalone 版では不可, IE5.5 は可,,,\r
+ * @alias X.UA.ieExeComError */\r
+ X_UA[ 'ieExeComError' ] = true;\r
+};\r
+\r
+\r
for( j = vendors.length; j; ){
v = vendors[ --j ];
if( testStyle[ v + prop ] !== undefined ){
- if( v === 'ms' ) v = 'Ms';// for ie9
+ if( v === 'ms' && !( 10 <= X_UA[ 'IEHost' ] ) ) v = 'Ms';// for ie9, 但し ie11 のieには不要
if( v === 'o' ) v = 'O';//for opera12
X_Node_CSS_VENDER_PREFIX[ search ] = v + prop;
break;
\r
function X_Node_Anime_getComputedPosition( that ){\r
var raw = that[ '_rawObject' ],\r
- x = 0, y = 0, a = 1, matrix;\r
+ x = NaN, y = NaN, a = 1, style, matrix;\r
\r
if( raw ){\r
if( X_Node_Anime_hasTransform ){\r
- matrix = X_Node_CSS_getComputedStyle( raw, null );\r
- matrix = matrix[ X_Node_CSS_VENDER_PREFIX[ 'transform' ] ].split( ')' )[ 0 ].split( ', ' );\r
- x = + ( matrix[ 12 ] || matrix[ 4 ] );\r
- y = + ( matrix[ 13 ] || matrix[ 5 ] );\r
- a = matrix[ X_Node_CSS_Support[ 'opacity' ] ];\r
+ if( style = X_Node_CSS_getComputedStyle( raw, null ) ){\r
+ matrix = ( style[ X_Node_CSS_VENDER_PREFIX[ 'transform' ] ] || '' ).split( ')' )[ 0 ].split( ', ' );\r
+ x = + ( matrix[ 12 ] || matrix[ 4 ] );\r
+ y = + ( matrix[ 13 ] || matrix[ 5 ] );\r
+ a = matrix[ X_Node_CSS_Support[ 'opacity' ] ]; \r
+ };\r
} else\r
if( X_Node_CSS_getComputedStyle ){\r
- matrix = X_Node_CSS_getComputedStyle( raw, null );\r
- x = parseFloat( matrix[ 'left' ] );\r
- y = parseFloat( matrix[ 'top' ] );\r
- a = matrix[ X_Node_CSS_Support[ 'opacity' ] ];\r
+ if( style = X_Node_CSS_getComputedStyle( raw, null ) ){\r
+ x = parseFloat( style[ 'left' ] );\r
+ y = parseFloat( style[ 'top' ] );\r
+ a = parseFloat( style[ X_Node_CSS_Support[ 'opacity' ] ] ); \r
+ };\r
} else\r
- if( matrix = raw.currentStyle || raw.style ){\r
- x = parseFloat( matrix[ 'left' ] );\r
- y = parseFloat( matrix[ 'top' ] );\r
- a = matrix[ 'opacity' ];\r
- }; \r
+ if( style = ( raw.currentStyle || raw.style ) ){\r
+ x = parseFloat( style[ 'left' ] );\r
+ y = parseFloat( style[ 'top' ] );\r
+ a = parseFloat( ( style[ 'filter' ] || 'opacity=1' ).split( 'opacity=' )[ 1 ] );\r
+ };\r
};\r
\r
return { x : x, y : y, a : a };\r
case 'treeIsDirty' :
return !!X_Node_updateTimerID;
case 'fontSize' :
- return X_Node_CSS_getCharSize( this );
+ return this.parent ? X_Node_CSS_getCharSize( this ) : 0;
case 'inGPU' :
return !!( this[ '_flags' ] & ( X_NodeFlags_GPU_NOW | X_NodeFlags_GPU_RELEASE_RESERVED ) );
};
\r
canPlay : {\r
'mp3' : true,\r
+ 'm4a' : true,\r
'wma' : true,\r
'wav' : true\r
},\r
detect : function( proxy, source, ext ){\r
// TODO source = .mp3#CBR\r
// 得意度で返す\r
- proxy[ 'asyncDispatch' ]( { type : X_EVENT_COMPLETE, canPlay : ext === 'mp3' || ext === 'wma' || ext === 'wav' } ); \r
+ proxy[ 'asyncDispatch' ]( { type : X_EVENT_COMPLETE, canPlay : ext === 'mp3' || ext === 'm4a' || ext === 'wma' || ext === 'wav' } ); \r
},\r
\r
klass : X_SLAudio\r
canPlay : {
'mp3' : true,
+ 'm4a' : true,
'wma' : true,
'wav' : true,
'mid' : true,
},
detect : function( proxy, source, ext ){
- proxy[ 'asyncDispatch' ]( { type : X_EVENT_COMPLETE, canPlay : 0 <= 'mp3 wma wav midi snd au aiff aicf'.indexOf( ext ) } );
+ proxy[ 'asyncDispatch' ]( { type : X_EVENT_COMPLETE, canPlay : 0 <= 'mp3 m4a wma wav midi snd au aiff aicf'.indexOf( ext ) } );
},
klass : X_WMPAudio
\r
if( !isStart && !hammer.gestureStartEvent ) return;\r
\r
-if( type === XUI_Event.POINTER_OUT ) console.log( 'gestureCanceled ...' + e.button )\r
-\r
if( isEnd ){\r
if( XUI_Gesture_POINTERS[ uid ] ){\r
delete XUI_Gesture_POINTERS[ uid ];\r
//console.log( '-3-' );\r
this[ 'dispatch' ]( XUI_Event.SCROLL_END ); \r
};\r
+\r
return ret | X_CALLBACK_PREVENT_DEFAULT | X_CALLBACK_RELEASE_POINTER;\r
};\r
\r
-var XUI_rootData = null,
- XUI_xnodeIneraction = null,
- XUI_UINODES_HOVER = [],
- XUI_EVENT_COUNTER = {},
- XUI_uinodeTarget = null,
+var XUI_rootData = null,
+ XUI_xnodeIneraction = null,
+ XUI_mousemoveFix = X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ],
+ XUI_mousemoveFixOn = 0,
+ XUI_mousemoveFixX = 0,
+ XUI_mousemoveFixY = 0,
+ XUI_mousemoveFixLast = null,
+ XUI_UINODES_HOVER = [],
+ XUI_EVENT_COUNTER = {},
+ XUI_uinodeTarget = null,
XUI_xnodeInteractionOverlay,
- XUI_interactionBusy = false;
+ XUI_interactionBusy = false;
+
+function XUI_mousemoveFixResetScroll(){
+ var raw = XUI_xnodeInteractionOverlay[ '_rawObject' ];
+
+ if( XUI_mousemoveFix ){
+ XUI_mousemoveFixX = raw.scrollLeft = raw.offsetWidth;
+ XUI_mousemoveFixY = raw.scrollTop = raw.offsetHeight;
+ };
+};
+
+function XUI_mousemoveFixScrollEnd(){
+ var raw = XUI_xnodeInteractionOverlay[ '_rawObject' ];
+
+ XUI_mousemoveFixOn = 0;
+ XUI_mousemoveFixLast.type = 'pointerup';
+ X_UI_eventRellay( XUI_mousemoveFixLast );
+
+ raw.scrollLeft = XUI_mousemoveFixX;
+ raw.scrollTop = XUI_mousemoveFixY;
+};
function X_UI_eventRellay( e ){
var font = X_ViewPort_baseFontSize,
- x = e.pageX / font, // clientX は iOS4- で通らない?
- y = e.pageY / font,
+ x = e.pageX, // clientX は iOS4- で通らない?
+ y = e.pageY,
type = XUI_Event.NameToID[ e.type ],
i = 0,
data = XUI_rootData,
sysOnly = false,
ret = X_CALLBACK_NONE,
- list, parent, _ret, eventIn, eventOut;
+ list = XUI_UINODES_HOVER,
+ raw, parent, _ret, eventIn, eventOut;
- // mouseup で alert を出すと mouseleave が発生、ということでイベント中のイベント発火を禁止
- if( !data || XUI_interactionBusy ) return ret;
+ // mouseup で alert を出すと mouseleave が発生、ということでイベント中のイベント発火を禁止
+ if( XUI_interactionBusy ) return ret;
XUI_interactionBusy = true;
+ if( XUI_mousemoveFix ){
+ if( e.type === 'scroll' ){
+ raw = XUI_xnodeInteractionOverlay[ '_rawObject' ];
+ type = XUI_mousemoveFixOn ? XUI_Event._POINTER_MOVE : XUI_Event._POINTER_DOWN;
+ x = XUI_mousemoveFixX - raw.scrollLeft;
+ y = XUI_mousemoveFixY - raw.scrollTop;
+ e.pageX = x;
+ e.pageY = y;
+ e[ 'button' ] = 0;
+ e[ 'timestamp' ] = e[ 'timeStamp' ];
+ e[ 'pointerId' ] = 1;
+ e[ 'pointerType' ] = 'mouse';
+
+ XUI_mousemoveFixOn && X_Timer_remove( XUI_mousemoveFixOn );
+ XUI_mousemoveFixOn = X_Timer_once( 250, XUI_mousemoveFixScrollEnd );
+ XUI_mousemoveFixLast = X_Object_copy( e );
+ };
+ };
+
e = X_Object_copy( e );
e.type = type;
- // TODO capture は pointer 毎に!
- list = XUI_UINODES_HOVER;
- ( XUI_uinodeTarget = XUI_rootData ).capcher( x, y );
- data = XUI_uinodeTarget;
+ // capture は pointer 毎に!
+ data.capcher( x / font, y / font );
+ data = XUI_uinodeTarget || data;
while( data ){
- _ret = data[ 'dispatch' ]( e, sysOnly );
+ _ret = data[ 'dispatch' ]( e, sysOnly ) || X_CALLBACK_NONE;
ret |= _ret;
if( type < XUI_Event._START_BUBLEUP || ret & X_CALLBACK_STOP_PROPAGATION ){
break;
},
start : function(){
-
-
this.initialize( this.User, this, null, null );
X_Timer_once( 0, this, this.addToView );
},
addToView : function(){
// XUI_xnodeInteractionOverlay の前に追加する!
this.addToParent( X_Node_body );
-
+
XUI_xnodeInteractionOverlay = X_Node_body.create( 'div', {
- 'class' : 'mouse-operation-catcher',
+ 'class' : XUI_mousemoveFix ? 'mouse-operation-catcher-scrollFix' : 'mouse-operation-catcher',
unselectable : 'on'
} );
// hover や rollover rollout のための move イベントの追加
// TODO この切り替えを ViewPort へ
XUI_xnodeIneraction = ( X_UA[ 'IE' ] < 9 ? X_ViewPort_document : X_UA[ 'Opera' ] < 8 ? X_Node_body : X_ViewPort );
- XUI_xnodeIneraction[ 'listen' ]( 'pointermove', X_UI_eventRellay );
+
+ if( XUI_mousemoveFix ){
+ XUI_xnodeInteractionOverlay[ 'listen' ]( [ 'scroll', 'mouseup' ], X_UI_eventRellay )[ 'create' ]( 'div' );
+ } else {
+ XUI_xnodeIneraction[ 'listen' ]( 'pointermove', X_UI_eventRellay );
+ };
if( XUI_EVENT_COUNTER[ XUI_Event._POINTER_MOVE ] ){
++XUI_EVENT_COUNTER[ XUI_Event._POINTER_MOVE ];
},
reserveCalc : function(){
- if( this.calcReserved === false ){
+ if( !this.calcReserved ){
this.calcReserved = true;
X_Timer_once( 0, this, this.calculate );
};
return X_CALLBACK_NONE;
};
+ XUI_mousemoveFix && XUI_mousemoveFixResetScroll();
+
size = X[ 'ViewPort' ][ 'getSize' ]();
font = X[ 'ViewPort' ][ 'getBaseFontSize' ]();
this.layout.calculate( this, false, 0, 0, size[ 0 ] / font, size[ 1 ] / font );
'js/01_core/01_X.js',\r
'js/01_core/02_XUA.js',\r
\r
- 'js/01_core/03_XType.js',\r
- 'js/01_core/04_XObject.js',\r
- 'js/01_core/05_XArray.js',\r
- 'js/01_core/06_XString.js',\r
- 'js/01_core/08_XURL.js',\r
+ 'js/01_core/03_XScript.js',\r
+ 'js/01_core/04_XType.js',\r
+ 'js/01_core/05_XObject.js',\r
+ 'js/01_core/06_XArray.js',\r
+ 'js/01_core/07_XString.js',\r
+ 'js/01_core/09_XURL.js',\r
\r
'js/01_core/10_XPair.js',\r
'js/01_core/11_XCallback.js',\r