From 6c4c72f7e862c9f950bfb3562adda24c39498abd Mon Sep 17 00:00:00 2001 From: itozyun Date: Sat, 9 May 2015 16:12:01 +0900 Subject: [PATCH] Version 0.6.145, fix X.Audio, fix VIEW_ACTIVATE Event @X.ViewPort. --- 0.6.x/js/01_core/02_XUA.js | 36 ++++++----- 0.6.x/js/01_core/06_XURL.js | 55 +++++++++------- 0.6.x/js/01_core/10_XCallback.js | 31 ++++----- 0.6.x/js/01_core/11_XClass.js | 2 + 0.6.x/js/01_core/13_XEventDispatcher.js | 49 +++++++------- 0.6.x/js/01_core/16_XViewPort.js | 38 +++++++---- 0.6.x/js/02_dom/02_XNode.js | 2 +- 0.6.x/js/02_dom/03_XDomEvent.js | 2 +- 0.6.x/js/02_dom/06_XNodeCSS.js | 1 + 0.6.x/js/02_dom/08_XNodeSelector.js | 2 +- 0.6.x/js/05_util/01_XNinjaIframe.js | 1 + 0.6.x/js/06_net/00_XNet.js | 111 ++++++++++++++++---------------- 0.6.x/js/06_net/01_XNetXHR.js | 32 ++++----- 0.6.x/js/06_net/02_XNetJSONP.js | 2 +- 0.6.x/js/06_net/04_XNetImage.js | 8 +-- 0.6.x/js/20_ui/05_XUI_Gesture.js | 6 +- 0.6.x/js/20_ui/06_AbstractUINode.js | 6 +- 17 files changed, 209 insertions(+), 175 deletions(-) diff --git a/0.6.x/js/01_core/02_XUA.js b/0.6.x/js/01_core/02_XUA.js index 8c1d839..ad17ef2 100644 --- a/0.6.x/js/01_core/02_XUA.js +++ b/0.6.x/js/01_core/02_XUA.js @@ -70,15 +70,17 @@ var X_UA = X[ 'UA' ] = {}, * @type {boolean} */ X_UA[ 'iPhone_4s' ] = true; + + if( i ){ + /** + * iPhone3GS以下 + * @alias X.UA.iPhone_3GS + * @type {boolean} + */ + X_UA[ 'iPhone_3GS' ] = true; + }; }; - if( v && i ){ - /** - * iPhone3GS以下 - * @alias X.UA.iPhone_3GS - * @type {boolean} - */ - X_UA[ 'iPhone_3GS' ] = true; - }; + //alert( 'iPhone ' + ( X_UA[ 'iPhone_3GS' ] ? '3GS以下' : X_UA[ 'iPhone_4s' ] ? '4s以下' : '5以上' ) ); }; if( sys === 'iPad' ){ @@ -102,14 +104,7 @@ var X_UA = X[ 'UA' ] = {}, * @type {boolean} */ X_UA[ 'iPod' ] = true; - if( v && i ){ - /** - * iPod3以下 - * @alias X.UA.iPod_3 - * @type {boolean} - */ - X_UA[ 'iPod_3' ] = true; - }; + if( v ){ /** * iPod4以下 @@ -117,6 +112,15 @@ var X_UA = X[ 'UA' ] = {}, * @type {boolean} */ X_UA[ 'iPod_4' ] = true; + + if( i ){ + /** + * iPod3以下 + * @alias X.UA.iPod_3 + * @type {boolean} + */ + X_UA[ 'iPod_3' ] = true; + }; }; //alert( 'iPod touch ' + ( X_UA[ 'iPod_3' ] ? '3以下' : X_UA[ 'iPod_4' ] ? '4以下' : '5以上' ) ); }; diff --git a/0.6.x/js/01_core/06_XURL.js b/0.6.x/js/01_core/06_XURL.js index 39951cb..7d395f4 100644 --- a/0.6.x/js/01_core/06_XURL.js +++ b/0.6.x/js/01_core/06_XURL.js @@ -15,28 +15,7 @@ var X_URL_BASE_URL = ( function( parts ){ X_URL_IS_LOCAL = X_URL_IS_FILE || location.hostname === 'localhost' || location.hostname === '127.0.0.1', - X_URL_PARAMS = ( function( search ){ - var str = search.slice( 1 ), - parts = str.split( '&' ), - i = 0, - l = parts.length, - obj = {}, - pair, p; - - if( !str ) return obj; - - for( ; i < l; ++i ){ - pair = parts[ i ]; - p = pair.indexOf( '=' ); - if( p === -1 ){ - obj[ decodeURIComponent( pair ) ] = true; - } else { - obj[ decodeURIComponent( pair.substr( 0, p ) ) ] = X_String_parse( decodeURIComponent( pair.substr( p + 1 ) ) ); - }; - }; - - return obj; - } )( location.search ); + X_URL_PARAMS = X_URL_ParamToObj( location.search.slice( 1 ) ); // ------------------------------------------------------------------------- // // --- interface ----------------------------------------------------------- // @@ -111,3 +90,35 @@ function X_URL_getEXT( path ){ return path.length ? path.pop() : ''; }; +function X_URL_objToParam( data ){ + var result = [], k, n = -1; + for( k in data ){ + if( n !== -1 ) result[ ++n ] = '&'; + result[ ++n ] = k; + result[ ++n ] = '='; + result[ ++n ] = encodeURIComponent( data[ k ] ); + } + return result.join( '' ); +}; + +function X_URL_ParamToObj( str ){ + var parts = str.split( '&' ), + i = 0, + l = parts.length, + obj = {}, + pair, p; + + if( !str ) return obj; + + for( ; i < l; ++i ){ + pair = parts[ i ]; + p = pair.indexOf( '=' ); + if( p === -1 ){ + obj[ decodeURIComponent( pair ) ] = true; + } else { + obj[ decodeURIComponent( pair.substr( 0, p ) ) ] = X_String_parse( decodeURIComponent( pair.substr( p + 1 ) ) ); + }; + }; + + return obj; +}; diff --git a/0.6.x/js/01_core/10_XCallback.js b/0.6.x/js/01_core/10_XCallback.js index 15efe24..8156687 100644 --- a/0.6.x/js/01_core/10_XCallback.js +++ b/0.6.x/js/01_core/10_XCallback.js @@ -3,39 +3,40 @@ // ------------ local variables -------------------------------------------- // // ------------------------------------------------------------------------- // -var /** @const */ +var X_Callback_LIVE_LIST = [], - /** @const */ + X_Callback_POOL_LIST = [], - /** @const */ + X_Closure_COMMAND_BACK = X_Callback_LIVE_LIST, - /** @const */ + X_Closure_COMMAND_DROP = X_Callback_POOL_LIST, - /** @const */ + /* @const */ X_Callback_THIS_FUNC = 1, - /** @const */ + /* @const */ X_Callback_HANDLEEVENT = 2, - /** @const */ + /* @const */ X_Callback_FUNC_ONLY = 3, - /** @const */ + /* @const */ X_Callback_NONE = 0, - /** @const */ + /* @const */ X_Callback_UN_LISTEN = 1, - /** @const */ + /* @const */ X_Callback_STOP_PROPAGATION = 2, - /** @const */ + /* @const */ X_Callback_STOP_NOW = 4 | 2, // 同一階層のリスナーのキャンセル(上位へもキャンセル) - /** @const */ + /* @const */ X_Callback_PREVENT_DEFAULT = 8, // 結果動作のキャンセル, - /** @const */ + /* @const */ X_Callback_MONOPOLY = 16, // move event を独占する - + /* @const */ X_Callback_CAPTURE_POINTER = 16, + /* @const */ X_Callback_RELEASE_POINTER = 32, - /** @const */ + /* @const */ X_Callback_SYS_CANCEL = 64 | 4 | 2; /* diff --git a/0.6.x/js/01_core/11_XClass.js b/0.6.x/js/01_core/11_XClass.js index 1a5499e..be37dc2 100644 --- a/0.6.x/js/01_core/11_XClass.js +++ b/0.6.x/js/01_core/11_XClass.js @@ -54,6 +54,8 @@ X_Class_CommonMethods = }; X_Class_killPrivateFlag = false; // instance.kill() 内で PrivateInstance.kill() を防ぐため + // TODO kill 中の kill の呼び出しを防ぐ, 破棄済のインスタンスへの kill + if( this[ 'instanceOf' ]( X_EventDispatcher ) ){ if( !def.isPrivate ){ if( this[ 'dispatch' ]( X_EVENT_BEFORE_KILL_INSTANCE ) & X_Callback_PREVENT_DEFAULT ){ diff --git a/0.6.x/js/01_core/13_XEventDispatcher.js b/0.6.x/js/01_core/13_XEventDispatcher.js index 946cbfc..0b83d8d 100644 --- a/0.6.x/js/01_core/13_XEventDispatcher.js +++ b/0.6.x/js/01_core/13_XEventDispatcher.js @@ -50,14 +50,12 @@ var X_EventDispatcher_once = false, X_EventDispatcher_safariPreventDefault = false, // Safari3- - /** - * @enum {number} - */ - X_EventDispatcher_EVENT_TARGET_TYPE = { - OTHER : 0, - XHR : 1, - SILVER_LIGHT : 2 - }, + /* @const */ + X_EventDispatcher_EVENT_TARGET_OTHER = 0, + /* @const */ + X_EventDispatcher_EVENT_TARGET_XHR = 1, + /* @const */ + X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT = 2, X_EventDispatcher_LAZY_TIMERS = {}; // Object. number は timerID @@ -117,7 +115,7 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] = * @private * @type {number} */ - '_rawType' : X_EventDispatcher_EVENT_TARGET_TYPE.OTHER, + '_rawType' : X_EventDispatcher_EVENT_TARGET_OTHER, /** * イベントリスナをイベント名文字列や数値(1~,フレームワーク内で定義)をキーとするArrayで記憶します。
@@ -252,7 +250,7 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] = * dispatch のコールバック中で unlisten() が呼ばれた場合、即座に反映され削除されたイベントリスナーは呼ばれない。 * @alias EventDispatcher.prototype.dispatch * @param {eventHash|string|number} e - * @return {number} X.Callback で定義された数値 + * @return {number} X.Callback で定義された数値(ビットフラグ) */ function X_EventDispatcher_dispatch( e ){ var listeners = this[ '_listeners' ], @@ -297,11 +295,12 @@ function X_EventDispatcher_dispatch( e ){ }; unlistens.indexOf( f ) === -1 && ( unlistens[ unlistens.length ] = f ); }; - + ret |= X_Type_isFinite( r ) ? r : 0; + if( r & X_Callback_STOP_NOW ){ sysOnly = true; - }; - ret |= X_Type_isFinite( r ) ? r : 0; + break; + }; }; if( ( --listeners[ X_Listeners_.DISPATCHING ] ) === 0 ){ @@ -550,12 +549,12 @@ var X_EventDispatcher_actualAddEvent = (function( that, type, raw, list ){ var f; switch( that[ '_rawType' ] ){ - case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT : + case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT : list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] ); list.sltoken = raw.AddEventListener( type, list.slcallback ); break; - case X_EventDispatcher_EVENT_TARGET_TYPE.XHR : + case X_EventDispatcher_EVENT_TARGET_XHR : if( X_UA[ 'Opera' ] < 12 ){ // Opera11- の XHR は event オブジェクトが返らないため, eventType 毎に callback を指定する addEventListener もない raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] ); @@ -587,12 +586,12 @@ var X_EventDispatcher_actualAddEvent = (function( that, type, raw, list ){ var f; switch( that[ '_rawType' ] ){ - case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT : + case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT : list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] ); list.sltoken = raw.AddEventListener( type, list.slcallback ); break; - case X_EventDispatcher_EVENT_TARGET_TYPE.XHR : + case X_EventDispatcher_EVENT_TARGET_XHR : // ie8- の XHR は window.event が更新されないため, eventType 毎に callback を指定する raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] ); break; @@ -610,13 +609,13 @@ var X_EventDispatcher_actualAddEvent = }) : (function( that, type, raw, list ){ switch( that[ '_rawType' ] ){ - case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT : + case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT : // DOM0 で Silverlight ってあるの -> ie4 mobile? list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] ); list.sltoken = raw.AddEventListener( type, list.slcallback ); break; - case X_EventDispatcher_EVENT_TARGET_TYPE.XHR : + case X_EventDispatcher_EVENT_TARGET_XHR : // ie4 mobile は XHR をサポート! raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] ); break; @@ -662,14 +661,14 @@ var X_EventDispatcher_actualRemoveEvent = X_UA_EVENT.W3C ? (function( that, type, raw, list, skip ){ switch( that[ '_rawType' ] ){ - case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT : + case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT : raw.RemoveEventListener( type, list.sltoken ); // token X_Callback_correct( list.slcallback ); delete list.sltoken; delete list.slcallback; break; - case X_EventDispatcher_EVENT_TARGET_TYPE.XHR : + case X_EventDispatcher_EVENT_TARGET_XHR : if( X_UA[ 'Opera' ] < 12 ){ // Opera11- の XHR は event オブジェクトが返らないため, eventType 毎に callback を指定する addEventListener もない X_Callback_correct( raw[ 'on' + type ] ); @@ -700,14 +699,14 @@ var X_EventDispatcher_actualRemoveEvent = X_UA_EVENT.IE ? (function( that, type, raw, list, skip ){ switch( that[ '_rawType' ] ){ - case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT : + case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT : raw.RemoveEventListener( type, list.sltoken ); // token X_Callback_correct( list.slcallback ); delete list.sltoken; delete list.slcallback; break; - case X_EventDispatcher_EVENT_TARGET_TYPE.XHR : + case X_EventDispatcher_EVENT_TARGET_XHR : X_Callback_correct( raw[ 'on' + type ] ); raw[ 'on' + type ] = X_emptyFunction; raw[ 'on' + type ] = ''; @@ -729,14 +728,14 @@ var X_EventDispatcher_actualRemoveEvent = }) : (function( that, type, raw, list, skip ){ switch( that[ '_rawType' ] ){ - case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT : + case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT : raw.RemoveEventListener( type, list.sltoken ); // token X_Callback_correct( list.slcallback ); delete list.sltoken; delete list.slcallback; break; - case X_EventDispatcher_EVENT_TARGET_TYPE.XHR : + case X_EventDispatcher_EVENT_TARGET_XHR : X_Callback_correct( raw[ 'on' + type ] ); raw[ 'on' + type ] = X_emptyFunction; raw[ 'on' + type ] = ''; diff --git a/0.6.x/js/01_core/16_XViewPort.js b/0.6.x/js/01_core/16_XViewPort.js index 2ed34f4..d2540f4 100644 --- a/0.6.x/js/01_core/16_XViewPort.js +++ b/0.6.x/js/01_core/16_XViewPort.js @@ -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' ] ); }; diff --git a/0.6.x/js/02_dom/02_XNode.js b/0.6.x/js/02_dom/02_XNode.js index 451ea0e..d71a866 100644 --- a/0.6.x/js/02_dom/02_XNode.js +++ b/0.6.x/js/02_dom/02_XNode.js @@ -68,7 +68,7 @@ var X_Node_BITMASK_RESET_STYLE = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ ( X_Node_BitMask_IE4_IS_MIX = X_Node_State.IE4_HAS_TEXTNODE | X_Node_State.IE4_HAS_ELEMENT, - /** @enum {number} */ + /* @enum {number} */ X_Node_TYPE = { XNODE : 1, RAW_HTML : 2, diff --git a/0.6.x/js/02_dom/03_XDomEvent.js b/0.6.x/js/02_dom/03_XDomEvent.js index a58bead..cba1424 100644 --- a/0.6.x/js/02_dom/03_XDomEvent.js +++ b/0.6.x/js/02_dom/03_XDomEvent.js @@ -1,4 +1,4 @@ -/** +/* * use X.Callback * * http://d.hatena.ne.jp/uupaa/20100430/1272561922 diff --git a/0.6.x/js/02_dom/06_XNodeCSS.js b/0.6.x/js/02_dom/06_XNodeCSS.js index 31fee5c..ce4a789 100644 --- a/0.6.x/js/02_dom/06_XNodeCSS.js +++ b/0.6.x/js/02_dom/06_XNodeCSS.js @@ -877,3 +877,4 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_INIT, function(){ xnode[ 'cssText' ]( '' )[ 'empty' ](); }); + diff --git a/0.6.x/js/02_dom/08_XNodeSelector.js b/0.6.x/js/02_dom/08_XNodeSelector.js index 5a0857e..a1b6fbd 100644 --- a/0.6.x/js/02_dom/08_XNodeSelector.js +++ b/0.6.x/js/02_dom/08_XNodeSelector.js @@ -1,4 +1,4 @@ -/** +/* * Original code by ofk ( kQuery, ksk ) * http://d.hatena.ne.jp/ofk/comment/20090106/1231258010 * http://d.hatena.ne.jp/ofk/20090111/1231668170 diff --git a/0.6.x/js/05_util/01_XNinjaIframe.js b/0.6.x/js/05_util/01_XNinjaIframe.js index b3cb362..9e3e810 100644 --- a/0.6.x/js/05_util/01_XNinjaIframe.js +++ b/0.6.x/js/05_util/01_XNinjaIframe.js @@ -80,6 +80,7 @@ X[ 'Util' ][ 'NinjaIframe' ] = Node[ 'inherits' ]( return this; }, + // TODO close -> kill 'close' : function(){ X_ViewPort[ 'unlisten' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent ); this.call( 'close' ); diff --git a/0.6.x/js/06_net/00_XNet.js b/0.6.x/js/06_net/00_XNet.js index e7a6762..0257822 100644 --- a/0.6.x/js/06_net/00_XNet.js +++ b/0.6.x/js/06_net/00_XNet.js @@ -4,20 +4,23 @@ // http://bugs.jquery.com/ticket/2709 // がある場合、