* @type {boolean}\r
*/\r
X_UA[ 'iPhone_4s' ] = true;\r
+ \r
+ if( i ){\r
+ /**\r
+ * iPhone3GS以下\r
+ * @alias X.UA.iPhone_3GS\r
+ * @type {boolean}\r
+ */\r
+ X_UA[ 'iPhone_3GS' ] = true;\r
+ }; \r
};\r
- if( v && i ){\r
- /**\r
- * iPhone3GS以下\r
- * @alias X.UA.iPhone_3GS\r
- * @type {boolean}\r
- */\r
- X_UA[ 'iPhone_3GS' ] = true;\r
- };\r
+\r
//alert( 'iPhone ' + ( X_UA[ 'iPhone_3GS' ] ? '3GS以下' : X_UA[ 'iPhone_4s' ] ? '4s以下' : '5以上' ) );\r
};\r
if( sys === 'iPad' ){\r
* @type {boolean}\r
*/\r
X_UA[ 'iPod' ] = true;\r
- if( v && i ){\r
- /**\r
- * iPod3以下\r
- * @alias X.UA.iPod_3\r
- * @type {boolean}\r
- */\r
- X_UA[ 'iPod_3' ] = true;\r
- };\r
+\r
if( v ){\r
/**\r
* iPod4以下\r
* @type {boolean}\r
*/\r
X_UA[ 'iPod_4' ] = true;\r
+ \r
+ if( i ){\r
+ /**\r
+ * iPod3以下\r
+ * @alias X.UA.iPod_3\r
+ * @type {boolean}\r
+ */\r
+ X_UA[ 'iPod_3' ] = true;\r
+ }; \r
};\r
//alert( 'iPod touch ' + ( X_UA[ 'iPod_3' ] ? '3以下' : X_UA[ 'iPod_4' ] ? '4以下' : '5以上' ) );\r
};\r
\r
X_URL_IS_LOCAL = X_URL_IS_FILE || location.hostname === 'localhost' || location.hostname === '127.0.0.1',\r
\r
- X_URL_PARAMS = ( function( search ){\r
- var str = search.slice( 1 ),\r
- parts = str.split( '&' ),\r
- i = 0,\r
- l = parts.length,\r
- obj = {},\r
- pair, p;\r
-\r
- if( !str ) return obj;\r
- \r
- for( ; i < l; ++i ){\r
- pair = parts[ i ];\r
- p = pair.indexOf( '=' );\r
- if( p === -1 ){\r
- obj[ decodeURIComponent( pair ) ] = true;\r
- } else {\r
- obj[ decodeURIComponent( pair.substr( 0, p ) ) ] = X_String_parse( decodeURIComponent( pair.substr( p + 1 ) ) );\r
- };\r
- };\r
-\r
- return obj;\r
- } )( location.search );\r
+ X_URL_PARAMS = X_URL_ParamToObj( location.search.slice( 1 ) );\r
\r
// ------------------------------------------------------------------------- //\r
// --- interface ----------------------------------------------------------- //\r
return path.length ? path.pop() : '';\r
};\r
\r
+function X_URL_objToParam( data ){\r
+ var result = [], k, n = -1;\r
+ for( k in data ){\r
+ if( n !== -1 ) result[ ++n ] = '&';\r
+ result[ ++n ] = k;\r
+ result[ ++n ] = '=';\r
+ result[ ++n ] = encodeURIComponent( data[ k ] );\r
+ }\r
+ return result.join( '' );\r
+};\r
+\r
+function X_URL_ParamToObj( str ){\r
+ var parts = str.split( '&' ),\r
+ i = 0,\r
+ l = parts.length,\r
+ obj = {},\r
+ pair, p;\r
+\r
+ if( !str ) return obj;\r
+ \r
+ for( ; i < l; ++i ){\r
+ pair = parts[ i ];\r
+ p = pair.indexOf( '=' );\r
+ if( p === -1 ){\r
+ obj[ decodeURIComponent( pair ) ] = true;\r
+ } else {\r
+ obj[ decodeURIComponent( pair.substr( 0, p ) ) ] = X_String_parse( decodeURIComponent( pair.substr( p + 1 ) ) );\r
+ };\r
+ };\r
+\r
+ return obj; \r
+};\r
// ------------ local variables -------------------------------------------- //\r
// ------------------------------------------------------------------------- //\r
\r
-var /** @const */\r
+var \r
X_Callback_LIVE_LIST = [],\r
- /** @const */\r
+\r
X_Callback_POOL_LIST = [],\r
- /** @const */\r
+\r
X_Closure_COMMAND_BACK = X_Callback_LIVE_LIST,\r
- /** @const */\r
+\r
X_Closure_COMMAND_DROP = X_Callback_POOL_LIST,\r
\r
- /** @const */\r
+ /* @const */\r
X_Callback_THIS_FUNC = 1,\r
- /** @const */\r
+ /* @const */\r
X_Callback_HANDLEEVENT = 2,\r
- /** @const */\r
+ /* @const */\r
X_Callback_FUNC_ONLY = 3,\r
\r
- /** @const */\r
+ /* @const */\r
X_Callback_NONE = 0,\r
- /** @const */\r
+ /* @const */\r
X_Callback_UN_LISTEN = 1,\r
- /** @const */\r
+ /* @const */\r
X_Callback_STOP_PROPAGATION = 2,\r
- /** @const */\r
+ /* @const */\r
X_Callback_STOP_NOW = 4 | 2, // 同一階層のリスナーのキャンセル(上位へもキャンセル)\r
- /** @const */\r
+ /* @const */\r
X_Callback_PREVENT_DEFAULT = 8, // 結果動作のキャンセル,\r
- /** @const */\r
+ /* @const */\r
X_Callback_MONOPOLY = 16, // move event を独占する\r
- \r
+ /* @const */\r
X_Callback_CAPTURE_POINTER = 16,\r
+ /* @const */\r
X_Callback_RELEASE_POINTER = 32,\r
\r
- /** @const */\r
+ /* @const */\r
X_Callback_SYS_CANCEL = 64 | 4 | 2;\r
\r
/*\r
};\r
X_Class_killPrivateFlag = false; // instance.kill() 内で PrivateInstance.kill() を防ぐため\r
\r
+ // TODO kill 中の kill の呼び出しを防ぐ, 破棄済のインスタンスへの kill\r
+ \r
if( this[ 'instanceOf' ]( X_EventDispatcher ) ){\r
if( !def.isPrivate ){\r
if( this[ 'dispatch' ]( X_EVENT_BEFORE_KILL_INSTANCE ) & X_Callback_PREVENT_DEFAULT ){\r
\r
X_EventDispatcher_safariPreventDefault = false, // Safari3-\r
\r
- /**\r
- * @enum {number} \r
- */\r
- X_EventDispatcher_EVENT_TARGET_TYPE = {\r
- OTHER : 0,\r
- XHR : 1,\r
- SILVER_LIGHT : 2\r
- },\r
+ /* @const */\r
+ X_EventDispatcher_EVENT_TARGET_OTHER = 0,\r
+ /* @const */\r
+ X_EventDispatcher_EVENT_TARGET_XHR = 1,\r
+ /* @const */\r
+ X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT = 2,\r
\r
X_EventDispatcher_LAZY_TIMERS = {}; // Object.<number, X.EventDispatcher> number は timerID\r
\r
* @private\r
* @type {number}\r
*/\r
- '_rawType' : X_EventDispatcher_EVENT_TARGET_TYPE.OTHER,\r
+ '_rawType' : X_EventDispatcher_EVENT_TARGET_OTHER,\r
\r
/**\r
* イベントリスナをイベント名文字列や数値(1~,フレームワーク内で定義)をキーとするArrayで記憶します。<br>\r
* dispatch のコールバック中で unlisten() が呼ばれた場合、即座に反映され削除されたイベントリスナーは呼ばれない。\r
* @alias EventDispatcher.prototype.dispatch\r
* @param {eventHash|string|number} e\r
- * @return {number} X.Callback で定義された数値\r
+ * @return {number} X.Callback で定義された数値(ビットフラグ)\r
*/\r
function X_EventDispatcher_dispatch( e ){\r
var listeners = this[ '_listeners' ],\r
};\r
unlistens.indexOf( f ) === -1 && ( unlistens[ unlistens.length ] = f );\r
};\r
-\r
+ ret |= X_Type_isFinite( r ) ? r : 0;\r
+ \r
if( r & X_Callback_STOP_NOW ){\r
sysOnly = true;\r
- };\r
- ret |= X_Type_isFinite( r ) ? r : 0;\r
+ break;\r
+ }; \r
};\r
\r
if( ( --listeners[ X_Listeners_.DISPATCHING ] ) === 0 ){\r
(function( that, type, raw, list ){\r
var f;\r
switch( that[ '_rawType' ] ){\r
- case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
+ case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
list.sltoken = raw.AddEventListener( type, list.slcallback );\r
break;\r
\r
- case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+ case X_EventDispatcher_EVENT_TARGET_XHR :\r
if( X_UA[ 'Opera' ] < 12 ){\r
// Opera11- の XHR は event オブジェクトが返らないため, eventType 毎に callback を指定する addEventListener もない\r
raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] );\r
(function( that, type, raw, list ){\r
var f;\r
switch( that[ '_rawType' ] ){ \r
- case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
+ case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
list.sltoken = raw.AddEventListener( type, list.slcallback );\r
break; \r
\r
- case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+ case X_EventDispatcher_EVENT_TARGET_XHR :\r
// ie8- の XHR は window.event が更新されないため, eventType 毎に callback を指定する\r
raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] );\r
break;\r
}) :\r
(function( that, type, raw, list ){\r
switch( that[ '_rawType' ] ){\r
- case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
+ case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
// DOM0 で Silverlight ってあるの -> ie4 mobile?\r
list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
list.sltoken = raw.AddEventListener( type, list.slcallback );\r
break; \r
\r
- case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+ case X_EventDispatcher_EVENT_TARGET_XHR :\r
// ie4 mobile は XHR をサポート!\r
raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] );\r
break;\r
X_UA_EVENT.W3C ?\r
(function( that, type, raw, list, skip ){\r
switch( that[ '_rawType' ] ){\r
- case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
+ case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
raw.RemoveEventListener( type, list.sltoken ); // token\r
X_Callback_correct( list.slcallback );\r
delete list.sltoken;\r
delete list.slcallback;\r
break;\r
\r
- case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+ case X_EventDispatcher_EVENT_TARGET_XHR :\r
if( X_UA[ 'Opera' ] < 12 ){\r
// Opera11- の XHR は event オブジェクトが返らないため, eventType 毎に callback を指定する addEventListener もない\r
X_Callback_correct( raw[ 'on' + type ] );\r
X_UA_EVENT.IE ?\r
(function( that, type, raw, list, skip ){\r
switch( that[ '_rawType' ] ){\r
- case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
+ case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
raw.RemoveEventListener( type, list.sltoken ); // token\r
X_Callback_correct( list.slcallback );\r
delete list.sltoken;\r
delete list.slcallback;\r
break;\r
\r
- case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+ case X_EventDispatcher_EVENT_TARGET_XHR :\r
X_Callback_correct( raw[ 'on' + type ] );\r
raw[ 'on' + type ] = X_emptyFunction;\r
raw[ 'on' + type ] = '';\r
}) :\r
(function( that, type, raw, list, skip ){\r
switch( that[ '_rawType' ] ){\r
- case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
+ case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
raw.RemoveEventListener( type, list.sltoken ); // token\r
X_Callback_correct( list.slcallback );\r
delete list.sltoken;\r
delete list.slcallback;\r
break;\r
\r
- case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+ case X_EventDispatcher_EVENT_TARGET_XHR :\r
X_Callback_correct( raw[ 'on' + type ] );\r
raw[ 'on' + type ] = X_emptyFunction;\r
raw[ 'on' + type ] = '';\r
var X_ViewPort_readyState,
X_ViewPort_active = !!window.parent || !!document.activeElement, // parent は frameに読み込まれた場合のieのerror回避
+ X_ViewPort_activeTimerID,
X_ViewPort_rootElement,
X_ViewPort_lock,
X_ViewPort_width,
{
'handleEvent' : function( e ){
- var href, i, name;
+ var href, i, name, active = false;
switch( e.type ){
case 'beforeunload' :
case 'webkitvisibilitychange' :
X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = document[ 'webkitHidden' ] ) ? X_EVENT_VIEW_DEACTIVATE : X_EVENT_VIEW_ACTIVATE );
break;
-
- case 'pageshow' :
- case 'focus' :
- if( !X_ViewPort_active ){
- X_ViewPort_active = true;
- X_ViewPort[ 'dispatch' ]( X_EVENT_VIEW_ACTIVATE );
- };
- break;
- case 'pagehide' :
+
case 'blur' :
- if( X_ViewPort_active ){
- X_ViewPort_active = false;
- X_ViewPort[ 'dispatch' ]( X_EVENT_VIEW_DEACTIVATE );
+ case 'focusout' :
+ case 'pagehide' :
+ active = true;
+ case 'focus' :
+ case 'focusin' :
+ case 'pageshow' :
+ if( X_ViewPort_active === active ){
+ X_ViewPort_active = !active;
+ if( X_ViewPort_activeTimerID ){
+ X_ViewPort_activeTimerID = X_Timer_remove( X_ViewPort_activeTimerID );
+ } else {
+ X_ViewPort_activeTimerID = X_Timer_once( 1, X_ViewPort_changeFocus );
+ };
};
break;
};
}
);
+function X_ViewPort_changeFocus(){
+ X_ViewPort[ 'dispatch' ]( X_ViewPort_active ? X_EVENT_VIEW_ACTIVATE : X_EVENT_VIEW_DEACTIVATE );
+ X_ViewPort_activeTimerID = 0;
+};
+
/**
* window に相当する ViewPort 情報を提供するオブジェクト。
} else
if( X_UA[ 'iOS' ] && window[ 'onpageshow' ] !== undefined ){
X_EventDispatcher_systemListen( X_ViewPort, [ 'pageshow', 'pagehide' ] );
+ } else
+ if( document[ 'onfocusin' ] !== undefined ){
+ // https://github.com/ai/visibilityjs/blob/master/lib/visibility.fallback.js
+ X_EventDispatcher_systemListen( X_ViewPort_document, [ 'focusin', 'focusout' ], X_ViewPort );
} else {
X_EventDispatcher_systemListen( X_ViewPort, [ 'focus', 'blur' ] );
};
\r
X_Node_BitMask_IE4_IS_MIX = X_Node_State.IE4_HAS_TEXTNODE | X_Node_State.IE4_HAS_ELEMENT,\r
\r
- /** @enum {number} */\r
+ /* @enum {number} */\r
X_Node_TYPE = {\r
XNODE : 1,\r
RAW_HTML : 2,\r
-/**\r
+/*\r
* use X.Callback\r
* \r
* http://d.hatena.ne.jp/uupaa/20100430/1272561922\r
xnode[ 'cssText' ]( '' )[ 'empty' ]();
});
+
-/**\r
+/*\r
* Original code by ofk ( kQuery, ksk )\r
* http://d.hatena.ne.jp/ofk/comment/20090106/1231258010\r
* http://d.hatena.ne.jp/ofk/20090111/1231668170 \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
// http://bugs.jquery.com/ticket/2709\r
// <head><base> がある場合、<script>の追加に失敗する\r
\r
+\r
+\r
/**\r
- * cancel(), busy() メソッドだけを持つ。X.Pair によって、プライベートメンバは隠蔽される。X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR, X_EVENT_TIMEOUT, X_EVENT_CANCELED\r
- * \r
+ * 通信のキャンセル 通信中の場合は停止&破棄する kill(), busy() メソッドだけを持つ。X.Pair によって、プライベートメンバは隠蔽される。X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR, X_EVENT_TIMEOUT, X_EVENT_CANCELED\r
+ * 通信待ち中はキャンセル&破棄、通信中の場合は通信の中断&破棄を行う。\r
+ * SUCCESS, ERROR, TIMEOUT イベント以降は kill() は無視される。X.Net インスタンスは COMPLETE で自動で破棄される。\r
* @alias X.Net\r
* @class 各種ネットワーク機能をラップしインターフェイスを共通化する。\r
* @constructs Net\r
* @extends {EventDispatcher}\r
* @example // XHR - GET\r
* var net = X.Net( { xhr : urlString } )\r
- * .listenOnce( X.Event.PROGRESS );\r
- * .listen( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT, X.Event.CANCELED ] );\r
+ * .listen( X.Event.PROGRESS )\r
+ * .listenOnce( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT, X.Event.CANCELED ] );\r
* \r
* // XHR - POST \r
- * var net = X.Net( { xhr : urlString, postbody : myData } );\r
+ * var net = X.Net( { xhr : urlString, postdata : myData } );\r
* \r
* // JSONP\r
* var net = X.Net( { jsonp : urlString, staticCallbackName : callbackName, useXDomainWall : false } );\r
* // Image preload & getSize\r
* var net = X.Net( { image : src, sizeDetection : true } );\r
* \r
- * // load <script>, <link>\r
+ * // load <script>, <link>\r
*/\r
X[ 'Net' ] = X_EventDispatcher[ 'inherits' ](\r
'X.Net',\r
X_Class.NONE,\r
- \r
{\r
'Constructor' : function( urlOrObject, opt_options ){\r
- var v, opt;\r
+ var v, opt, url, type;\r
\r
if( X_Type_isObject( opt = urlOrObject ) ){\r
if( v = opt[ 'xhr' ] ){\r
alert( 'X.Net args error' );\r
return; \r
};\r
- \r
- if( X_Type_isString( url = opt[ 'url' ] ) ){\r
- alert( 'X.Net args error' );\r
- return;\r
- };\r
- \r
- } else {\r
+\r
+ };\r
+ \r
+ if( !X_Type_isString( url ) ){\r
alert( 'X.Net args error' );\r
return;\r
};\r
};\r
\r
if( type === X_NET_TYPE_XHR ){\r
- opt[ 'method' ] = opt[ 'method' ] || ( opt[ 'postbody' ] ? 'POST' : 'GET' );\r
+ opt[ 'method' ] = opt[ 'method' ] || ( opt[ 'postdata' ] ? 'POST' : 'GET' );\r
+ \r
+ // XDomain 不可 -> Flash, Gears, Silverlight, canUseGadget なら gadget に切替?\r
+ // PUT DELETE UPDATE 不可 -> Flash, Gears, Silverlight, canUseGadget なら gadget に切替?\r
+ // or X_EVENT_ERROR\r
\r
- // XDomain -> Flash, Gears, Silverlight に切替?\r
}; \r
\r
opt = X_Object_clone( opt );\r
- opt[ 'type' ] = type;\r
+ opt.netType = type;\r
opt[ 'url' ] = url;\r
\r
X_Pair_create( this, opt );\r
\r
- this[ 'listenOnce' ]( X_EVENT_COMPLETE, X_NET_proxyDispatch );\r
+ this[ 'listen' ]( [ X_EVENT_BEFORE_KILL_INSTANCE, X_EVENT_KILL_INSTANCE ], X_NET_proxyDispatch );\r
\r
X_NET_QUEUE_LIST[ X_NET_QUEUE_LIST.length ] = this;\r
!X_NET_currentQueue && X_NET_shiftQueue();\r
},\r
\r
/**\r
- * オブジェクトが現在通信中か?\r
- * @alias Net.prototype.budy\r
- * @return {boolean}\r
+ * 現在通信中か?調べる。false の場合、通信の順番待ちか、通信が終了している。\r
+ * @alias Net.prototype.busy\r
*/\r
'busy' : function(){\r
return this === X_NET_currentQueue && X_NET_currentWrapper._busy;\r
- },\r
-\r
- // TODO -> kill\r
- /**\r
- * 通信のキャンセル\r
- * @alias Net.prototype.cancel\r
- * @return {Net} 自身を返す、メソッドチェーン\r
- */\r
- 'cancel' : function(){\r
- var i = X_NET_QUEUE_LIST.indexOf( this );\r
- if( i !== -1 ){\r
- X_NET_QUEUE_LIST.splice( i, 1 );\r
- this[ 'asyncDispatch' ]( X_EVENT_CANCELED );\r
- this[ 'asyncDispatch' ]( 16, X_EVENT_COMPLETE );\r
- // this[ 'listenOnce' ]( X_EVENT_COMPLETE, X_NET_proxyDispatch );\r
- } else\r
- if( this === X_NET_currentQueue ){\r
- X_NET_currentWrapper.cancel();\r
- };\r
- return this;\r
}\r
}\r
);\r
\r
X_NET_currentWrapper,\r
X_NET_currentQueue,\r
- X_NET_currentData;\r
+ X_NET_currentData,\r
+ X_NET_completePhase;\r
\r
function X_NET_proxyDispatch( e ){\r
+ var i, flag;\r
+ \r
switch( e.type ){\r
case X_EVENT_BEFORE_KILL_INSTANCE :\r
+ if( this === X_NET_currentQueue && X_NET_completePhase ) return X_Callback_PREVENT_DEFAULT;\r
break;\r
+ \r
case X_EVENT_KILL_INSTANCE :\r
+ i = X_NET_QUEUE_LIST.indexOf( this );\r
+ \r
+ if( i !== -1 ){\r
+ X_NET_QUEUE_LIST.splice( i, 1 );\r
+ flag = true;\r
+ } else\r
+ if( this === X_NET_currentQueue ){\r
+ X_NET_currentWrapper.cancel();\r
+ X_NET_shiftQueue();\r
+ flag = true;\r
+ };\r
+ \r
+ if( flag ){ // flag が立つ場合、これは中断\r
+ this[ 'dispatch' ]( X_EVENT_CANCELED );\r
+ this[ 'dispatch' ]( { type : X_EVENT_COMPLETE, 'lastEventType' : X_EVENT_CANCELED } );\r
+ X_Pair_release( this ); \r
+ };\r
break; \r
- case X_EVENT_KILL_INSTANCE_CANCELED :\r
- break;\r
case X_EVENT_PROGRESS :\r
this[ 'dispatch' ]( e );\r
break;\r
case X_EVENT_SUCCESS :\r
case X_EVENT_ERROR :\r
case X_EVENT_TIMEOUT :\r
- case X_EVENT_CANCELED :\r
- this[ 'dispatch' ]( e );\r
- this[ 'asyncDispatch' ]( { type : X_EVENT_COMPLETE, 'lastEventType' : e.type } );\r
- // this[ 'listenOnce' ]( X_EVENT_COMPLETE, X_NET_proxyDispatch );\r
+ X_NET_completePhase = true;\r
+ this\r
+ [ 'listenOnce' ]( X_EVENT_COMPLETE, X_NET_proxyDispatch )\r
+ [ 'unlisten' ]( [ X_EVENT_BEFORE_KILL_INSTANCE, X_EVENT_KILL_INSTANCE ], X_NET_proxyDispatch )\r
+ [ 'asyncDispatch' ]( e );\r
+ this[ 'asyncDispatch' ]( 32, { type : X_EVENT_COMPLETE, 'lastEventType' : e.type } );\r
break;\r
case X_EVENT_COMPLETE :\r
X_Pair_release( this );\r
- this[ 'kill' ]();\r
X_NET_shiftQueue();\r
+ X_NET_completePhase = false;\r
+ this[ 'kill' ]();\r
break;\r
};\r
};\r
function X_NET_shiftQueue(){\r
\r
if( X_NET_currentQueue ){\r
- console.log( 'X_NET_shiftQueue ' + X_NET_currentWrapper._busy );\r
if( X_NET_currentWrapper._busy ) return;\r
X_NET_currentWrapper\r
- [ 'unlisten' ]( [ X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR, X_EVENT_TIMEOUT, X_EVENT_CANCELED ], X_NET_currentQueue, X_NET_proxyDispatch )\r
+ [ 'unlisten' ]( [ X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR, X_EVENT_TIMEOUT ], X_NET_currentQueue, X_NET_proxyDispatch )\r
.reset();\r
X_NET_currentQueue = X_NET_currentWrapper = X_NET_currentData = null;\r
};\r
X_NET_currentQueue = X_NET_QUEUE_LIST.shift();\r
X_NET_currentData = X_Pair_get( X_NET_currentQueue );\r
\r
- switch( X_NET_currentData.type ){\r
+ switch( X_NET_currentData.netType ){\r
case X_NET_TYPE_XHR :\r
X_NET_currentWrapper = X_NET_XHRWrapper || X_TEMP.X_Net_XHR_init();\r
break;\r
break;\r
};\r
\r
- X_NET_currentWrapper[ 'listen' ]( [ X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR, X_EVENT_TIMEOUT, X_EVENT_CANCELED ], X_NET_currentQueue, X_NET_proxyDispatch );\r
+ X_NET_currentWrapper[ 'listen' ]( [ X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR, X_EVENT_TIMEOUT ], X_NET_currentQueue, X_NET_proxyDispatch );\r
\r
X_NET_currentWrapper.load( X_NET_currentData );\r
};\r
new ActiveXObject( 'Msxml2.XMLHTTP.4.0' ); // バージョン4.0 は bugfix が行われないので、3.0 か 6.0 を指定すべき\r
new ActiveXObject( 'Msxml2.XMLHTTP.5.0' ); // バージョン5.0 は bugfix が行われないので、3.0 か 6.0 を指定すべき\r
\r
-[IE][Javascript][Json] IE+JsonではまったAdd Star\r
+[IE][Javascript][Json] IE+Jsonではまった\r
http://d.hatena.ne.jp/khiker/20081026/javascript_json\r
> AddCharset utf-8 json\r
> AddType text/javascript json\r
X_EventDispatcher(),\r
{\r
\r
- '_rawType' : X_EventDispatcher_EVENT_TARGET_TYPE.XHR,\r
+ '_rawType' : X_EventDispatcher_EVENT_TARGET_XHR,\r
'_rawObject' : X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X,\r
\r
_isXDR : false, // for ie8\r
\r
_method : '',\r
- _type : '',\r
+ _dataType : '',\r
_busy : false,\r
_canceled : false,\r
_error : false,\r
username = obj[ 'username' ],\r
password = obj[ 'password' ],\r
headers = obj[ 'headers' ] || {},\r
- postbody = obj[ 'postbody' ],\r
+ postdata = obj[ 'postdata' ],\r
timeout = obj[ 'timeout' ] || 20000,\r
tmp;\r
\r
- this._type = obj[ 'type' ] || X_URL_getEXT( url );\r
+ this._dataType = obj[ 'dataType' ] || X_URL_getEXT( url );\r
\r
if( X_Net_XHR_X_DOMAIN ){\r
if( X_URL_isSameDomain( url ) ){ // isXDomain\r
raw.open( method, url, true, username, password );\r
\r
if( raw.responseType !== undefined ){\r
- switch( this._type ){\r
+ switch( this._dataType ){\r
case '' :\r
case 'text' :\r
// js, css\r
break;\r
case 'json' :\r
case 'moz-json' :\r
- raw.responseType = X_UA[ 'Gecko' ] ? this._type : ''; // Iron 37 でエラー\r
+ raw.responseType = X_UA[ 'Gecko' ] ? this._dataType : ''; // Iron 37 でエラー\r
break;\r
case 'document' :\r
case 'xml' :\r
case 'blob' :\r
case 'arraybuffer' :\r
// jpeg,jpg,png,gif,mp3,ogg...\r
- raw.responseType = this._type;\r
+ raw.responseType = this._dataType;\r
break;\r
};\r
};\r
break;\r
};\r
if( obj[ 'mimeType' ] || tmp ) raw.overrideMimeType( obj[ 'mimeType' ] || tmp );\r
- console.log( this._type );\r
+ console.log( this._dataType );\r
console.log( obj[ 'mimeType' ] || tmp );\r
};\r
\r
\r
// http://nakigao.sitemix.jp/blog/?p=2040\r
// json 取得時に SafariでHTTP/412のエラー。但し相手が audio の場合、この指定があるとロードに失敗する。 iOS8.2, iOS7.1 では遭遇せず\r
- if( this._type === 'json' ){\r
- console.log( 'If-Modified-Since : ' + this._type );\r
+ if( this._dataType === 'json' ){\r
+ console.log( 'If-Modified-Since : ' + this._dataType );\r
headers[ 'If-Modified-Since' ] = ( new Date ).toUTCString();\r
};\r
\r
// send 前にフラグを立てる,回線が早いと raw.send() 内で onload -> _busy = false ののち、 _busy = true するため。\r
this._busy = true;\r
\r
-\r
- raw.send( postbody || '' );\r
+ // TODO toString\r
+ raw.send( postdata || '' );\r
},\r
\r
cancel : function(){\r
reset : function(){\r
// XMLHttpRequest で順番にリソースを取得する\r
// http://note.chiebukuro.yahoo.co.jp/detail/n16248\r
- // TODO Opera 10.10 と Safari 4.1 はエラーが起きた XHR を再利用できないので毎回作る\r
+ // Opera 10.10 と Safari 4.1 はエラーが起きた XHR を再利用できないので毎回作る\r
\r
// \r
// domes.lingua.heliohost.org/dom-intro/load-save2.html\r
// XMLHttpRequest オブジェクトを再利用する際も、 abort メソッドを呼び出す必要があるようです。\r
this[ '_rawObject' ].abort && this[ '_rawObject' ].abort();\r
\r
- this._method = this._type = '';\r
+ this._method = this._dataType = '';\r
this._canceled = this._busy = this._error = false;\r
this._timerID && X_Timer_remove( this._timerID );\r
this._percent = this._timerID = 0;\r
// raw.getAllResponseHeaders();\r
\r
// parse json, html, xml, text, script, css\r
- switch( this._type ){\r
+ switch( this._dataType ){\r
case '' :\r
case 'text' :\r
data = raw[ 'responseText' ];\r
X_NET_JSONPWrapper
[ 'asyncDispatch' ]( {
type : jsonString ? X_EVENT_SUCCESS : X_EVENT_ERROR,
- data : window.JSON ? JSON.parse( jsonString ) : eval( 'var a=' + jsonString + ';a' )
+ data : window.JSON ? JSON.parse( jsonString ) : eval( '(' + jsonString + ')' )
} );
X_Net_JSONP_errorTimerID && X_Timer_remove( X_Net_JSONP_errorTimerID );
\r
size = X_Util_Image_getActualDimension( !X_Net_Image_isElement ? this.abspath : this );\r
this.timerID = this[ 'asyncDispatch' ]( {\r
- type : X_EVENT_SUCCESS,\r
- src : this.abspath,\r
- w : size[ 0 ],\r
- h : size[ 1 ]\r
+ 'type' : X_EVENT_SUCCESS,\r
+ 'src' : this.abspath,\r
+ 'w' : size[ 0 ],\r
+ 'h' : size[ 1 ]\r
// TODO feedback net speed\r
// time , this[ '_rawObject' ].fileSize\r
} );\r
}\r
};\r
\r
- /**\r
+ /*\r
* this holds the last move event,\r
* used to fix empty touchend issue\r
* see the onTouch event for an explanation\r
*/\r
var last_move_event = null;\r
\r
- /**\r
+ /*\r
* when the mouse is hold down, this is true\r
* @type {Boolean}\r
*/\r
var enable_detect = false;\r
\r
- /**\r
+ /*\r
* when touch events have been fired, this is true\r
* @type {Boolean}\r
*/\r
};\r
},\r
\r
- /**\r
+ /*\r
* X_Node_BoxModel の情報を引きながら top,left,width,height,padding,border の設定\r
*/\r
updateLayout : function(){\r
};\r
},\r
\r
- /**\r
+ /*\r
* 描画・計測を行って、contentSize の決定\r
*/\r
mesure : function(){\r
// break;\r
};\r
},\r
- /**\r
+ /*\r
* 自身の contentWidth, contentHeight を元に AUTO な width, height を確定していく\r
*/\r
postMesure : function(){\r