OSDN Git Service

Version 0.6.145, fix X.Audio, fix VIEW_ACTIVATE Event @X.ViewPort.
authoritozyun <itozyun@user.sourceforge.jp>
Sat, 9 May 2015 07:12:01 +0000 (16:12 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Sat, 9 May 2015 07:12:01 +0000 (16:12 +0900)
17 files changed:
0.6.x/js/01_core/02_XUA.js
0.6.x/js/01_core/06_XURL.js
0.6.x/js/01_core/10_XCallback.js
0.6.x/js/01_core/11_XClass.js
0.6.x/js/01_core/13_XEventDispatcher.js
0.6.x/js/01_core/16_XViewPort.js
0.6.x/js/02_dom/02_XNode.js
0.6.x/js/02_dom/03_XDomEvent.js
0.6.x/js/02_dom/06_XNodeCSS.js
0.6.x/js/02_dom/08_XNodeSelector.js
0.6.x/js/05_util/01_XNinjaIframe.js
0.6.x/js/06_net/00_XNet.js
0.6.x/js/06_net/01_XNetXHR.js
0.6.x/js/06_net/02_XNetJSONP.js
0.6.x/js/06_net/04_XNetImage.js
0.6.x/js/20_ui/05_XUI_Gesture.js
0.6.x/js/20_ui/06_AbstractUINode.js

index 8c1d839..ad17ef2 100644 (file)
@@ -70,15 +70,17 @@ var X_UA = X[ 'UA' ] = {},
                                 * @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
@@ -102,14 +104,7 @@ var X_UA = X[ 'UA' ] = {},
                         * @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
@@ -117,6 +112,15 @@ var X_UA = X[ 'UA' ] = {},
                                 * @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
index 39951cb..7d395f4 100644 (file)
@@ -15,28 +15,7 @@ var X_URL_BASE_URL = ( function( parts ){
        \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
@@ -111,3 +90,35 @@ function X_URL_getEXT( path ){
        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
index 15efe24..8156687 100644 (file)
@@ -3,39 +3,40 @@
 // ------------ 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
index 1a5499e..be37dc2 100644 (file)
@@ -54,6 +54,8 @@ X_Class_CommonMethods =
                };\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
index 946cbfc..0b83d8d 100644 (file)
@@ -50,14 +50,12 @@ var X_EventDispatcher_once       = false,
        \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
@@ -117,7 +115,7 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] =
                 * @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
@@ -252,7 +250,7 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] =
  * 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
@@ -297,11 +295,12 @@ function X_EventDispatcher_dispatch( e ){
                        };\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
@@ -550,12 +549,12 @@ var X_EventDispatcher_actualAddEvent =
                (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
@@ -587,12 +586,12 @@ var X_EventDispatcher_actualAddEvent =
                (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
@@ -610,13 +609,13 @@ var X_EventDispatcher_actualAddEvent =
                }) :\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
@@ -662,14 +661,14 @@ var X_EventDispatcher_actualRemoveEvent =
        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
@@ -700,14 +699,14 @@ var X_EventDispatcher_actualRemoveEvent =
        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
@@ -729,14 +728,14 @@ var X_EventDispatcher_actualRemoveEvent =
                }) :\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
index 2ed34f4..d2540f4 100644 (file)
@@ -1,6 +1,7 @@
 
 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,
