isHTMLElement :\r
new Function( 'v',\r
( X.UA.IE4 || X.UA.MacIE ) ?\r
- 'return v&&v.tagName' : // ie4 or MacIE5.23, v.all <- error\r
+ 'return v&&v.tagName' : // ie4 or MacIE5.23, v.all <- error\r
window[ 'HTMLElement' ] ?\r
'return v instanceof HTMLElement' :\r
//window[ 'Element' ] ?\r
// 'return v instanceof Element' : // error @ie8\r
'return v&&v.nodeType===1&&v.appendChild'\r
),\r
+ \r
+ /*\r
+ * new Image した場合に HTMLElement の img が作られるブラウザもある\r
+ */ \r
+ isImage :\r
+ function( v ){\r
+ if( v && v.constructor === window.Image ) return true;\r
+ if( v && v.constructor === window.HTMLImageElement ) return true;\r
+ if( X.UA.WebKit < 525.13 ){ // Safari3-\r
+ if( v && v.src !== undefined && v.onload !== undefined && X.Type.isNumber( v.height ) && X.Type.isNumber( v.width ) && X.Type.isBoolean( v.complete ) ){\r
+ return true;\r
+ };\r
+ };\r
+ return false;\r
+ },\r
/*\r
isElementCollection : function(v) {\r
return (Object.prototype.toString.call(v) === "[object HTMLCollection]");\r
klass = X.Class.create.apply( X.Class, params );\r
traits = null;\r
\r
+ def = X.Class._getClassDef( klass );\r
// 継承用プロパティを控える\r
if( opt_super === true ){\r
- def = X.Class._getClassDef( klass );\r
+ def.superAccess = true;\r
def.Super = Super;\r
def.SuperProto = Super.prototype;\r
def.SuperConstructor = superDef[ CONSTRUCTOR ] || superDef.SuperConstructor;\r
+ } else {\r
+ def.Super = Super; // instanceOf() で親クラスを調べる!\r
};\r
\r
return klass;\r
\r
// onKill() === false の場合、kill のキャンセル\r
// private は false での キャンセル は無視される\r
+ \r
if( this.instanceOf( X.EventDispatcher ) ){\r
+ console.log( 'this.instanceOf( X.EventDispatcher )! ' + this._dispatching );\r
if( !def.isPrivate ){\r
if( this._dispatching ){\r
this.dispatch( X.Event.BEFORE_KILL_INSTANCE );\r
this.dispatch( X.Event.KILL_INSTANCE_CANCELED );\r
return;\r
};\r
+ } else {\r
+ this.dispatch( X.Event.BEFORE_KILL_INSTANCE ); \r
};\r
- this.dispatch( X.Event.BEFORE_KILL_INSTANCE );\r
this.dispatch( X.Event.KILL_INSTANCE );\r
this._listeners && this.unlisten();\r
} else\r
return;\r
};\r
\r
+ console.log('kill ' + this._dispatching);\r
+ \r
for( p in instance ){\r
if( instance.hasOwnProperty && !instance.hasOwnProperty( p ) ) continue;\r
delete instance[ p ];\r
} else {\r
def.live && def.live.push( instance );\r
};\r
- if( def.Super ){\r
+ if( def.superAccess ){\r
// TODO klass.prototype に移動\r
instance.Super = def.SuperProto;\r
instance.SuperConstructor = superConstructor;\r
list = X.Timer.TICKET_LIST,\r
i = 0,\r
l = list.length,\r
- start = X.getTime(),\r
+ limit = X.getTime() + X.Timer.INTERVAL_TIME / 2,\r
+ heavy,\r
q, f, c, r;\r
\r
if( X.Timer.busy ){\r
for( ; i < l; ++i ){\r
q = list[ i ];\r
if( 0 < ( q.last -= next ) ) continue;\r
+ if( heavy ){\r
+ if( q.last <= 0 ) q.last = 1;\r
+ continue;\r
+ };\r
c = q.count;\r
\r
if( q.k ){\r
r = q.f();\r
};\r
\r
+ console.log( 'fire....' );\r
+ \r
+ if( limit <= X.getTime() ){\r
+ console.log( 'heavy' );\r
+ // 関数の実行に時間が係る場合、次のタイミングに\r
+ heavy = true;\r
+ }; \r
+ \r
if( r & X.Callback.UN_LISTEN || c === 1 ){\r
list.splice( i, 1 );\r
--i;\r
} else\r
if( 1 < c ) --q.count;\r
q.last = q.time;\r
- \r
- if( start < X.getTime() ){\r
- console.log( '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@' );\r
- break;\r
- };\r
};\r
X.Timer.timerId = 0;\r
X.Timer.busy = false;\r
} else\r
if( X.Type.isHTMLElement( XnodeOrImageElemOrSrc ) ){\r
img = XnodeOrImageElemOrSrc;\r
+ } else\r
+ if( XnodeOrImageElemOrSrc.constructor === X.EventDispatcher && X.Type.isImage( XnodeOrImageElemOrSrc._rawObject ) ){\r
+ xnode = XnodeOrImageElemOrSrc;\r
+ img = xnode._rawObject;\r
} else {\r
return;\r
};\r
X.Net = {\r
\r
xhrGet : function( url ){\r
- return new X_NET_Queue( X_NET_TYPE_XHR, { type : 'get', get : url } );\r
+ return new X_NET_Queue( X_NET_TYPE_XHR, { method : 'GET', get : url } );\r
},\r
\r
xhrPost : function( url ){\r
- return new X_NET_Queue( X_NET_TYPE_XHR, { type : 'post', post : url } );\r
+ return new X_NET_Queue( X_NET_TYPE_XHR, { method : 'POST', post : url } );\r
},\r
\r
formGet : function(){\r
this.type = type;\r
this.data = data; \r
\r
- this.listen( X.Event.COMPLETE, this, X_NET_proxyDispatch );\r
+ this.listen( X.Event.COMPLETE, X_NET_proxyDispatch );\r
\r
X_NET_QUEUE_LIST[ X_NET_QUEUE_LIST.length ] = this;\r
!X_NET_currentQueue && X_NET_shiftQueue();\r
var i = X_NET_QUEUE_LIST.indexOf( this );\r
if( i !== -1 ){\r
X_NET_QUEUE_LIST.splice( i, 1 );\r
- this.asyncDispatch( 0, { type : X.Event.COMPLETE } );\r
+ this.asyncDispatch( 0, { type : X.Event.CANCELED } );\r
} else\r
if( this === X_NET_currentQueue ){\r
X_NET_currentWrapper.cancel();\r
break;\r
case X.Event.SUCCESS :\r
case X.Event.ERROR :\r
+ case X.Event.CANCELED :\r
console.log( 'q: ' + e.type );\r
this.dispatch( e );\r
this.asyncDispatch( 0, { type : X.Event.COMPLETE } );\r
break;\r
- case X.Event.CANCELED :\r
- \r
- break;\r
case X.Event.COMPLETE :\r
+ console.log( 'complete. then kill()' );\r
this.kill();\r
X_NET_shiftQueue();\r
- break;\r
+ break; \r
};\r
};\r
\r
\r
if( X_NET_currentQueue ){\r
if( X_NET_currentWrapper._busy ) return;\r
- X_NET_currentWrapper.unlisten( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.PROGRESS ], X_NET_currentQueue, X_NET_proxyDispatch );\r
- X_NET_currentQueue.reset();\r
- };\r
- \r
- if( !X_NET_QUEUE_LIST.length ){\r
+ X_NET_currentWrapper\r
+ .unlisten( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.PROGRESS ], X_NET_currentQueue, X_NET_proxyDispatch )\r
+ .reset();\r
X_NET_currentQueue = X_NET_currentWrapper = null;\r
- return;\r
};\r
+ \r
+ if( !X_NET_QUEUE_LIST.length ) return;\r
+\r
queue = X_NET_QUEUE_LIST.shift();\r
\r
switch( queue.type ){\r
break;\r
};\r
\r
- X_NET_currentWrapper.listen( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.PROGRESS, X.Event.COMPLETE ], X_NET_currentQueue = queue, X_NET_proxyDispatch );\r
+ X_NET_currentWrapper.listen( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.PROGRESS ], X_NET_currentQueue = queue, X_NET_proxyDispatch );\r
\r
X_NET_currentWrapper.load( queue.data );\r
};\r
\r
_rawObject : X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X,\r
_isXHR : true,\r
+ _isXDR : false, // for ie8\r
\r
_method : null,\r
_type : null,\r
}; \r
};\r
\r
+ // send 前にフラグを立てる,回線が早いと raw.send() 内で onload -> _busy = false ののち、 _busy = true するケースがあるため。\r
+ this._busy = true;\r
+ \r
// http://allabout.co.jp/gm/gc/24097/#1\r
// sendをonreadystatechangeの前に記述すると、ieでは動作しなくなります、、、。\r
// konquerorでエラーが発生するのでここでは、とりあえず、send('') としました。\r
raw.send( postbody || '' );\r
- \r
- this._busy = true;\r
},\r
\r
cancel : X.Net.XHR.CANCELABLE ?\r
\r
reset : function(){\r
this._method = this._type = null;\r
- this._canceled = false;\r
- this._busy = false;\r
+ this._canceled = this._busy = false;\r
this._lastProgress = 0;\r
},\r
\r
case 'arraybuffer' :\r
};\r
\r
- console.log( 'status ' + status );\r
- //console.dir( raw );\r
+ //console.log( 'status ' + status );\r
+ //console.dir( raw );\r
+ \r
this._busy = false;\r
this.asyncDispatch( 0, { type : X.Event.SUCCESS, status : status || 200, data : data } ); \r
} else {\r
console.log( 'status ' + status );\r
+ this._busy = false;\r
//console.dir( raw );\r
live && this.asyncDispatch( 0, { type : X.Event.ERROR, status : raw.status || 0, percent : 100 } );\r
};\r
\r
case 'error' :\r
//console.dir( e );\r
+ this._busy = false;\r
live && this.asyncDispatch( 0, { type : X.Event.ERROR, status : raw.status } );\r
break;\r
\r
//case 'abort' :\r
+ // this._busy = false;\r
// this.asyncDispatch( 0, { type : X.Event.ERROR, status : raw.status } );\r
// break;\r
case 'timeout' : // Gecko 12.0 https://developer.mozilla.org/ja/docs/XMLHttpRequest/Synchronous_and_Asynchronous_Requests\r
+ this._busy = false;\r
live && this.asyncDispatch( 0, { type : X.Event.ERROR, status : raw.status } );\r
break;\r
- \r
- case 'loadend' :\r
- break;\r
};\r
},\r
\r
// 同期リクエストでなければならない場合, unload, beforeunload時\r
\r
\r
- // ie8 では timeout が有効\r
+ // ie8 では timeout が有効, MSXML のバージョンで決定すべき?\r
if( X.UA.IE8 ){\r
X_NET_XHRWrapper.listen( [ 'readystatechange', 'error', 'abort', 'timeout' ] );\r
} else\r
if( X.Net.XHR.UL_PROGRESS ){\r
X_NET_XHRWrapper._rawObject.upload.addEventListener( 'progress', X.Net.XHR.xhr.onUploadProgress );\r
};\r
- \r
- \r
- var X_NET_XHR_lastReadyState = 0;\r
- \r
- function X_NET_XHR_checkReadyStateTimer(){\r
- //console.log( '-' );\r
- if( X_NET_XHR_lastReadyState < X_NET_XHRWrapper._rawObject.readyState ){\r
- X_NET_XHR_lastReadyState = X_NET_XHRWrapper._rawObject.readyState;\r
- X_NET_XHRWrapper.dispatch( { type : 'readystatechange' } );\r
- console.log( '- ' + X_NET_XHR_lastReadyState );\r
- if( 4 <= X_NET_XHR_lastReadyState ) return X.Callback.UN_LISTEN;\r
- };\r
- };\r
};\r
\r
cb : function( accessKey, jsonString, time, opt_json2FileSize ){
if( accessKey !== X_NET_JSONP_ACCESS_KEY ) return;
+ X_NET_JSONPWrapper._busy = false;
+
X_NET_JSONPWrapper
.asyncDispatch( 0, {
type : jsonString ? X.Event.SUCCESS : X.Event.ERROR,
var X_NET_JSONP_ACCESS_KEY = Math.random(),
- X_NET_JSONP_NinjaIframe,
-
- X_NET_JSONP_imageFixListener = X.UA.Opera && function( e ){
- switch( e.type ){
- case X.Event.SUCCESS :
- case X.Event.ERROR :
- X_NET_JSONP_loadScriptInNinjaIframe( e.src );
- case X.Event.TIMEOUT :
- case X.Event.CANCELED :
- };
+ X_NET_JSONP_NinjaIframe;
+
+
+function X_NET_JSONP_operaImageHandleEvent( e ){
+ switch( e.type ){
+ case X.Event.SUCCESS :
+ case X.Event.ERROR :
+ X_NET_JSONP_loadScriptInNinjaIframe( e.src );
+ break;
+ case X.Event.TIMEOUT :
+ case X.Event.CANCELED :
+ X_NET_JSONPWrapper._operaImage.unlisten().reset();
+ X_NET_JSONPWrapper.asyncDispatch( 0, X.Event.ERROR );
+ break;
};
+};
+if( !X.UA.Opera ) X_NET_JSONP_operaImageHandleEvent = null;
+
function X_NET_JSONP_loadScriptInNinjaIframe( url ){
- X_NET_JSONP_NinjaIframe || ( X_NET_JSONP_NinjaIframe = new X.Util.NinjaIframe() );
-
var json2Path = 'js/libs/json2.js',
json2FileSize = 18103,
html;
+ X_NET_JSONP_NinjaIframe || ( X_NET_JSONP_NinjaIframe = new X.Util.NinjaIframe() );
+
if( X.UA.IE8 ){
html = [
// http://blog.livedoor.jp/dankogai/archives/51503830.html
new X.EventDispatcher(),
{
- _operaImage : null, // X.Dom.Image.Loader();
+ _operaImage : null, // X.Net.Image();
_busy : false,
_canceled : false,
load : function( url, data, timeout ){
-
//createURL
- if( X_NET_JSONP_imageFixListener ){
- this._operaImage = X.Dom.Image.Loader( url )
- .listenOnce( [ X.Event.SUCCESS, X.Event.ERROR ], X_NET_JSONP_imageFixListener );
+ if( X_NET_JSONP_operaImageHandleEvent ){
+ this._operaImage = X.Net.Image( url )
+ .listenOnce( [ X.Event.SUCCESS, X.Event.ERROR ], X_NET_JSONP_operaImageHandleEvent );
} else {
X_NET_JSONP_loadScriptInNinjaIframe( url );
};