From 34431df46635079c1ce6626c9caf1456f88e91bd Mon Sep 17 00:00:00 2001 From: itozyun Date: Thu, 8 Oct 2015 22:49:24 +0900 Subject: [PATCH] Version 0.6.178, fix X.KB for IE5-, X.HTMLAudio for ChromeWV & AOSP. --- 0.6.x/js/01_core/01_X.js | 1 + 0.6.x/js/01_core/02_XUA.js | 29 ++++++++---- 0.6.x/js/01_core/06_XString.js | 11 +++-- 0.6.x/js/01_core/21_XViewPort.js | 61 +++++++++++------------- 0.6.x/js/02_dom/10_XNodeAnime.js | 4 +- 0.6.x/js/05_util/04_XXML.js | 2 +- 0.6.x/js/06_net/00_XNet.js | 10 ++-- 0.6.x/js/06_net/02_XNetJSONP.js | 5 ++ 0.6.x/js/06_net/03_XNetForm.js | 58 ++++++++++++----------- 0.6.x/js/06_net/04_XNetImage.js | 36 +++++++-------- 0.6.x/js/06_net/05_XXHRGadget.js | 2 +- 0.6.x/js/06_net/10_XOAuth2.js | 2 +- 0.6.x/js/07_audio/00_XAudio.js | 17 ++++--- 0.6.x/js/07_audio/01_XWebAudio.js | 19 ++++---- 0.6.x/js/07_audio/02_XHTMLAudio.js | 60 ++++++++++++++++-------- 0.6.x/js/07_audio/03_XSilverlightAudio.js | 2 +- 0.6.x/js/07_audio/10_XAudioSprite.js | 15 ++++-- 0.6.x/js/11_hid/01_KB.js | 77 ++++--------------------------- 18 files changed, 195 insertions(+), 216 deletions(-) diff --git a/0.6.x/js/01_core/01_X.js b/0.6.x/js/01_core/01_X.js index 7a74113..5c0ef3d 100644 --- a/0.6.x/js/01_core/01_X.js +++ b/0.6.x/js/01_core/01_X.js @@ -73,3 +73,4 @@ X[ 'inHead' ] = (function( s ){ s = s.parentElement || s.parentNode || s;// s is for opera7.11 return s.tagName.toLowerCase() === 'head';// opera7.23 s.tagName is 'HTML' })( document.scripts || document.getElementsByTagName && document.getElementsByTagName( 'script' ) || document.all && document.all.tags( 'script' ) ); + diff --git a/0.6.x/js/01_core/02_XUA.js b/0.6.x/js/01_core/02_XUA.js index da6f8e2..0d03ee6 100644 --- a/0.6.x/js/01_core/02_XUA.js +++ b/0.6.x/js/01_core/02_XUA.js @@ -573,12 +573,12 @@ var X_UA = X[ 'UA' ] = {}, }; // Android 標準ブラウザ AOSP と ChromeWeb View, Sブラウザがある - if( X_UA[ 'Android' ] && - ( dua.indexOf( 'Chrome\/' ) === -1 || dua.indexOf( 'Version\/' ) !== -1 ) ){ // Chrome/ を含まない または Version/ を含む + if( ( v = X_UA[ 'Android' ] ) && + ( dua.indexOf( 'Chrome\/' ) < 0 || 0 < dua.indexOf( 'Version\/' ) ) ){ // Chrome/ を含まない または Version/ を含む /* if( window.chrome ){ // Android3.1 のAOSPブラウザで .chrome がいた、、、 } else */ - if( dua.indexOf( 'Version\/' ) === -1 && ( v = parseFloat( dua.split( 'Chrome\/' )[ 1 ] ) ) ){ + if( dua.indexOf( 'Version\/' ) < 0 && 0 < dua.indexOf( 'Chrome\/' ) ){ /** * Android 標準ブラウザ Chrome WebView ブラウザ * @alias X.UA.ChromeWV @@ -593,15 +593,14 @@ var X_UA = X[ 'UA' ] = {}, // CustomElement の有無で判定 if( document[ 'registerElement' ] ){ // UA が偽装された Chrome WebView - X_UA[ 'ChromeWV' ] = tv; - alert( 'UA が偽装された Chrome WebView' ); + X_UA[ 'ChromeWV' ] = v; } else { /** * Android 標準ブラウザ AOSP * @alias X.UA.AOSP * @type {number} */ - X_UA[ 'AOSP' ] = X_UA[ 'Android' ]; + X_UA[ 'AOSP' ] = v; }; /* @@ -775,6 +774,16 @@ if( document.getElementById ){ }; }; +var X_elmHtml = document.documentElement || + X_UA_DOM.W3C ? document.getElementsByTagName( 'html' )[ 0 ] : + X_UA_DOM.IE4 ? document.all.tags( 'html' )[ 0 ] : null, + + X_elmHead = + X_UA_DOM.W3C ? document.getElementsByTagName( 'head' )[ 0 ] : + X_UA_DOM.IE4 ? document.all.tags( 'head' )[ 0 ] : null, + + X_elmBody; + if( navigator.msPointerEnabled || navigator.pointerEnabled ) X_UA_HID.POINTER = true; if( !X_UA_HID.POINTER && window.ontouchstart !== undefined ) X_UA_HID.TOUCH = true; @@ -812,13 +821,13 @@ var X_Script_VBS_ENABLED = X_UA[ 'Windows' ] && !X_UA[ 'WinCE' ] && !X_UA[ 'WinP * @type {object} */ X[ 'Script' ] = { - 'try' : X_Script_try + 'tryCatch' : X_Script_try }; if( X_UA[ 'IE' ] < 9 && X_Script_VBS_ENABLED ){ (function( lines ){ var s = document.createElement( 'script' ); - document.getElementsByTagName("head")[ 0 ].appendChild( s ); + X_elmHead.appendChild( s ); s.type = 'text/vbscript'; s.text = lines.join( '\n' ); @@ -849,7 +858,8 @@ if( X_UA[ 'IE' ] < 9 && X_Script_VBS_ENABLED ){ function X_Script_try( func, args ){ if( X_UA[ 'IE' ] < 5.5 ){ - return func.apply( {}, args ); + //return func.apply( {}, args ); + return; }; return ( new Function( 'f,a', 'try{return f.apply({},a)}catch(e){}' ) )( func, args || [] ); }; @@ -883,6 +893,5 @@ if( X_UA[ 'IE' ] < 7 ){ // error @ NN7.2 * multipleIEs IE6 standalone 版では不可, IE5.5 は可,,, * @alias X.UA.ieExeComError */ ( X_UA[ 'ieExeComError' ] = true ) - //eval( 'var a=1;try{document.execCommand&&document.execCommand("BackgroundImageCache",!1,!0)}catch(e){a=0}!a' ) ); }; diff --git a/0.6.x/js/01_core/06_XString.js b/0.6.x/js/01_core/06_XString.js index 828db90..7af321c 100644 --- a/0.6.x/js/01_core/06_XString.js +++ b/0.6.x/js/01_core/06_XString.js @@ -72,6 +72,9 @@ function X_String_parse( v ){ */ function X_String_cleanupWhiteSpace( text ){ var _ = ' ', __ = ' ', CRLF = X_String_CRLF; + + if( !text ) return ''; + //text.indexOf( CRLF ) !== -1 && ( text = text.split( CRLF ).join( _ ) ); text.indexOf( '\n\r' ) !== -1 && ( text = text.split( '\n\r' ).join( _ ) ); text.indexOf( '\t' ) !== -1 && ( text = text.split( '\t' ).join( _ ) ); @@ -79,13 +82,10 @@ function X_String_cleanupWhiteSpace( text ){ text.indexOf( '\n' ) !== -1 && ( text = text.split( '\n' ).join( _ ) ); text.indexOf( '\f' ) !== -1 && ( text = text.split( '\f' ).join( _ ) ); text.indexOf( '\b' ) !== -1 && ( text = text.split( '\b' ).join( _ ) ); - //while( text.indexOf( __ ) !== -1 ){ - // text = text.split( __ ).join( _ ); - //}; - //return text; + while( true ){ text = text.split( __ ); - if( text.length < 2 ) return text.join( _ ); + if( text.length < 2 ) return text[ 0 ]; text = text.join( _ ); }; }; @@ -138,6 +138,7 @@ function X_String_toChrReferance( str ){ return str.toString() .split( '&' ).join( '&' ) .split( '"' ).join( '"' ) + .split( '"' ).join( ''' ) .split( '<' ).join( '<' ) .split( '>' ).join( '>' ) .split( ' ' ).join( ' ' ); diff --git a/0.6.x/js/01_core/21_XViewPort.js b/0.6.x/js/01_core/21_XViewPort.js index 7c29e7d..c83d9de 100644 --- a/0.6.x/js/01_core/21_XViewPort.js +++ b/0.6.x/js/01_core/21_XViewPort.js @@ -256,8 +256,8 @@ X[ 'ViewPort' ] = { }, //https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect //use window.pageXOffset and window.pageYOffset instead of window.scrollX and window.scrollY -//(((t = document.documentElement) || (t = document.body.parentNode)) && typeof t.ScrollLeft == 'number' ? t : document.body).ScrollLeft; -//(((t = document.documentElement) || (t = document.body.parentNode)) && typeof t.ScrollTop == 'number' ? t : document.body).ScrollTop +//(((t = document.documentElement) || (t = X_elmBody.parentNode)) && typeof t.ScrollLeft == 'number' ? t : X_elmBody).ScrollLeft; +//(((t = document.documentElement) || (t = X_elmBody.parentNode)) && typeof t.ScrollTop == 'number' ? t : X_elmBody).ScrollTop // TODO X.Doc へ /** @@ -273,7 +273,7 @@ X[ 'ViewPort' ] = { /*X_UA[ 'Opera' ] ? ( document.documentElement && document.documentElement.clientWidth ? new Function( 'return[document.documentElement.clientWidth,document.documentElement.clientHeight]' ) : - new Function( 'return[document.body.clientWidth,document.body.clientHeight]' ) + new Function( 'return[X_elmBody.clientWidth,X_elmBody.clientHeight]' ) ) :*/ return [ X_ViewPort_rootElement.scrollWidth || X_ViewPort_rootElement.offsetWidth, @@ -299,7 +299,7 @@ X[ 'ViewPort' ] = { ( function(){ X_Node_updateTimerID && X_Node_startUpdate(); // body は Safari2- - return[ X_ViewPort_scrollX = X_ViewPort_rootElement.scrollLeft || document.body.scrollLeft, X_ViewPort_scrollY = X_ViewPort_rootElement.scrollTop || document.body.scrollTop ]; + return[ X_ViewPort_scrollX = X_ViewPort_rootElement.scrollLeft || X_elmBody.scrollLeft, X_ViewPort_scrollY = X_ViewPort_rootElement.scrollTop || X_elmBody.scrollTop ]; } ), /** @@ -415,7 +415,7 @@ X[ 'ViewPort' ] = { }; X_TEMP.onDomContentLoaded = function(){ - var s, size, elmHtml, elmHead, elmBody, html, head, body; + var s, size, html, head, body; console.log( '> X_TEMP.onDomContentLoaded rs:' + X_ViewPort_readyState ); @@ -425,25 +425,17 @@ X[ 'ViewPort' ] = { // DOMContentLoaded の無いブラウザで X_TEMP.onDomContentLoaded への参照が残り続けるのを回避 X_TEMP.onDomContentLoaded && X_ViewPort_document[ 'unlisten' ]( 'DOMContentLoaded', X_TEMP.onDomContentLoaded ); delete X_TEMP.onDomContentLoaded; - - elmHtml = document.documentElement || - X_UA_DOM.W3C ? document.getElementsByTagName( 'html' )[ 0 ] : - X_UA_DOM.IE4 ? document.all.tags( 'html' )[ 0 ] : null; - - elmHead = - X_UA_DOM.W3C ? document.getElementsByTagName( 'head' )[ 0 ] : - X_UA_DOM.IE4 ? document.all.tags( 'head' )[ 0 ] : null; - elmBody = document.body; + X_elmBody = document.body; - X_ViewPort_rootElement = document.compatMode !== 'CSS1Compat' ? elmBody : elmHtml || elmBody; + X_ViewPort_rootElement = document.compatMode !== 'CSS1Compat' ? X_elmBody : X_elmHtml || X_elmBody; /** * Node( documentElement ) * @alias X.Doc.html * @type {Node} */ - X[ 'Doc' ][ 'html' ] = html = X_Node_html = elmHtml && Node( elmHtml )[ 'removeClass' ]( 'js-disabled' )[ 'addClass' ]( X_UA_classNameForHTML ); + X[ 'Doc' ][ 'html' ] = html = X_Node_html = X_elmHtml && Node( X_elmHtml )[ 'removeClass' ]( 'js-disabled' )[ 'addClass' ]( X_UA_classNameForHTML ); html[ '_flags' ] |= X_NodeFlags_IN_TREE; /** @@ -451,14 +443,14 @@ X[ 'ViewPort' ] = { * @alias X.Doc.head * @type {Node} */ - X[ 'Doc' ][ 'head' ] = head = X_Node_head = elmHead && Node( elmHead ); + X[ 'Doc' ][ 'head' ] = head = X_Node_head = X_elmHead && Node( X_elmHead ); /** * Node( documentElement ) * @alias X.Doc.body * @type {Node} */ - X[ 'Doc' ][ 'body' ] = body = X_Node_body = Node( elmBody ); + X[ 'Doc' ][ 'body' ] = body = X_Node_body = Node( X_elmBody ); body[ 'parent ' ] = head[ 'parent' ] = html; html[ '_xnodes' ] = [ head, body ]; @@ -466,13 +458,13 @@ X[ 'ViewPort' ] = { html[ 'appendTo' ] = html[ 'prev' ] = html[ 'next' ] = html[ 'clone' ] = html[ 'remove' ] = html[ 'kill' ] = html[ 'create' ] = html[ 'createText' ] = html[ 'createAt' ] = html[ 'createTextAt' ] = html[ 'append' ] = html[ 'appendAt' ] = html[ 'empty' ] = html[ 'html' ] = html[ 'text' ] = html[ 'css' ] = html[ 'cssText' ] = - head[ 'appendTo' ] = head[ 'prev' ] = head[ 'next' ] = head[ 'clone' ] = head[ 'remove' ] = head[ 'kill' ] = + head[ 'appendTo' ] = head[ 'prev' ] = head[ 'clone' ] = head[ 'remove' ] = head[ 'kill' ] = head[ 'createText' ] = head[ 'createTextAt' ] = head[ 'empty' ] = head[ 'html' ] = head[ 'text' ] = head[ 'css' ] = head[ 'cssText' ] = - body[ 'appendTo' ] = body[ 'prev' ] = body[ 'next' ] = body[ 'clone' ] = body[ 'remove' ] = body[ 'kill' ] = new Function( 'return this' ); + body[ 'appendTo' ] = body[ 'next' ] = body[ 'clone' ] = body[ 'remove' ] = body[ 'kill' ] = new Function( 'return this' ); X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT, function(){ X_ViewPort_readyState = X_EVENT_XTREE_READY; - if( X_TEMP.X_Dom_useBuilder ) X_TEMP.X_Dom_useBuilder = !!document.body.children.length; + if( X_TEMP.X_Dom_useBuilder ) X_TEMP.X_Dom_useBuilder = !!X_elmBody.children.length; !X_TEMP.X_Dom_useBuilder && X_ViewPort[ 'asyncDispatch' ]( X_EVENT_XTREE_READY ); } ); @@ -492,24 +484,23 @@ X[ 'ViewPort' ] = { var size = X_ViewPort_getWindowSize(), // http://jsdo.it/imaya/kTYg - body = document.body, - defaultOverflow = document.body.style.overflow, + defaultOverflow = X_elmBody.style.overflow, w, h; X_ViewPort_width = size[ 0 ]; X_ViewPort_height = size[ 1 ]; - body.style.overflow = 'hidden'; - w = body.clientWidth; - h = body.clientHeight; + X_elmBody.style.overflow = 'hidden'; + w = X_elmBody.clientWidth; + h = X_elmBody.clientHeight; - body.style.overflow = 'scroll'; - w -= body.clientWidth; - h -= body.clientHeight; + X_elmBody.style.overflow = 'scroll'; + w -= X_elmBody.clientWidth; + h -= X_elmBody.clientHeight; - if( !w ) w = body.offsetWidth - body.clientWidth; - if( !h ) h = body.offsetHeight - body.clientHeight; - body.style.overflow = defaultOverflow; + if( !w ) w = X_elmBody.offsetWidth - X_elmBody.clientWidth; + if( !h ) h = X_elmBody.offsetHeight - X_elmBody.clientHeight; + X_elmBody.style.overflow = defaultOverflow; X_ViewPort_vScrollbarSize = w; X_ViewPort_hScrollbarSize = h; @@ -607,9 +598,9 @@ if( 6 <= X_UA[ 'IE' ] && X[ 'inHead' ] && !X_UA[ 'ieExeComError' ] ){ // standal //X_TEMP._script = document.getElementById( '__ieonload' ); // 上のコードはスタンドアローン版ie6でエラー - X_TEMP._script = document.createElement( '' ) ; - document.getElementsByTagName( 'head' )[ 0 ].appendChild( X_TEMP._script ); - + X_TEMP._script = document.createElement( '' ); + X_elmHead.appendChild( X_TEMP._script ); + X_TEMP._script.onreadystatechange = function(){ var s = X_TEMP._script; if( s && s.readyState === 'complete' ){ diff --git a/0.6.x/js/02_dom/10_XNodeAnime.js b/0.6.x/js/02_dom/10_XNodeAnime.js index 1c95264..8bb80ef 100644 --- a/0.6.x/js/02_dom/10_XNodeAnime.js +++ b/0.6.x/js/02_dom/10_XNodeAnime.js @@ -428,8 +428,8 @@ function X_Node_Anime_getComputedPosition( that ) { x = + ( matrix[ 12 ] || matrix[ 4 ] ); y = + ( matrix[ 13 ] || matrix[ 5 ] ); } else { - x = + parseInt( matrix.left ); - y = + parseInt( matrix.top ); + x = + parseFloat( matrix.left ); + y = + parseFloat( matrix.top ); }; return { x : x, y : y, a : matrix[ X_Node_CSS_Support[ 'opacity' ] ] }; diff --git a/0.6.x/js/05_util/04_XXML.js b/0.6.x/js/05_util/04_XXML.js index 4f7ab2a..34f50a4 100644 --- a/0.6.x/js/05_util/04_XXML.js +++ b/0.6.x/js/05_util/04_XXML.js @@ -81,7 +81,7 @@ function XMLWrapper_val( queryString, type ){ case 'number' : return parseFloat( v ); case 'int' : - return parseInt( v ); + return parseFloat( v ) | 0; case 'boolean' : return v && v !== '0' && v !== 'false' && v !== 'null' && v !== 'undefined' && v !== 'NaN'; //case 'string' : diff --git a/0.6.x/js/06_net/00_XNet.js b/0.6.x/js/06_net/00_XNet.js index 9c388e0..2a75d06 100644 --- a/0.6.x/js/06_net/00_XNet.js +++ b/0.6.x/js/06_net/00_XNet.js @@ -166,7 +166,7 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ]( // XDomain 不可 -> Flash, Gears, Silverlight, canUseGadget なら gadget に切替? // PUT DELETE UPDATE 不可 -> Flash, Gears, Silverlight, canUseGadget なら gadget に切替? - // xプロトコル な binary のロード -> gadget 内で proxyURL による XHR + // xプロトコル(X_URL_isSameProtocol) な binary のロード -> gadget 内で proxyURL による XHR // or X_EVENT_ERROR opt[ 'dataType' ] = opt[ 'dataType' ] || X_URL_getEXT( url ); @@ -220,8 +220,8 @@ var X_NET_TYPE_XHR = 1, X_XHR, X_JSONP, - X_NET_FormWrapper, - X_NET_ImageWrapper, + X_FormSender, + X_ImgLoader, X_GadgetXHR, X_NET_currentWrapper, @@ -351,10 +351,10 @@ function X_NET_shiftQueue(){ X_NET_currentWrapper = X_JSONP || X_TEMP.X_JSONP_init(); break; case X_NET_TYPE_FORM : - X_NET_currentWrapper = X_NET_FormWrapper || X_TEMP.X_NET_Form_init(); + X_NET_currentWrapper = X_FormSender || X_TEMP.X_FormSender_init(); break; case X_NET_TYPE_IMAGE : - X_NET_currentWrapper = X_NET_ImageWrapper || X_TEMP.X_NET_Image_init(); + X_NET_currentWrapper = X_ImgLoader || X_TEMP.X_ImgLoader_init(); break; }; diff --git a/0.6.x/js/06_net/02_XNetJSONP.js b/0.6.x/js/06_net/02_XNetJSONP.js index a118ebc..b233d7b 100644 --- a/0.6.x/js/06_net/02_XNetJSONP.js +++ b/0.6.x/js/06_net/02_XNetJSONP.js @@ -75,6 +75,11 @@ X_TEMP.X_JSONP_params = { json2FileSize = 18103, html; + // file プロトコルで外部アクセスの禁止 + if( !X_URL_isSameProtocol( url ) ){ + return X_JSONP[ 'asyncDispatch' ]( X_EVENT_ERROR ); + }; + url = X_URL_create( url, params ); if( !callback && !( callback = X_URL_paramToObj( url.split( '?' )[ 1 ] )[ 'callback' ] ) ){ diff --git a/0.6.x/js/06_net/03_XNetForm.js b/0.6.x/js/06_net/03_XNetForm.js index 1bfd498..dd2ab0e 100644 --- a/0.6.x/js/06_net/03_XNetForm.js +++ b/0.6.x/js/06_net/03_XNetForm.js @@ -1,24 +1,26 @@ //{+netform"
によるGETとPOST"(動的に生成したフォームによるGETとPOST。)[+net,+ninjaiframe] -var X_NET_Form_errorTimerID, X_Net_Form_onloadCount = 0; +var X_FormSender_errorTimerID, X_FormSender_onloadCount = 0; -X_TEMP.X_NET_Form_init = function(){ - X_NET_FormWrapper = X_Class_override( X_NinjaIframe(), X_TEMP.X_NET_Form_params ); +X_TEMP.X_FormSender_init = function(){ + X_FormSender = X_Class_override( X_NinjaIframe(), X_TEMP.X_FormSender_params ); - delete X_TEMP.X_NET_Form_init; - delete X_TEMP.X_NET_Form_params; + delete X_TEMP.X_FormSender_init; + delete X_TEMP.X_FormSender_params; - return X_NET_FormWrapper; + return X_FormSender; }; /* - * form 構築時に ">' ); - X_NET_FormWrapper + X_FormSender [ 'refresh' ]( html.join( '' ) ) - [ 'listen' ]( [ 'ninjaload', 'ninjaerror' ], X_NET_Form_iframeListener ); + [ 'listen' ]( [ 'ninjaload', 'ninjaerror' ], X_FormSender_iframeListener ); - X_NET_FormWrapper._busy = true; + X_FormSender._busy = true; }, cancel : function(){ - X_NET_FormWrapper.reset(); - X_NET_FormWrapper._canceled = true; + X_FormSender.reset(); + X_FormSender._canceled = true; }, reset : function(){ - X_NET_FormWrapper._busy = X_NET_FormWrapper._canceled = false; - X_NET_FormWrapper[ 'unlisten' ]( [ 'ninjaload', 'ninjaerror' ], X_NET_Form_iframeListener ); - X_NET_FormWrapper[ 'refresh' ]( '' ); - X_NET_Form_errorTimerID && X_Timer_remove( X_NET_Form_errorTimerID ); - X_NET_Form_errorTimerID = X_Net_Form_onloadCount = 0; + X_FormSender._busy = X_FormSender._canceled = false; + X_FormSender[ 'unlisten' ]( [ 'ninjaload', 'ninjaerror' ], X_FormSender_iframeListener ); + X_FormSender[ 'refresh' ]( '' ); + X_FormSender_errorTimerID && X_Timer_remove( X_FormSender_errorTimerID ); + X_FormSender_errorTimerID = X_FormSender_onloadCount = 0; } }; -function X_NET_Form_iframeListener( e ){ +function X_FormSender_iframeListener( e ){ var idoc; switch( e.type ){ @@ -79,20 +81,20 @@ function X_NET_Form_iframeListener( e ){ return; }; - if( ++X_Net_Form_onloadCount === 1 ){ - X_NET_Form_errorTimerID = X_NET_FormWrapper[ 'asyncDispatch' ]( this.timeout, X_EVENT_ERROR ); + if( ++X_FormSender_onloadCount === 1 ){ + X_FormSender_errorTimerID = X_FormSender[ 'asyncDispatch' ]( this.timeout, X_EVENT_ERROR ); // TODO レスポンスの html にアクセスしたい場合 // TODO samedomain or xiframe-sender idoc = this[ '_rawObject' ].contentDocument || this._iwin.document, - X_NET_FormWrapper[ 'asyncDispatch' ]( { type : X_EVENT_SUCCESS, response : idoc && idoc.body ? idoc.body.innerHTML : '' } ); + X_FormSender[ 'asyncDispatch' ]( { type : X_EVENT_SUCCESS, response : idoc && idoc.body ? idoc.body.innerHTML : '' } ); }; break; case 'ninjaerror' : console.log( 'iframe onerror' ); - X_NET_FormWrapper[ 'asyncDispatch' ]( X_EVENT_ERROR ); + X_FormSender[ 'asyncDispatch' ]( X_EVENT_ERROR ); break; }; return X_CALLBACK_UN_LISTEN; diff --git a/0.6.x/js/06_net/04_XNetImage.js b/0.6.x/js/06_net/04_XNetImage.js index 63174a4..92044e1 100644 --- a/0.6.x/js/06_net/04_XNetImage.js +++ b/0.6.x/js/06_net/04_XNetImage.js @@ -6,10 +6,10 @@ * AUTHOR: uupaa.js@gmail.com * */ -var X_Net_Image_hasImage = !!window[ 'Image' ], - X_Net_Image_image = X_Net_Image_hasImage && new Image(), +var X_ImgLoader_hasImage = !!window[ 'Image' ], + X_ImgLoader_image = X_ImgLoader_hasImage && new Image(), // IE では厳密には HTMLImageElement ではなく、appendChild してもサイズが取れず、removeChild に失敗する - X_Net_Image_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_Net_Image_image ); + X_ImgLoader_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_ImgLoader_image ); /* * TODO @@ -17,21 +17,21 @@ var X_Net_Image_hasImage = !!window[ 'Image' ], * Image は、X.EventDispatcher で、 は X.Node で。 */ -X_TEMP.X_NET_Image_init = function(){ - X_NET_ImageWrapper = X_Class_override( - X_Net_Image_isElement ? Node( X_Net_Image_image ) : X_EventDispatcher( X_Net_Image_image ), - X_TEMP.X_NET_Image_params +X_TEMP.X_ImgLoader_init = function(){ + X_ImgLoader = X_Class_override( + X_ImgLoader_isElement ? Node( X_ImgLoader_image ) : X_EventDispatcher( X_ImgLoader_image ), + X_TEMP.X_ImgLoader_params ); - X_NET_ImageWrapper[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/, X_EVENT_KILL_INSTANCE ], X_NET_Image_handleEvent ); + X_ImgLoader[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/, X_EVENT_KILL_INSTANCE ], X_ImgLoader_handleEvent ); - delete X_TEMP.X_NET_Image_init; - delete X_TEMP.X_NET_Image_params; + delete X_TEMP.X_ImgLoader_init; + delete X_TEMP.X_ImgLoader_params; - return X_NET_ImageWrapper; + return X_ImgLoader; }; -X_TEMP.X_NET_Image_params = { +X_TEMP.X_ImgLoader_params = { _busy : false, tick : 0, timerID : 0, @@ -51,7 +51,7 @@ X_TEMP.X_NET_Image_params = { if( X_UA[ 'Opera7' ] && this[ '_rawObject' ].complete ){ this[ 'asyncDispatch' ]( 'load' ); } else { - this.timerID = X_Timer_add( this.delay, 0, this, X_NET_Image_detect ); + this.timerID = X_Timer_add( this.delay, 0, this, X_ImgLoader_detect ); }; }, @@ -68,7 +68,7 @@ X_TEMP.X_NET_Image_params = { console.log( 'X.Net.Image:reset ' + this.abspath + ' timerID:' + this.timerID ); this.timerID && X_Timer_remove( this.timerID ); - //X_Net_Image_isElement ? this[ '_rawObject' ].removeAttribute( 'src' ) : ( this[ '_rawObject' ].src = '' ); + //X_ImgLoader_isElement ? this[ '_rawObject' ].removeAttribute( 'src' ) : ( this[ '_rawObject' ].src = '' ); this[ '_rawObject' ].src = ''; this.timerID = 0; this._busy = false; @@ -77,7 +77,7 @@ X_TEMP.X_NET_Image_params = { } }; -function X_NET_Image_detect(){ +function X_ImgLoader_detect(){ var raw = this[ '_rawObject' ]; if( this.finish ) return; @@ -97,7 +97,7 @@ function X_NET_Image_detect(){ }; }; -function X_NET_Image_handleEvent( e ){ +function X_ImgLoader_handleEvent( e ){ var size; console.log( 'X.Net.Image:handleEvent ' + e.type ); @@ -123,7 +123,7 @@ function X_NET_Image_handleEvent( e ){ return; }; - size = X_Util_Image_getActualDimension( !X_Net_Image_isElement ? this.abspath : this ); + size = X_Util_Image_getActualDimension( !X_ImgLoader_isElement ? this.abspath : this ); this.timerID = this[ 'asyncDispatch' ]( { 'type' : X_EVENT_SUCCESS, 'src' : this.abspath, @@ -141,4 +141,4 @@ function X_NET_Image_handleEvent( e ){ }; -// X_Net_Image_isElement && X_NET_ImageWrapper[ 'appendAt' ]( X.X_Node_systemNode ); +// X_ImgLoader_isElement && X_ImgLoader[ 'appendAt' ]( X_Node_systemNode ); diff --git a/0.6.x/js/06_net/05_XXHRGadget.js b/0.6.x/js/06_net/05_XXHRGadget.js index ee43ca2..b8496cf 100644 --- a/0.6.x/js/06_net/05_XXHRGadget.js +++ b/0.6.x/js/06_net/05_XXHRGadget.js @@ -73,7 +73,7 @@ function X_GadgetXHR_detectImageOverIframe(){ case 2 : // _waiting_ 通信結果待ち // 分割受信モードか? ret = ret.substr( 1 ); - n = parseInt( ret ); + n = parseFloat( ret ); if( X_GadgetXHR_isReceiveBatches ){ X_GadgetXHR_receivedString += X_GadgetXHR_decodeLocationHash( ret ); diff --git a/0.6.x/js/06_net/10_XOAuth2.js b/0.6.x/js/06_net/10_XOAuth2.js index 6d28665..b881ec2 100644 --- a/0.6.x/js/06_net/10_XOAuth2.js +++ b/0.6.x/js/06_net/10_XOAuth2.js @@ -389,7 +389,7 @@ function X_NET_OAUTH2_updateRequest( oauth2, request ){ function X_OAuth2_getAccessToken( that ){ return X_OAuth2_updateLocalStorage( '', that, 'accessToken' ); } function X_OAuth2_getRefreshToken( that ){ return X_OAuth2_updateLocalStorage( '', that, 'refreshToken' ); } -function X_OAuth2_getAccessTokenExpiry( that ){ return parseInt( X_OAuth2_updateLocalStorage( '', that, 'tokenExpiry' ) ) || 0; } +function X_OAuth2_getAccessTokenExpiry( that ){ return parseFloat( X_OAuth2_updateLocalStorage( '', that, 'tokenExpiry' ) ) || 0; } function X_OAuth2_getAuthMechanism( that ){ // TODO use gadget | flash ... // IE's XDomainRequest doesn't support sending headers, so don't try. diff --git a/0.6.x/js/07_audio/00_XAudio.js b/0.6.x/js/07_audio/00_XAudio.js index 33faebf..4de81ae 100644 --- a/0.6.x/js/07_audio/00_XAudio.js +++ b/0.6.x/js/07_audio/00_XAudio.js @@ -253,8 +253,7 @@ var X_AudioBase = X_EventDispatcher[ 'inherits' ]( 'X.AudioBase', X_Class.ABSTRACT, { - url : '', // - target : null, // + disatcher : null, startTime : 0, // endTime : -1, // @@ -468,7 +467,7 @@ function X_Audio_timeStringToNumber( time ){ if( !X_Type_isString( time ) || !time.length ) return; ary = time.split( '.' ); - ms = parseInt( ( ary[ 1 ] + '000' ).substr( 0, 3 ) ) || 0; + ms = parseFloat( ( ary[ 1 ] + '000' ).substr( 0, 3 ) ) || 0; ary = ary[ 0 ].split( ':' ); if( 3 < ary.length ) return; @@ -477,17 +476,17 @@ function X_Audio_timeStringToNumber( time ){ case 0 : break; case 1 : - s = parseInt( ary[ 0 ] ) || 0; + s = parseFloat( ary[ 0 ] ) || 0; break; case 2 : - m = parseInt( ary[ 0 ] ) || 0; - s = parseInt( ary[ 1 ] ) || 0; + m = parseFloat( ary[ 0 ] ) || 0; + s = parseFloat( ary[ 1 ] ) || 0; if( 60 <= s ) alert( 'invalid time string ' + time ); break; case 3 : - h = parseInt( ary[ 0 ] ) || 0; - m = parseInt( ary[ 1 ] ) || 0; - s = parseInt( ary[ 2 ] ) || 0; + h = parseFloat( ary[ 0 ] ) || 0; + m = parseFloat( ary[ 1 ] ) || 0; + s = parseFloat( ary[ 2 ] ) || 0; if( 60 <= s ) alert( 'invalid time string ' + time ); if( 60 <= m ) alert( 'invalid time string ' + time ); break; diff --git a/0.6.x/js/07_audio/01_XWebAudio.js b/0.6.x/js/07_audio/01_XWebAudio.js index 522443d..50cf05c 100644 --- a/0.6.x/js/07_audio/01_XWebAudio.js +++ b/0.6.x/js/07_audio/01_XWebAudio.js @@ -217,7 +217,7 @@ if( X_WebAudio_context ){ gainNode : null, _onended : null, - 'Constructor' : function( target, url, option ){ + 'Constructor' : function( disatcher, url, option ){ var i = 0, l = X_WebAudio_BUFFER_LIST.length, loader; @@ -245,8 +245,7 @@ if( X_WebAudio_context ){ this.loader = loader = X_WebAudio_BufferLoader( this, url ); }; - this.target = target || this; - + this.disatcher = disatcher || this; this.setState( option ); this[ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, this.onKill ); @@ -280,7 +279,7 @@ if( X_WebAudio_context ){ if ( !buffer ) { this.error = loader.errorState; - this.target[ 'dispatch' ]({ + this.disatcher[ 'dispatch' ]({ type : X_EVENT_ERROR, error : loader.errorState, message : loader.errorState === 1 ? @@ -294,7 +293,7 @@ if( X_WebAudio_context ){ this.audioBuffer = buffer; this.duration = buffer.duration * 1000; - this.target[ 'asyncDispatch' ]( X_EVENT_READY ); + this.disatcher[ 'asyncDispatch' ]( X_EVENT_READY ); console.log( 'WebAudio buffer ready' ); @@ -305,6 +304,8 @@ if( X_WebAudio_context ){ actualPlay : function(){ var begin, end; + console.log( '[WebAudio] play abuf:' + !!this.audioBuffe ); + if( !this.audioBuffer ){ this.autoplay = true; return; @@ -361,7 +362,7 @@ if( X_WebAudio_context ){ delete this._interval; return X_CALLBACK_UN_LISTEN; }; - this.target[ 'dispatch' ]( X_EVENT_MEDIA_PLAYING ); + this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_PLAYING ); }, _onEnded : function(){ @@ -384,14 +385,14 @@ if( X_WebAudio_context ){ }; if( this.autoLoop ){ - if( !( this.target[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_CALLBACK_PREVENT_DEFAULT ) ){ + if( !( this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_CALLBACK_PREVENT_DEFAULT ) ){ this.looped = true; - this.target[ 'dispatch' ]( X_EVENT_MEDIA_LOOPED ); + this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_LOOPED ); this.actualPlay(); }; } else { this.actualPause(); - this.target[ 'dispatch' ]( X_EVENT_MEDIA_ENDED ); + this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_ENDED ); }; }; }, diff --git a/0.6.x/js/07_audio/02_XHTMLAudio.js b/0.6.x/js/07_audio/02_XHTMLAudio.js index e792bcd..154e4ac 100644 --- a/0.6.x/js/07_audio/02_XHTMLAudio.js +++ b/0.6.x/js/07_audio/02_XHTMLAudio.js @@ -8,10 +8,11 @@ * 1. iOS4(iPod 2G) で ended に達すると音が鳴らなくなる fix で解決 * 2. iOS6(iPod 4G) で ended に達すると音が鳴らなくなる fix で頻度が改善 emded イベントは発しないので、timeupdate 時に currentTime で判断する * 3. WP7(IS12T) で最後の方にある音が鳴らない? mp3 cbr を使えばいい? 裏に回っても音が鳴り続ける - * 4. Android 3.x で ended に達すると音が鳴らなくなる -> リロード(audio.src='';audio.sr=src)で解決、但し 2.x 4.x より遅延が大きく 1 秒弱程度ある - * 5. Android 2.x で ended に達すると音が鳴らなくなる -> リロード(audio.src='';audio.src=src;audio.load())でで解決 - * 6. Android 4.4.2- は ended に達した際に currentTime が変更できなくなり、リロードが必要になる, 4.0, 4.1, 4.2, 4.3 で確認 - * 7. Blink5 Opera32 Win8 は HTMLAudio が壊れている、WebAudio は mp3 がデコードに失敗、ogg が動作 + * 4. AOSP 2.x で ended に達すると音が鳴らなくなる -> リロード(audio.src='';audio.src=src;audio.load())でで解決 + * 5. AOSP 3.x で ended に達すると音が鳴らなくなる -> リロード(audio.src='';audio.sr=src)で解決、但し 2.x 4.x より遅延が大きく 1 秒弱程度ある + * 6. AOSP 4.4.2- は ended に達した際に currentTime が変更できなくなり、リロードが必要になる, 4.0, 4.1, 4.2, 4.3 で確認, play() で頻度低下 + * 7. Android 4.4.4 Chrome WebView は ended に達した際に play() が必要 + * 8. BlinkOpera32 Win8 は HTMLAudio が壊れている、WebAudio は mp3 がデコードに失敗、ogg が動作 * * memo * 1. Android4.1 iframe 内の Audio は親に focus が移っても再生を継続する @@ -36,7 +37,7 @@ var X_HTMLAudio_playTrigger = // Android 3.1 で ended 時に src='';src=src を実施。 X_HTMLAudio_endedFixAOSP3 = !X_HTMLAudio_endedFixAOSP2 && X_UA[ 'AOSP' ] < 4, // ended 時に play() を実施, currentTime が duration に張り付き更新されなければ src='';src=src を実施。 - X_HTMLAudio_endedFixAOSP4 = 4 <= X_UA[ 'AOSP' ], + X_HTMLAudio_endedFixAOSP4 = 4 <= X_UA[ 'AOSP' ] || X_UA[ 'ChromeWV' ], // Opera Mobile 12 は 2回目以降の currentTime へのセットで currentTime が更新されなくなるため、タイマーを使用する X_HTMLAudio_currentTimeFix = !!X_UA[ 'OperaMobile' ] || !!X_UA[ 'OperaTablet' ], @@ -52,7 +53,7 @@ var X_HTMLAudio_playTrigger = X_HTMLAudio_pauseFix = ( X_UA[ 'Windows' ] && 12 <= X_UA[ 'Opera' ] && 0 < ' XP XPSP2 2003|XP64'.indexOf( X_UA[ 'Windows' ] ) ), // XP + Opera12 のみ? /* * durationFix - * duration が取得できるタイミングが遅くそれまでは infinity(PC Opera12), NaN(WP9), 0(Android 標準ブラウザ ChromeWebkit 系) が入っている + * duration が取得できるタイミングが遅くそれまでは infinity(PC Opera12), NaN(WP9), 0(Android 標準ブラウザ ChromeWebView) が入っている * * 1. touch が不要の場合、自動で再生を開始して duration を取得するまで再生する * -> 取得後に pause or 通常再生 @@ -95,12 +96,15 @@ if( X_Audio_constructor ){ _endedFixON : false, - 'Constructor' : function( target, source, option ){ + _kickTimerID : false, // 処理が混み入ると AOSP で音声が再生されない + _lastKickTime : 0, + + 'Constructor' : function( disatcher, source, option ){ var raw; - this.target = target || this; - this._closed = false; - this._src = source; + this.disatcher = disatcher || this; + this._closed = false; + this._src = source; if( X_HTMLAudio_shortPlayFix ){ this._shortPlayFixON = X_URL_getEXT( source ) === 'm4a'; @@ -119,7 +123,7 @@ if( X_Audio_constructor ){ raw.controls = false; raw.WebKitPlaysInline = true; raw.src = source; - document.body.appendChild( raw ); + X_elmBody.appendChild( raw ); } else { raw = X_TEMP.rawAudio || new X_Audio_constructor( source ); // X_Doc_create( 'audio', { src : source } )[ 'appendTo' ]( X.Doc.body ); @@ -305,9 +309,9 @@ if( X_Audio_constructor ){ // if( ended ){ if( !this._closed && this.autoLoop ){ - if( !( this.target[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_CALLBACK_PREVENT_DEFAULT ) ){ + if( !( this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_CALLBACK_PREVENT_DEFAULT ) ){ this.looped = true; - this.target[ 'dispatch' ]( X_EVENT_MEDIA_LOOPED ); + this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_LOOPED ); ( X_HTMLAudio_endedFixAOSP3 || X_HTMLAudio_endedFixAOSP4 || X_HTMLAudio_endedFixIOS ) && actualEnded && console.log( '☆★☆ 音声の継続用の play() @ended' ); this.actualPlay( ( X_HTMLAudio_endedFixAOSP4 || X_HTMLAudio_endedFixIOS ) && actualEnded, @@ -316,17 +320,17 @@ if( X_Audio_constructor ){ } else { this.seekTime = 0; delete this.playing; - this.target[ 'dispatch' ]( X_EVENT_MEDIA_ENDED ); + this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_ENDED ); }; } else if( this._loaded && this.duration && !this._ready ){ this._ready = true; this.autoplay && X_Timer_once( 16, this, this.play ); - this.target[ 'asyncDispatch' ]( X_EVENT_READY ); + this.disatcher[ 'asyncDispatch' ]( X_EVENT_READY ); console.log( '> Audio Loaded!! ' + e.type + ' d:' + ( this.duration | 0 ) ); } else if( eventType ){ - this.target[ 'dispatch' ]( eventType ); + this.disatcher[ 'dispatch' ]( eventType ); eventType === X_EVENT_ERROR && this[ 'kill' ](); }; }, @@ -378,6 +382,10 @@ if( X_Audio_constructor ){ }; raw.play(); this.playing = true; + + if( X_UA[ 'AOSP' ] && !this._kickTimerID ){ + this._kickTimerID = X_Timer_add( 100, 0, this, this._kick ); + }; } else if( X_HTMLAudio_needPlayForSeek || forcePlay ){ raw.play(); @@ -387,18 +395,18 @@ if( X_Audio_constructor ){ //http://himaxoff.blog111.fc2.com/blog-entry-97.html //Firefox3.6では一度も play() していない状態で currentTime = 0 を実行するとエラーになる。 //また、GoogleChrome7 では currentTime = 0 直後に play() すると、pause()した位置前後の音が混ざることがある。(少なくとも自分の環境では) - raw.currentTime = this._lastCurrentTime; + raw.currentTime = this._lastKickTime = this._lastCurrentTime; console.log( '[HTMLAudio] play ' + begin + ' -> ' + end + ' crt:' + ( raw.currentTime | 0 ) + ' last:' + this._lastCurrentTime ); // Android4.0.5 で ended イベント時に currentTime が duration に張り付いたまま変更できない - if( forceReload || ( raw.duration && raw.currentTime === raw.duration ) ){ + if( forceReload || ( X_HTMLAudio_endedFixAOSP4 && raw.duration && raw.currentTime === raw.duration ) ){ raw.src = ''; raw.src = this._src; this.playing = false; this._endedFixON = true; console.log( '△ onEndedFix の開始' ); raw.currentTime = this._lastCurrentTime; - this.target[ 'dispatch' ]( X_EVENT_MEDIA_WAITING ); + this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_WAITING ); X_HTMLAudio_endedFixAOSP2 && raw.load(); }; }; @@ -409,6 +417,20 @@ if( X_Audio_constructor ){ }; }, + _kick : function(){ + var raw = this[ '_rawObject' ]; + + console.log( ' >> KICK ? ct:' + ( raw.currentTime ) + ' lkt:' + this._lastKickTime ); + if( this.playing && raw.currentTime === this._lastKickTime ){ + this.disatcher[ 'dispatch' ]( X_EVENT_MEDIA_WAITING ); + console.log( ' >> KICK !!' ); + raw.play(); + } else { + delete this._kickTimerID; + return X_CALLBACK_UN_LISTEN; + }; + }, + actualPause : function(){ console.log( '[HTMLAudio] pause' ); diff --git a/0.6.x/js/07_audio/03_XSilverlightAudio.js b/0.6.x/js/07_audio/03_XSilverlightAudio.js index aa90277..f451596 100644 --- a/0.6.x/js/07_audio/03_XSilverlightAudio.js +++ b/0.6.x/js/07_audio/03_XSilverlightAudio.js @@ -30,7 +30,7 @@ if( X[ 'Pulgin' ][ 'Silverlight' ] ){ s.type = 'text/xaml'; }; - document.getElementsByTagName( 'head' )[ 0 ].appendChild( s ); + X_elmHead.appendChild( s ); s.text = ''; delete X_TEMP.slaudioInit; diff --git a/0.6.x/js/07_audio/10_XAudioSprite.js b/0.6.x/js/07_audio/10_XAudioSprite.js index cd11ea6..23ff7e5 100644 --- a/0.6.x/js/07_audio/10_XAudioSprite.js +++ b/0.6.x/js/07_audio/10_XAudioSprite.js @@ -114,7 +114,7 @@ X[ 'AudioSprite' ][ 'needTouchFirst' ] = X_AudioSprite_needTouchFirst; X[ 'AudioSprite' ][ 'enableMultiTrack' ] = !X_AudioSprite_disableMultiTrack; // 再生が終わっているもの、終わりかけのものを探す -// TODO 終わりかけのもの、と一番古いもの、どちらを再利用するか?これ以上に細かい実装を望む場合は X.Audio.Sprite は使わず自力で実装 +// TODO 終わりかけのもの、と一番古いもの、どちらを再利用するか?これ以上に細かい実装を望む場合は X.AudioSprite は使わず自力で実装 function X_AudioSprite_getTrackEnded(){ var tracks = X_AudioSprite_TEMP.tracks, l = tracks.length, @@ -199,7 +199,7 @@ X_AudioSprite_members = track = X_AudioSprite_TEMP.bgmTrack = tracks[ 0 ]; }; - if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_AudioSprite_handleEvent ).playing ){ + if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_AudioSprite_handleEvent ).playing ){ track.setState({ 'loop' : true, 'looped' : X_AudioSprite_TEMP.bgmLooped, @@ -219,7 +219,7 @@ X_AudioSprite_members = if( 1 < tracks.length ){ track = X_AudioSprite_getTrackEnded( X_AudioSprite_TEMP.bgmPlaying ); track - [ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_AudioSprite_handleEvent ) + [ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_AudioSprite_handleEvent ) .setState( { 'looped' : false } ); track.play( preset[ 0 ], preset[ 1 ], true, 0, X_AudioSprite_lengthSilence ); } else { @@ -231,7 +231,7 @@ X_AudioSprite_members = }; track = tracks[ 0 ]; - if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_AudioSprite_handleEvent ).playing ){ + if( track[ 'listen' ]( [ X_EVENT_MEDIA_PLAYING, X_EVENT_MEDIA_WAITING, X_EVENT_MEDIA_SEEKING, X_EVENT_MEDIA_BEFORE_LOOP ], this, X_AudioSprite_handleEvent ).playing ){ track.setState({ 'loop' : true, 'looped' : false, @@ -259,6 +259,7 @@ X_AudioSprite_members = */ 'pause' : function( uid ){ var track = X_AudioSprite_TEMP.tracks[ uid ]; + if( X_AudioSprite_TEMP.bgmTrack === track ){ X_AudioSprite_TEMP.bgmPosition = track.currentTime(); X_AudioSprite_TEMP.bgmPlaying = false; @@ -378,7 +379,7 @@ function X_AudioSprite_backendHandler( e ){ }; if( X_AudioSprite_needTouchFirst ){ - if( name === 'Web Audio' ){ + if( name === 'WebAudio' ){ _e[ 'needTouchForPlay' ] = true; } else { _e[ 'needTouchForLoad' ] = true; @@ -427,6 +428,10 @@ function X_AudioSprite_handleEvent( e ){ case X_EVENT_MEDIA_PLAYING : ( e.target === X_AudioSprite_TEMP.bgmTrack || !e.target.looped ) && this[ 'asyncDispatch' ]( X_EVENT_MEDIA_PLAYING ); break; + case X_EVENT_MEDIA_WAITING : + case X_EVENT_MEDIA_SEEKING : + ( e.target === X_AudioSprite_TEMP.bgmTrack || !e.target.looped ) && this[ 'asyncDispatch' ]( e.type ); + break; case X_EVENT_MEDIA_BEFORE_LOOP : if( e.target === X_AudioSprite_TEMP.bgmTrack ){ diff --git a/0.6.x/js/11_hid/01_KB.js b/0.6.x/js/11_hid/01_KB.js index 4d46047..26d1544 100644 --- a/0.6.x/js/11_hid/01_KB.js +++ b/0.6.x/js/11_hid/01_KB.js @@ -18,73 +18,16 @@ * */ -var X_KB_SPECIALS = { - - - '8' : 'BS', - '9' : 'TAB', - '13' : 'ENTER', - '16' : 'SHIFT', - '17' : 'CTRL', - '18' : 'ALT', - '19' : 'PAUSE_BREAK', - '20' : 'SHIFT+CAPS_LOCK', - - '27' : 'ESC', - '28' : 'trans', - '29' : 'no trans', - - '33' : 'PAGE_UP', - '34' : 'PAGE_DOWN', - '35' : 'END', - '36' : 'HOME', - '37' : 'CSR_L', - '38' : 'CSR_U', - '39' : 'CSR_R', - '40' : 'CSR_D', - '44' : 'PRT_SCRN', - '45' : 'INS', - '46' : 'DEL', - - '91' : 'LWIN', - '92' : 'RWIN', - '93' : 'APP', - - '96' : 48, - '97' : 49, - '98' : 50, - '99' : 51, - '100' : 52, - '101' : 53, - '102' : 54, - '103' : 55, - '104' : 56, - '105' : 57, - '106' : 42, - '107' : 43, - '109' : 45, - '111' : 47, - '112' : 'F1', - '113' : 'F2', - '114' : 'F3', - '115' : 'F4', - '116' : 'F5', - '117' : 'F6', - '118' : 'F7', - '119' : 'F8', - '120' : 'F9', - '121' : 'F10', - '122' : 'F11', - '123' : 'F12', - - '144' : 'NUM_LOCK', - '145' : 'SCROLL_LOCK', - '208' : 'CAPS_LOCK', - '240' : 'CAPS_LOCK', - '242' : 'K/H', - '243' : 'H/Z', - '244' : 'H/Z' - }, +var X_KB_SPECIALS = eval( // IE5- 対策 + "({'8':'BS','9':'TAB'," + + "'13':'ENTER','16':'SHIFT','17':'CTRL','18':'ALT','19':'PAUSE_BREAK','20':'SHIFT+CAPS_LOCK'," + + "'27':'ESC','28':'trans','29':'notrans'," + + "'33':'PAGE_UP','34':'PAGE_DOWN','35':'END','36':'HOME','37':'CSR_L','38':'CSR_U','39':'CSR_R','40':'CSR_D'," + + "'44':'PRT_SCRN','45':'INS','46':'DEL'," + + "'91':'LWIN','92':'RWIN','93':'APP'," + + "'96':48,'97':49,'98':50,'99':51,'100':52,'101':53,'102':54,'103':55,'104':56,'105':57,'106':42,'107':43,'109':45," + + "'111':47,'112':'F1','113':'F2','114':'F3','115':'F4','116':'F5','117':'F6','118':'F7','119':'F8','120':'F9','121':'F10','122':'F11','123':'F12'," + + "'144':'NUM_LOCK','145':'SCROLL_LOCK','208':'CAPS_LOCK','240':'CAPS_LOCK','242':'K/H','243':'H/Z','244':'H/Z'})" ), X_KB_DOWN_KEYS = {}, X_KB_CANCELED = {}, X_KB_lastIs10Key = false, -- 2.11.0