<script type="text/javascript" src="js/20_ui/13_TileBox.js"></script>\r
<script type="text/javascript" src="js/20_ui/14_ChromeBox.js"></script>\r
<script type="text/javascript" src="js/20_ui/15_ScrollBox.js"></script>\r
+<script type="text/javascript" src="js/20_ui/16_Repeater.js"></script>\r
+<script type="text/javascript" src="js/20_ui/17_List.js"></script>\r
<script type="text/javascript" src="js/20_ui/17_Text.js"></script>\r
<script type="text/javascript" src="js/20_ui/20_PageRoot.js"></script>\r
\r
tridentToVer = X_UA[ 'Trident' ] ? ( X_UA[ 'Trident' ] + 4 | 0 ) : X_UA[ '_IE' ];\r
/**\r
* IE10 以上の互換モードを使用している場合、そのバージョン\r
- * @alias X.UA.IECompat\r
+ * @alias X.UA.IEHost\r
* @type {number}\r
*/\r
- if( tridentToVer !== X_UA[ '_IE' ] ) X_UA[ 'IECompat' ] = tridentToVer;\r
+ if( tridentToVer !== X_UA[ '_IE' ] ) X_UA[ 'IEHost' ] = tridentToVer;\r
/**\r
* documentモードを考慮したIEのバージョン\r
* @alias X.UA.IE\r
*/\r
if( dua.toLowerCase().indexOf( 'windows phone' ) !== -1 || 0 < dav.indexOf( 'ZuneWP' ) ) X_UA[ 'WinPhone' ] = true; // ZuneWP は IEM のデスクトップモードで登場する\r
\r
- console.log( '>> IE : ' + v + ' ActiveX : ' + X_UA[ 'ActiveX' ] + ' IEHost : ' + X_UA[ 'IECompat' ] );\r
+ console.log( '>> IE : ' + v + ' ActiveX : ' + X_UA[ 'ActiveX' ] + ' IEHost : ' + X_UA[ 'IEHost' ] );\r
// TODO XBox360, XBox1, Modern or Desktop, Standalone\r
return;\r
};\r
} else {\r
X_UA_EVENT.DOM0 = true;\r
};\r
-} else\r
-if( document.layers ){\r
- \r
-} else {\r
- \r
};\r
\r
if( navigator.msPointerEnabled || navigator.pointerEnabled ) X_UA_HID.POINTER = true;\r
* @alias X.Object\r
*/\r
X[ 'Object' ] = {\r
- // TODO rename to copy\r
- 'clone' : X_Object_clone,\r
+\r
+ 'copy' : X_Object_copy,\r
+ \r
+ 'deepCopy' : X_Object_deepCopy,\r
\r
'override' : X_Object_override,\r
\r
'clear' : X_Object_clear,\r
\r
- 'deepCopy' : X_Object_deepCopy,\r
- \r
- // TODO rename to X.Array.copy\r
- 'cloneArray' : X_Object_cloneArray,\r
- \r
'isEmpty' : X_Object_isEmpty,\r
\r
'inObject' : X_Object_inObject\r
// ------------------------------------------------------------------------- //\r
/**\r
* 単純なクローンでメンバーをコピーしたオブジェクトを返します。 k in null でエラーになる Opera7- に対策済。\r
- * @alias X.Object.clone\r
+ * @alias X.Object.copy\r
* @param {object|Array} src コピー元のオブジェクトです。\r
* @return {object|Array}\r
*/\r
-function X_Object_clone( src ){\r
+function X_Object_copy( src ){\r
var ret, k;\r
\r
if( !src || !X_Type_isObject( src ) ) return src;\r
};\r
\r
/**\r
- * 単純にメンバーをコピーした Array を返します。\r
- * @alias X.Object.cloneArray\r
- * @param {Array} ary コピー元のオブジェクトです。\r
- * @return {Array}\r
- */\r
-function X_Object_cloneArray( ary ){\r
- var ret = [],\r
- i = ary.length;\r
-\r
- if( !i ) return ret;\r
- for( ; i; ){\r
- ret[ --i ] = ary[ i ];\r
- };\r
- return ret;\r
-};\r
-\r
-/**\r
* object が空か?調べます。 object でない場合、undefined が返る\r
* @alias X.Object.isEmpty\r
* @param {object} v \r
return true;\r
};\r
\r
-/* \r
-X.matchTest = function( array1, array2 ){\r
- var i = array2.length;\r
- for( ; i; ){\r
- if( array1.indexOf( array2[ --i ] ) === -1 ) return false;\r
- };\r
- return true;\r
-}; */\r
+/**\r
+ * Array に関するメソッドを集めたものです。\r
+ * @namespace X.Array\r
+ * @alias X.Array\r
+ */\r
+X[ 'Array' ] = {\r
+ 'copy' : X_Array_copy\r
+};\r
+\r
+// renamed\r
+// X.Object.cloneArray -> X.Array.copy\r
+// X.Object.clone -> X.Object.copy\r
+\r
+/**\r
+ * 単純にメンバーをコピーした Array を返します。\r
+ * @alias X.Array.copy\r
+ * @param {Array} ary コピー元のオブジェクトです。\r
+ * @return {Array}\r
+ */\r
+function X_Array_copy( ary ){\r
+ var ret = [],\r
+ i = ary.length;\r
+\r
+ if( !i ) return ret;\r
+ for( ; i; ){\r
+ ret[ --i ] = ary[ i ];\r
+ };\r
+ return ret;\r
+};\r
+\r
+/* \r
+X.matchTest = function( array1, array2 ){\r
+ var i = array2.length;\r
+ for( ; i; ){\r
+ if( array1.indexOf( array2[ --i ] ) === -1 ) return false;\r
+ };\r
+ return true;\r
+}; */\r
+\r
case 4 :\r
return sFunc.call( this, args[ 1 ], args[ 2 ], args[ 3 ] );\r
default :\r
- args = X_Object_cloneArray( args );\r
+ args = X_Array_copy( args );\r
args.shift();\r
return sFunc.apply( this, args );\r
};\r
* );\r
*/\r
function X_Class_create( /* displayName, classSetting, privateClass, props */ ){\r
- var args = X_Object_cloneArray( arguments ),\r
+ var args = X_Array_copy( arguments ),\r
displayName = args[ 0 ],\r
classSetting,\r
opt_pool, opt_abstract, opt_final,\r
* @return {__ClassBase__}\r
*/\r
function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props */ ){\r
- var args = X_Object_cloneArray( arguments ),\r
+ var args = X_Array_copy( arguments ),\r
params = [],\r
Super = this,\r
superDef = X_Class_getClassDef( Super ),\r
// http://www.programming-magic.com/20090127231544/\r
// Opera で button==2の場合、コンテキストメニューイベントを発火 「ツール」->「設定」->「詳細設定」->「コンテンツ」->「Javascriptオプション」で「右クリックを制御するスクリプトを許可する」\r
if( originalType === 'mousedown' && this[ 'button' ] === 2 && X_UA[ 'Opera' ] ){\r
- events = [ X_Object_clone( this ), X_Object_clone( this ) ];\r
+ events = [ X_Object_copy( this ), X_Object_copy( this ) ];\r
events[ 1 ].type = 'contextmenu';\r
return events;\r
};\r
i = 0, args;\r
\r
if( 1 < arguments.length ){\r
- args = X_Object_cloneArray( arguments );\r
+ args = X_Array_copy( arguments );\r
for( ; i < l; ++i ){\r
args[ 0 ] = i;\r
if( func.apply( this[ i ], args ) === false ) break;\r
var xnode, xnodes, i, l;
if( this[ '_tag' ] ){
X_Node_newByTag = true;
- xnode = Node( this[ '_tag' ], X_Object_clone( this[ '_attrs' ] ), X_Object_clone( this[ '_css' ] ) )
+ xnode = Node( this[ '_tag' ], X_Object_copy( this[ '_attrs' ] ), X_Object_copy( this[ '_css' ] ) )
[ 'attr' ]( { 'id' : this[ '_id' ] } )
[ 'className' ]( this[ '_className' ] );
if( opt_clone_children && ( xnodes = this[ '_xnodes' ] ) && ( l = xnodes.length ) ){
func = raw[ name ];
if( X_Type_isFunction( func ) ){
if( l ){
- args = X_Object_cloneArray( arguments );
+ args = X_Array_copy( arguments );
args.shift();
return func.apply( raw, args );
};
// typeof func === unknown に対策
// http://la.ma.la/blog/diary_200509031529.htm
if( l ){
- args = X_Object_cloneArray( arguments );
+ args = X_Array_copy( arguments );
args.shift();
params = [];
function X_Node_each( func /*, opt_args */ ){
var args;
if( 1 < arguments.length ){
- args = X_Object_cloneArray( arguments );
+ args = X_Array_copy( arguments );
args[ 0 ] = 0;
func.apply( this, args );
} else {
//X_UA[ 'MacIE' ] && alert( body.innerHTML );\r
// cleanup tree \r
function cleanUpTree( elm, skip, head ){\r
- var nodes = X_Object_cloneArray( elm.childNodes ),\r
+ var nodes = X_Array_copy( elm.childNodes ),\r
i = 0,\r
l = nodes.length,\r
node, tag, textNode, content;\r
};\r
\r
X_TEMP.asyncCreateTree = function( parent, elems, elmProgress, async ){\r
- var xnodes = async ? 0 : X_Object_cloneArray( parent[ '_xnodes' ] ),\r
+ var xnodes = async ? 0 : X_Array_copy( parent[ '_xnodes' ] ),\r
l = async ? 0 : xnodes.length,\r
stack = async ? async.stack : [],\r
done = async ? async.done : 0,\r
xnodes : xnodes,\r
l : l,\r
i : 0,\r
- elems : X_Object_cloneArray( elems ),\r
+ elems : X_Array_copy( elems ),\r
j : 0,\r
xtext : null,\r
flag : 0\r
\r
return {\r
me : xnode,\r
- xnodes : X_Object_cloneArray( xnode[ '_xnodes' ] ),\r
+ xnodes : X_Array_copy( xnode[ '_xnodes' ] ),\r
xtext : null,\r
flag : 0,\r
i : 0,\r
l : xnode[ '_xnodes' ].length,\r
- elems : X_Object_cloneArray( elm.childNodes ),\r
+ elems : X_Array_copy( elm.childNodes ),\r
j : 0,\r
skipCleanup : skipCleanup || X_Dom_DTD_SKIP_CLEANUP_TAGS[ tag ]\r
};\r
if( xnode[ '_xnodes' ] && xnode[ '_xnodes' ].length ){\r
return {\r
me : xnode,\r
- xnodes : X_Object_cloneArray( xnode[ '_xnodes' ] ),\r
+ xnodes : X_Array_copy( xnode[ '_xnodes' ] ),\r
xtext : null,\r
flag : 0,\r
i : 0,\r
l : xnode[ '_xnodes' ].length,\r
- elems : X_Object_cloneArray( elm.children ),\r
+ elems : X_Array_copy( elm.children ),\r
j : 0,\r
skipCleanup : skipCleanup || X_Dom_DTD_SKIP_CLEANUP_TAGS[ tag ]\r
};\r
-/*
- * VBS
- */
-
-if( false && 5 <= X_UA[ 'IE' ] && X_UA[ 'IE' ] < 11 ){
- (function(){
-
- var script = document.createElement( "script" ) ;
- script[ "type" ] = "text/vbscript" ;
- script.text = [
- "Function vba_IEBinaryToArrayBytes()\n" ,
- " vba_IEBinaryToArrayBytes = 1\n" ,
- "End Function\n"
- ].join( "" ) ;
- document.getElementsByTagName("head")[ 0 ].appendChild( script ) ;
-
- // alert( vba_IEBinaryToArrayBytes() );
- })();
-
-};
-
/*
* Flash Player 10 バージョン判別チェックリスト
navigator.mimeTypes &&
navigator.mimeTypes[ 'application/x-googlegears' ] &&
navigator.mimeTypes[ 'application/x-googlegears' ].enabledPlugin
- );
+ ),
+
+ X_Pulgin_VBS_ENABLED =
+ X_UA[ 'Windows' ] && !X_UA[ 'WinCE' ] && X_UA[ 'IE' ] < 11;
+
/**
* @namespace X.Pulgin
\r
if( html ) this._contentHTML = html; \r
\r
- this[ 'appendTo' ]( X_Node_body /* X_Node_systemNode */ );\r
+ this[ 'appendTo' ]( X_Node_body /* X_Node_systemNode */ )\r
+ [ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, X_Util_NinjaIframe_handleEvent );\r
\r
X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent );\r
},\r
};\r
\r
return this;\r
- },\r
- \r
- // TODO close -> kill\r
- 'close' : function(){\r
- X_ViewPort[ 'unlisten' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent );\r
- this.call( 'close' );\r
- this[ 'kill' ]();\r
}\r
\r
}\r
case 'error' :\r
this[ 'asyncDispatch' ]( 'ninjaerror' );\r
break;\r
+ \r
+ case X_EVENT_KILL_INSTANCE :\r
+ X_ViewPort[ 'unlisten' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent );\r
+ this._iwin && this._iwin.close();\r
+ break;\r
};\r
\r
return X_Callback_STOP_PROPAGATION;\r
'UPLOAD_PROGRESS' : X_Net_XHR_upload,\r
\r
// or gadget proxy or flash\r
- 'CORS' : X_Net_XHR_xdr || X_Net_XHR_cors\r
+ 'CORS' : X_Net_XHR_xdr || X_Net_XHR_cors,\r
+ \r
+ 'BINARY' : X_Pulgin_VBS_ENABLED\r
};\r
\r
if( X_Net_XHR_msXMLVer ) X[ 'XHR' ][ 'MSXML_VERSION' ] = X_Net_XHR_msXMLVer;\r
// js, css\r
raw.responseType = 'text';\r
break;\r
- case 'json' :\r
- case 'moz-json' : // firefox9-\r
- raw.responseType = X_UA[ 'Gecko' ] ? this._dataType : ''; // Iron 37 でエラー\r
+ case 'json' : // firefox9- は moz-json\r
+ raw.responseType = X_UA[ 'Gecko' ] < 10 ? 'moz-json' : X_UA[ 'Gecko' ] ? this._dataType : ''; // Iron 37 でエラー\r
break;\r
case 'document' :\r
case 'xml' :\r
\r
// http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_r_1.html\r
if( !this._isMsXML && raw.overrideMimeType ){ \r
- switch( X_URL_getEXT( url ) ){\r
+ switch( X_URL_getEXT( url ) || this._dataType ){\r
case 'html' :\r
+ case 'htm' :\r
case 'xml' :\r
tmp = 'text/xml';\r
break;\r
+ case 'json' :\r
+ tmp = 'application/json'; // 2015.6.29\r
+ break;\r
\r
case 'mp3' :\r
tmp = 'audio/mpeg';\r
headers[ 'Pragma' ] = 'no-cache';\r
headers[ 'Cache-Control' ] = 'no-cache';\r
headers[ 'If-Modified-Since' ] = 'Thu, 01 Jun 1970 00:00:00 GMT';\r
- } else */ \r
+ } */ \r
// http://nakigao.sitemix.jp/blog/?p=2040\r
- // json å\8f\96å¾\97æ\99\82ã\81« Safariã\81§HTTP/412ã\81®ã\82¨ã\83©ã\83¼ã\80\82ä½\86ã\81\97ç\9b¸æ\89\8bã\81\8c audio ã\81®å ´å\90\88ã\80\81ã\81\93ã\81®æ\8c\87å®\9aã\81\8cã\81\82ã\82\8bã\81¨ã\83ã\83¼ã\83\89ã\81«å¤±æ\95\97ã\81\99ã\82\8bã\80\82 iOS8.2, iOS7.1 ã\81§ã\81¯é\81é\81\87ã\81\9bã\81\9a\r
+ // json 取得時に SafariでHTTP/412のエラー。但し相手が audio の場合この指定があるとロードに失敗する。 iOS8.2, iOS7.1 では遭遇せず\r
if( this._dataType === 'json' ){\r
headers[ 'If-Modified-Since' ] = ( new Date ).toUTCString();\r
};\r
'Constructor' : function( obj ){
var expires_at;
- obj = X_Object_clone( obj );
+ obj = X_Object_copy( obj );
obj[ 'refreshMargin' ] = obj[ 'refreshMargin' ] || 300000;
X_Pair_create( this, obj );
'Constructor' : function( sourceList, opt_option ){\r
X_Audio_startDetectionBackend(\r
X_Audio_BACKENDS[ 0 ], this,\r
- X_Type_isArray( sourceList ) ? X_Object_cloneArray( sourceList ) : [ sourceList ],\r
+ X_Type_isArray( sourceList ) ? X_Array_copy( sourceList ) : [ sourceList ],\r
opt_option || {} );\r
this[ 'listenOnce' ]( [ X_EVENT_BACKEND_READY, X_EVENT_BACKEND_NONE, X_EVENT_KILL_INSTANCE ], X_Audio_handleEvent );\r
},\r
for( k in setting ){\r
v = setting[ k ];\r
if( X_Type_isArray( v ) && v !== urls ){\r
- v = X_Object_cloneArray( v );\r
+ v = X_Array_copy( v );\r
for( i = v.length; i; ){\r
--i;\r
if( i !== 2 ) v[ i ] = X_AudioWrapper_timeStringToNumber( v[ i ] );\r
};\r
};\r
\r
- X_Audio_startDetectionBackend( X_Audio_BACKENDS[ 0 ], X_Audio_Sprite_instance, X_Object_cloneArray( urls ), option );\r
+ X_Audio_startDetectionBackend( X_Audio_BACKENDS[ 0 ], X_Audio_Sprite_instance, X_Array_copy( urls ), option );\r
\r
X_Audio_Sprite_instance[ 'listenOnce' ]( [ X_EVENT_BACKEND_READY, X_EVENT_BACKEND_NONE ], X_AudioSprite_backendHandler );\r
X_Audio_Sprite_instance[ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, X_Audio_Sprite_handleEvent );\r
};\r
\r
function XUI_Attr_createAttrDef( base, defs ){\r
- var F = base ? X_Object_clone( base ) : {},\r
+ var F = base ? X_Object_copy( base ) : {},\r
z = base ? base._last : 0,\r
n = 1,\r
p, def;\r
},\r
\r
add : function( /* node, node, node ... */ ){\r
- X_Pair_get( this ).addAt( this.numNodes() + 1, X_Object_cloneArray( arguments ) );\r
+ X_Pair_get( this ).addAt( this.numNodes() + 1, X_Array_copy( arguments ) );\r
return this;\r
},\r
addAt : function( index /* , node , node, node ... */ ){\r
var nodes;\r
if( index < 0 ) index = 0;\r
- nodes = X_Object_cloneArray( arguments );\r
+ nodes = X_Array_copy( arguments );\r
X_Pair_get( this ).addAt( nodes.shift(), nodes );\r
return this;\r
},\r
remove : function( /* node, node, node ... */ ){\r
- X_Pair_get( this )[ 'remove' ]( X_Object_cloneArray( arguments ) );\r
+ X_Pair_get( this )[ 'remove' ]( X_Array_copy( arguments ) );\r
return this;\r
},\r
removeAt : function( from, length ){\r
X_Pair_create( this, XUI_ChromeBox( this, XUI_Layout_Canvas, arguments ) );\r
},\r
add : function( /* node, node, node ... */ ){\r
- X_Pair_get( this ).containerNode.addAt( this.numNodes(), X_Object_cloneArray( arguments ) );\r
+ X_Pair_get( this ).containerNode.addAt( this.numNodes(), X_Array_copy( arguments ) );\r
return this;\r
},\r
addAt : function( index /* , node, node, node ... */ ){\r
var nodes;\r
if( index < 0 ) index = 0;\r
- nodes = X_Object_cloneArray( arguments );\r
+ nodes = X_Array_copy( arguments );\r
X_Pair_get( this ).containerNode.addAt( nodes.shift(), nodes );\r
return this;\r
},\r
'_Repeater',\r
X_Class.NONE,\r
{\r
- layout : XUI_Layout_Vertical,\r
+ layout : XUI_Layout_Vertical,\r
\r
- dataSource : null, // Array.<object>, Array.<ItemData>\r
+ dataSource : null, // Array.<object>, Array.<ItemData>\r
\r
itemRenderer : null,\r
\r
itemNodes : null,\r
- \r
- startIndex : 0,\r
- startRenderIndex : 0,\r
- numItemsParPage : 0,\r
- numItemsPrev : 0,\r
- numItems : 0,\r
+\r
itemHeightLast : 0,\r
itemHeightLastEM : 0,\r
\r
\r
initialize : function(){\r
XUI_AbstractUINode.prototype.initialize.apply( this, arguments );\r
- \r
- this.parent[ 'listen' ]( XUI_Event.SCROLL_END, this );\r
},\r
\r
/*\r
var dataSource = this[ 'dataSource' ];\r
\r
if( allowedW + allowedH === XUI_Attr_AUTO ) return false;\r
- \r
- this.scrollPortWidth = allowedW;\r
- this.scrollPortHeight = allowedH; \r
\r
this.preMesure( allowedW, allowedH );\r
\r
},\r
\r
handleEvent : function( e ){\r
- var scrollBox, scrollY, dataSource, offsetY, startIndex, maxIndex, offset, itemNodes, ary, i, l;\r
- \r
switch( e.type ){\r
- case XUI_Event.SCROLL_END :\r
- scrollBox = this.parentData;\r
- scrollY = - scrollBox.scrollY;\r
- dataSource = this[ 'dataSource' ];\r
- itemNodes = this.itemNodes;\r
- itemH = this.itemHeightLast;\r
- \r
- // transition Y を 0 付近に。\r
- \r
- \r
- // startIndex の計算\r
- startIndex = scrollY / itemH | 0;\r
- \r
- /*maxIndex = dataSource.length <= this.numItems ? 0 : dataSource.length - this.numItems;\r
- console.log( ' >>> ' + startIndex + ' ' + maxIndex );\r
- \r
- startIndex =\r
- startIndex < 0 ? 0 :\r
- maxIndex < startIndex ? maxIndex : startIndex; */\r
- // アイテムの座標の修正とレンジ外のアイテムを配列内で再配置\r
- offset = startIndex - this.startIndex; // visible な stratIndex renderStartIndex\r
- this.startIndex = startIndex;\r
- \r
- console.log( this.numItemsPrev + ' oo ' + offset )\r
- \r
- if( 0 < offset ){\r
- itemNodes.push.apply( itemNodes, itemNodes.splice( 0, offset ) );\r
- } else\r
- if( offset < - 0 ){\r
- itemNodes.unshift.apply( itemNodes, itemNodes.splice( itemNodes.length + offset ) );\r
- };\r
-\r
- // 再配置されたアイテムにitemData のセット\r
- this.updateItemRenderer( this.contentWidth, this.scrollPortHeight );\r
- \r
- \r
- \r
- offsetY = scrollY % itemH;\r
- offsetY = offsetY === 0 ? 0 : ( offsetY - itemH );\r
- offsetY += ( this.startRenderIndex - this.startIndex ) * itemH;\r
- //console.log( ' ====> ' + this.startRenderIndex + ' -> ' + this.startIndex + ' scrollY:' + offsetY );\r
\r
- //scrollBox.scrollTo( 0, - scrollY, 0, '', 0 ); // anime無し \r
- //console.log( ' <==== ' );\r
- break;\r
};\r
},\r
\r
attrs = this.attrObject || this.attrClass.prototype,\r
gapY = XUI_AbstractUINode_calcValue( attrs[ this.usableAttrs.gapY.No ], _w ),\r
dataSource = this[ 'dataSource' ],\r
- render = this[ 'itemRenderer' ],\r
+ renderer = this[ 'itemRenderer' ],\r
l = dataSource.length,\r
- start = this.startIndex - this.numItemsPrev,\r
itemH = this.itemHeightLastEM,\r
- i, data, node, _y = 0, last, n;\r
- \r
- i = this.startRenderIndex = start = start < 0 ? 0 : start;\r
- \r
- _y = ( itemH + gapY ) * i;\r
+ i = 0, data, node, _y = 0, last, n;\r
\r
for( ; i < l; ++i ){\r
if( !( data = itemNodes[ i ] ) ){\r
- node = render.clone( true );\r
+ node = renderer.clone( true );\r
this.addAt( i, [ node ] );\r
data = itemNodes[ i ] = X_Pair_get( node );\r
// init -> addToParent -> creationComplete\r
_y += ( itemH || data.boxHeight ) + gapY;\r
\r
// 一番最初のループ。ここでページあたりのアイテム数を計算\r
- if( !itemH && i === start ){\r
+ if( !itemH && i === 0 ){\r
itemH = _y - gapY;\r
this.itemHeightLastEM = itemH;\r
- this.itemHeightLast = itemH * X_ViewPort_baseFontSize,\r
- // scroller の miniHeight は(例えば)親の高さの300% そこにいくつのアイテムを並べることが出来るか?端数切り上げ\r
- this.numItemsParPage = _h / itemH + 0.999 | 0;\r
- n = this.numItems = ( _h * 3 ) / itemH + 0.999 | 0; // TODO boxHeight\r
- this.numItemsPrev = ( this.numItems - this.numItemsParPage ) / 2 | 0;\r
- last = i + n;\r
- // データの最後まで、または、開始位置から 3ページ分を生成する\r
- l = last < l ? last : l;\r
+ this.itemHeightLast = itemH * X_ViewPort_baseFontSize;\r
};\r
};\r
\r
};\r
\r
// TODO contentHeight は attr を無視する -> 未表示領域につくるアイテム数 GPU の有無で変わる\r
- this.contentHeight = dataSource.length * ( itemH + gapY ) - gapY;\r
+ this.contentHeight = l * ( itemH + gapY ) - gapY;\r
},\r
\r
onPropertyChange : function( name, newValue ){\r
'js/06_net/00_XNet.js',\r
'js/06_net/01_XNetXHR.js',\r
'js/06_net/02_XNetJSONP.js',\r
- //'js/06_net/03_XNetForm.js',\r
+ 'js/06_net/03_XNetForm.js',\r
'js/06_net/04_XNetImage.js',\r
+ 'js/06_net/05_XXHRGadget.js',\r
+ 'js/06_net/10_XOAuth2.js',\r
\r
'js/07_audio/00_XAudio.js',\r
'js/07_audio/01_XWebAudio.js',\r