@@ -34,7 +35,7 @@ X_ViewPort = X_Class_override(
        {
 
                'handleEvent' : function( e ){
-                       var href, i, name;
+                       var href, i, name, active = false;
                        
                        switch( e.type ){
                                case 'beforeunload' :
@@ -62,20 +63,22 @@ X_ViewPort = X_Class_override(
                                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;
                        };
@@ -84,6 +87,11 @@ X_ViewPort = X_Class_override(
        }
 );
 
+function X_ViewPort_changeFocus(){
+       X_ViewPort[ 'dispatch' ]( X_ViewPort_active ? X_EVENT_VIEW_ACTIVATE : X_EVENT_VIEW_DEACTIVATE );
+       X_ViewPort_activeTimerID = 0;
+};
+
 
 /**
  * window に相当する ViewPort 情報を提供するオブジェクト。
@@ -397,6 +405,10 @@ X[ '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' ] );
                        };
index 451ea0e..d71a866 100644 (file)
@@ -68,7 +68,7 @@ var   X_Node_BITMASK_RESET_STYLE  = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ (
        \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
index a58bead..cba1424 100644 (file)
@@ -1,4 +1,4 @@
-/**\r
+/*\r
  * use X.Callback\r
  * \r
  * http://d.hatena.ne.jp/uupaa/20100430/1272561922\r
index 31fee5c..ce4a789 100644 (file)
@@ -877,3 +877,4 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_INIT, function(){
        xnode[ 'cssText' ]( '' )[ 'empty' ]();
 });
 
+
index 5a0857e..a1b6fbd 100644 (file)
@@ -1,4 +1,4 @@
-/**\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
index b3cb362..9e3e810 100644 (file)
@@ -80,6 +80,7 @@ X[ 'Util' ][ 'NinjaIframe' ] = Node[ 'inherits' ](
                        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
index e7a6762..0257822 100644 (file)
@@ -4,20 +4,23 @@
 // 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 &lt;script&gt;, &lt;link&gt;\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
@@ -72,13 +74,10 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ](
                                                                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
@@ -100,50 +99,32 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ](
                                };\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
@@ -171,31 +152,54 @@ var X_NET_TYPE_XHR   = 1,
 \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
@@ -203,10 +207,9 @@ function X_NET_proxyDispatch( e ){
 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
@@ -216,7 +219,7 @@ function X_NET_shiftQueue(){
        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
@@ -234,7 +237,7 @@ function X_NET_shiftQueue(){
                        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
index 1dc2d5a..000ba11 100644 (file)
@@ -18,7 +18,7 @@ new ActiveXObject( 'Msxml2.XMLHTTP' );     // バージョンを省略すると
 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
@@ -90,13 +90,13 @@ X_TEMP.X_Net_XHR_init = function(){
                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
@@ -111,11 +111,11 @@ X_TEMP.X_Net_XHR_init = function(){
                                        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
@@ -138,7 +138,7 @@ X_TEMP.X_Net_XHR_init = function(){
                                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
@@ -146,7 +146,7 @@ X_TEMP.X_Net_XHR_init = function(){
                                                        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
@@ -158,7 +158,7 @@ X_TEMP.X_Net_XHR_init = function(){
                                                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
@@ -195,7 +195,7 @@ X_TEMP.X_Net_XHR_init = function(){
                                                        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
@@ -203,8 +203,8 @@ X_TEMP.X_Net_XHR_init = function(){
                                        \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
@@ -223,8 +223,8 @@ X_TEMP.X_Net_XHR_init = function(){
                                // 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
@@ -235,7 +235,7 @@ X_TEMP.X_Net_XHR_init = function(){
                        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
@@ -265,7 +265,7 @@ X_TEMP.X_Net_XHR_init = function(){
                                // 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
@@ -340,7 +340,7 @@ X_TEMP.X_Net_XHR_init = function(){
                                                        // 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
index 11dd975..618cb6c 100644 (file)
@@ -32,7 +32,7 @@ X[ 'Net' ][ 'JSONP' ] = {
                        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 );
index 7ec0e7d..f788116 100644 (file)
@@ -127,10 +127,10 @@ function X_NET_Image_handleEvent( e ){
 \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
index bcf156f..37d0af2 100644 (file)
                }\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
index 249bec3..3180d29 100644 (file)
@@ -348,7 +348,7 @@ var XUI_AbstractUINode = X_EventDispatcher[ 'inherits' ](
                        };\r
                },\r
                \r
-               /**\r
+               /*\r
                 * X_Node_BoxModel の情報を引きながら top,left,width,height,padding,border の設定\r
                 */\r
                updateLayout : function(){\r
@@ -490,7 +490,7 @@ var XUI_AbstractUINode = X_EventDispatcher[ 'inherits' ](
                        };\r
                },\r
                \r
-               /**\r
+               /*\r
                 * 描画・計測を行って、contentSize の決定\r
                 */\r
                mesure : function(){\r
@@ -602,7 +602,7 @@ var XUI_AbstractUINode = X_EventDispatcher[ 'inherits' ](
                                //      break;\r
                        };\r
                },\r
-               /**\r
+               /*\r
                 * 自身の contentWidth, contentHeight を元に AUTO な width, height を確定していく\r
                 */\r
                postMesure : function(){\r