From: itozyun Date: Thu, 12 Feb 2015 14:26:32 +0000 (+0900) Subject: Version 0.6.130, fix X.Net & X.Audio. X-Git-Url: http://git.osdn.jp/view?p=pettanr%2FclientJs.git;a=commitdiff_plain;h=4ff55e875a0aa86831f3a07e0c278deddc1e18bb Version 0.6.130, fix X.Net & X.Audio. --- diff --git a/0.6.x/js/01_core/01_X.js b/0.6.x/js/01_core/01_X.js index f46ae28..81ed30d 100644 --- a/0.6.x/js/01_core/01_X.js +++ b/0.6.x/js/01_core/01_X.js @@ -28,7 +28,7 @@ function X( v ){ }; }; -X.VERSION = '0.6.103'; +X.VERSION = '0.6.127'; X.bootTime = + new Date; diff --git a/0.6.x/js/01_core/02_XUA.js b/0.6.x/js/01_core/02_XUA.js index c0a1d4f..6f15535 100644 --- a/0.6.x/js/01_core/02_XUA.js +++ b/0.6.x/js/01_core/02_XUA.js @@ -368,7 +368,7 @@ if( X_UA.Safari && X_UA.WebKit < 525.13 ){ // ------------------------------------------------------------------------- // X.UA = X_UA; - +// TODO 構文のサポート instanceof, in, try catch if( X_UA.IE < 7 ){ // error @ NN7.2 // bonus: hotfix for IE6 SP1 (bug KB823727) diff --git a/0.6.x/js/01_core/16_XViewPort.js b/0.6.x/js/01_core/16_XViewPort.js index cdcdf72..e838bb0 100644 --- a/0.6.x/js/01_core/16_XViewPort.js +++ b/0.6.x/js/01_core/16_XViewPort.js @@ -298,8 +298,9 @@ X.ViewPort = { html.appendTo = html.appendToRoot = html.before = html.after = html.clone = html.remove = html.destroy = html.prev = html.next = 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.appendToRoot = head.before = head.after = head.clone = head.remove = head.destroy = - head.empty = head.html = head.text = + head.createText = head.createTextAt = head.empty = head.html = head.text = head.css = head.cssText = body.appendTo = body.appendToRoot = body.before = body.after = body.clone = body.remove = body.destroy = new Function( 'return this' ); X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_PRE_INIT, function(){ diff --git a/0.6.x/js/02_dom/02_XNode.js b/0.6.x/js/02_dom/02_XNode.js index da8f553..26060f5 100644 --- a/0.6.x/js/02_dom/02_XNode.js +++ b/0.6.x/js/02_dom/02_XNode.js @@ -110,13 +110,14 @@ var _rect : null, // _fontSize : 0, + length : 1, parent : null, // remove された枝も親子構造は維持している。 _xnodes : null, // Array. _tag : '', _text : '', - _id : '', - _className : '', + _id : '', // + _className : '', // _attrs : null, // see X_Node_Attr _newAttrs : null, @@ -131,12 +132,12 @@ var * TODO Node の継承ができない! */ Constructor : function( v ){ - var css, xnodes, xnode, parent, uid = X_Node_CHASHE.length; + var uid = X_Node_CHASHE.length, + css, xnodes, xnode, parent; if( X_Node_newByTag ){ X_Node_newByTag = false; this._tag = v.toUpperCase(); - this._flags |= X_Node_State.EXIST; arguments[ 1 ] && this.attr( arguments[ 1 ] ); css = arguments[ 2 ]; css && this[ X.Type.isString( css ) ? 'cssText' : 'css' ]( css ); @@ -144,7 +145,6 @@ var if( X_Node_newByText ){ X_Node_newByText = false; this._text = v; - this._flags |= X_Node_State.EXIST; } else { if( 1 < arguments.length ) return new X_NodeList( arguments ); if( X.Type.isArray( v ) && v.length ) return new X_NodeList( v ); @@ -158,11 +158,7 @@ var if( xnode = X_Node_getXNode( v ) ) return xnode; // v.parentNode || v.parentElement : dom1 || dom0 this.parent = ( parent = v.parentNode || v.parentElement ) && parent.tagName /* ie7- */ && X_Node_getXNode( parent ); - if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){ - this._flags |= X_Node_State.IN_TREE; - }; this._rawObject = v; - this._flags |= X_Node_State.EXIST; this._tag = v.tagName.toUpperCase(); this._id = v.id; this._className = v.className; @@ -170,7 +166,7 @@ var this.cssText( v.style.cssText ); this._flags &= X_Node_BitMask_RESET_DIRTY; // X_Node_State.DIRTY_CSS を落とす - // TODO attr の回収は不可能、、、 + // TODO attr の回収は不可能、、、? if( X_UA_DOM.IE4 ){ v.setAttribute( 'UID', '' + uid ); } else { @@ -182,11 +178,7 @@ var case X_Node_TYPE.RAW_TEXT : if( xnode = X_Node_getXNode( v ) ) return xnode; this.parent = X_Node_getXNode( v.parentNode ); - if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){ - this._flags |= X_Node_State.IN_TREE; - }; this._rawObject = v; - this._flags |= X_Node_State.EXIST; this._text = v.data; v.UID = uid; break; @@ -198,11 +190,16 @@ var return X_Node_none; default : + this.length = 0; if( X_Node_none ) return X_Node_none; return; }; }; + if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){ + this._flags |= X_Node_State.IN_TREE; + }; + this._flags |= X_Node_State.EXIST; X_Node_CHASHE[ this._uid = uid ] = this; }, @@ -768,7 +765,7 @@ function X_Node_className( v ){ // setter if( this._className === v ) return this; - if( !v || typeof v !== 'string' ){ + if( !v || !X.Type.isString( v ) ){ delete this._className; } else { // cleanup @@ -957,6 +954,12 @@ function X_Node_call( name /*, opt_args... */ ){ raw = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ); if( !raw ) return; + if( name === 'scrollTo' ){ + raw.scrollLeft = arguments[ 1 ] || 0; + raw.scrollTop = arguments[ 2 ] || 0; + return; + }; + func = raw[ name ]; if( X.Type.isFunction( func ) ){ if( l ){ @@ -1115,8 +1118,8 @@ var X_Node__commitUpdate = return nextElement; }; elm && ( elm.style.display = 'none' ); - return elm || nextElement; - }; + return elm.nextSibling === nextElement ? elm : nextElement; + }; // 5. ie5 非表示fixフラグ accumulatedFlags |= that._flags; @@ -1132,6 +1135,9 @@ var X_Node__commitUpdate = if( !that._tag ){ that._flags &= X_Node_BitMask_RESET_DIRTY; that._rawObject = elm = document.createTextNode( X_String_chrReferanceTo( that._text ) ); + if( !X.UA.IE ){ + elm.UID = that._uid; + }; } else if( X_Node_strictElmCreation ){ that._flags & X_Node_State.DIRTY_CSS && X_Node_CSS_objToCssText( that, true ); @@ -1154,13 +1160,13 @@ var X_Node__commitUpdate = nextElement ? parentElement.insertBefore( elm, nextElement ) : parentElement.appendChild( elm ); - //elm.UID = that._uid; - // src の onload があるので先ではないか? - // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか? - X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰 }; if( that._tag ){ + // src の onload があるので先ではないか? + // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか? + X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰 + if( X_Node_documentFragment ){ //( frg = X_Node_documentFragment ).appendChild( elm ); }; @@ -1173,6 +1179,7 @@ var X_Node__commitUpdate = } else { elm.UID = that._uid; that._newAttrs = that._attrs; + that._flags &= X_Node_BitMask_RESET_DIRTY; that._flags |= X_Node_State.DIRTY_ID | X_Node_State.DIRTY_CLASSNAME | X_Node_State.DIRTY_ATTR | X_Node_State.DIRTY_CSS | X_Node_State.DIRTY_IE_FILTER; // http://outcloud.blogspot.jp/2010/09/iframe.html @@ -1232,7 +1239,10 @@ var X_Node__commitUpdate = parentElement.insertBefore( elm, nextElement ) : parentElement.appendChild( elm ); - X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰 + if( X_UA.Gecko && that._tag === 'IFRAME' && elm.contentWindow ){ + // tree に追加されるまで contentWindow は存在しない。 + elm.contentWindow.location.replace = elm.src; + }; }; return elm; @@ -1256,7 +1266,7 @@ var X_Node__commitUpdate = return prevElement; }; }; - return elm || prevElement; + return elm || nextElement; }; if( !elm ){ @@ -1351,7 +1361,7 @@ var X_Node__updateRawNode = }; // className if( that._flags & X_Node_State.DIRTY_CLASSNAME ){ - that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X_UA.IE5678 ? 'className' : 'class' ) ); // className は ie7-? + that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X_UA.IE < 8 ? 'className' : 'class' ) ); // className は ie7- }; // attr @@ -1375,7 +1385,7 @@ var X_Node__updateRawNode = case 'IFRAMEsrc' : // http://outcloud.blogspot.jp/2010/09/iframe.html // この問題は firefox3.6 で確認 - if( X_UA.Gecko ){ + if( X_UA.Gecko && elm.contentWindow ){ elm.contentWindow.location.replace = elm.src = v || ''; continue; }; diff --git a/0.6.x/js/02_dom/06_XNodeCSS.js b/0.6.x/js/02_dom/06_XNodeCSS.js index 674212a..1445907 100644 --- a/0.6.x/js/02_dom/06_XNodeCSS.js +++ b/0.6.x/js/02_dom/06_XNodeCSS.js @@ -508,7 +508,7 @@ Node.prototype.css = function( nameOrObj /* orUnitID, valuOrUnitOrName */ ){ var args = arguments, css = this._css, p, name, v, plain, camelize, flags; - if( !this._tag ) return this; + if( !this._tag || X_Dom_DTD_MOVE_TO_HEAD[ this._tag ] || this._tag === 'SCRIPT' ) return this; // setter:object if( X.Type.isObject( nameOrObj ) ){ if( !css ) css = this._css = {}; diff --git a/0.6.x/js/02_dom/10_XNodeAnime.js b/0.6.x/js/02_dom/10_XNodeAnime.js index 9a3078c..140f78a 100644 --- a/0.6.x/js/02_dom/10_XNodeAnime.js +++ b/0.6.x/js/02_dom/10_XNodeAnime.js @@ -281,7 +281,7 @@ function X_Node_Anime_updateAnimation( xnode ){ X_ViewPort.unlisten( X.Event.AFTER_UPDATE, xnode, X_Node_Anime_gpuReleased ); xnode.css({ - willChange : X_Node_Anime_transitionProps + ',opacity,width,height', + //willChange : X_Node_Anime_transitionProps + ',opacity,width,height', backfaceVisibility : 'hidden', transitionTimingFunction : obj.easing.style, transitionDelay : '0s' // 0.001 にすると transitionend のタイミングが狂う、、、 @@ -326,7 +326,7 @@ function X_Node_Anime_updateAnimation( xnode ){ case 10 : // アニメーションは停止・GPUレイヤーは解除していない(再アニメーションに備えて待機) - X_Node_Anime_clearTransition( xnode ); // TODO X_Node_Anime_releaseGPULayer に移動? + //X_Node_Anime_clearTransition( xnode ); // TODO X_Node_Anime_releaseGPULayer に移動? if( !obj.gpuTimerID ){ if( obj.wait ){ obj.gpuTimerID = X.Timer.once( obj.wait, xnode, X_Node_Anime_releaseGPULayer ); @@ -427,6 +427,7 @@ function X_Node_Anime_releaseGPULayer(){ console.log( '_anime無' ); return; }; + X_Node_Anime_clearTransition( this ); X_Node_Anime_updatePosition( this, obj.destX, obj.destY, obj.destA, false ); X_Node_ANIMATIONS.splice( X_Node_ANIMATIONS.indexOf( this ), 1 ); delete obj.gpuTimerID; @@ -448,7 +449,7 @@ function X_Node_Anime_clearTransition( xnode ){ xnode.unlisten( 'transitionend', X_Node_Anime_onTransitionEnd ); xnode.css({ - willChange : '', + //willChange : '', backfaceVisibility : '', transitionTimingFunction : '', transitionDelay : '', diff --git a/0.6.x/js/06_net/01_XNetXHR.js b/0.6.x/js/06_net/01_XNetXHR.js index f488350..71d4770 100644 --- a/0.6.x/js/06_net/01_XNetXHR.js +++ b/0.6.x/js/06_net/01_XNetXHR.js @@ -105,7 +105,7 @@ if( X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X ){ async = obj[ 'async' ], user = obj[ 'user' ], password = obj[ 'password' ], - headers = obj[ 'headers' ], + headers = obj[ 'headers' ] || {}, postbody = obj[ 'postbody' ], timeout = obj[ 'timeout' ] || 20000, temp; @@ -168,6 +168,11 @@ if( X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X ){ // http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_r_1.html // raw.overrideMimeType() if( !X_Net_XHR_ACTIVE_X && X.Type.isFunction( raw.setRequestHeader ) ){ + + // http://nakigao.sitemix.jp/blog/?p=2040 + // SafariでHTTP/412のエラー + headers[ 'If-Modified-Since' ] = ( new Date ).toUTCString(); + for( p in headers ){ if( X_EMPTY_OBJECT[ p ] ) continue; raw.setRequestHeader( p, headers[ p ] ); // Opera8.01+, MSXML3+ diff --git a/0.6.x/js/06_net/02_XNetJSONP.js b/0.6.x/js/06_net/02_XNetJSONP.js index 0355d58..9e1eac2 100644 --- a/0.6.x/js/06_net/02_XNetJSONP.js +++ b/0.6.x/js/06_net/02_XNetJSONP.js @@ -28,7 +28,7 @@ X.Net.JSONP = { X_NET_JSONPWrapper .asyncDispatch( { type : jsonString ? X.Event.SUCCESS : X.Event.ERROR, - data : jsonString //window.JSON ? JSON.parse( jsonString ) : eval( jsonString ) + data : window.JSON ? JSON.parse( jsonString ) : eval( 'var a=' + jsonString + ';a' ) } ); console.log( 'ms : ' + time + ' speed : ' + ( ( jsonString.length + ( opt_json2FileSize || 0 ) ) / time * 1000 ) + ' バイト/秒.' ); diff --git a/0.6.x/js/07_audio/01_XWebAudio.js b/0.6.x/js/07_audio/01_XWebAudio.js index 84216ed..d50aaa4 100644 --- a/0.6.x/js/07_audio/01_XWebAudio.js +++ b/0.6.x/js/07_audio/01_XWebAudio.js @@ -91,7 +91,8 @@ if( X_Audio_WebAudio_context ){ // http://qiita.com/sou/items/5688d4e7d3a37b4e2ff1 // iOS 7.1 で decodeAudioData に処理が入った瞬間にスクリーンを長押しする(スクロールを繰り返す)と // decoeAudioData の処理がキャンセルされることがある(エラーやコールバックの発火もなく、ただ処理が消滅する)。 - if( X_Audio_WebAudio_context.createBuffer && X_UA.iOS ){ + // ただし iOS 8.1.2 では エラーになる + if( X_Audio_WebAudio_context.createBuffer && X_UA.iOS < 8 ){ this._onDecodeSuccess( X_Audio_WebAudio_context.createBuffer( e.data, false ) ); } else if( X_Audio_WebAudio_context.decodeAudioData ){ diff --git a/0.6.x/js/07_audio/02_XHTMLAudio.js b/0.6.x/js/07_audio/02_XHTMLAudio.js index 3c721fc..df0024b 100644 --- a/0.6.x/js/07_audio/02_XHTMLAudio.js +++ b/0.6.x/js/07_audio/02_XHTMLAudio.js @@ -5,11 +5,13 @@ */ var X_Audio_HTMLAudio_playTrigger = + 6 <= X_UA.iOS ? 'loadeddata' : X_UA.iOS ? 'suspend' : X_UA.AndroidBrowser2 ? 'stalled' : // Android 2.3.5(SBM101SH) では stalled は発生しない,,, X_UA.AndroidBrowser4 ? 'loadeddata' : X_UA.OperaMobile || X_UA.OperaTablet ? 'loadeddata' : 'canplay', X_Audio_HTMLAudioWrapper, + X_Audio_constructor = window.Audio || window.HTMLAudioElement, X_Audio_rawAudio, // Opera Mobile 12 android4.4.4 & 2.3.5 は 2回目以降の currentTime へのセットで currentTime が更新されなくなるため、タイマーを使用する X_Audio_HTMLAudioWrapper_currentTimeFix = !!X_UA.OperaMobile || !!X_UA.OperaTablet, // || ( X_UA.WinPhone && X_UA.IE9 ), @@ -31,31 +33,42 @@ var X_Audio_HTMLAudio_playTrigger = X_Audio_codecs; -if( window.HTMLAudioElement && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){ +if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){ //http://himaxoff.blog111.fc2.com/blog-entry-97.html //引数なしで new Audio() とすると、Operaでエラーになるそうなので注意。 - X_Audio_rawAudio = new Audio( '' ); - - X_Audio_codecs = { - mp3 : X_Audio_rawAudio.canPlayType('audio/mpeg'), - opus : X_Audio_rawAudio.canPlayType('audio/ogg; codecs="opus"'), - ogg : X_Audio_rawAudio.canPlayType('audio/ogg; codecs="vorbis"'), - wav : X_Audio_rawAudio.canPlayType('audio/wav; codecs="1"'), - aac : X_Audio_rawAudio.canPlayType('audio/aac'), - m4a : X_Audio_rawAudio.canPlayType('audio/x-m4a') + X_Audio_rawAudio.canPlayType('audio/m4a') + X_Audio_rawAudio.canPlayType('audio/aac'), - mp4 : X_Audio_rawAudio.canPlayType('audio/x-mp4') + X_Audio_rawAudio.canPlayType('audio/mp4') + X_Audio_rawAudio.canPlayType('audio/aac'), - weba : X_Audio_rawAudio.canPlayType('audio/webm; codecs="vorbis"') - }; - - (function( k, v ){ - for( k in X_Audio_codecs ){ - if( X_EMPTY_OBJECT[ k ] ) continue; - v = X_Audio_codecs[ k ]; - X_Audio_codecs[ k ] = v && v.split( 'no' ).join( '' ); - console.log( k + ' ' + X_Audio_codecs[ k ] ); + X_Audio_rawAudio = new X_Audio_constructor( '' ); + + if( X_Audio_rawAudio.canPlayType ){ + X_Audio_codecs = { + mp3 : X_Audio_rawAudio.canPlayType('audio/mpeg'), + opus : X_Audio_rawAudio.canPlayType('audio/ogg; codecs="opus"'), + ogg : X_Audio_rawAudio.canPlayType('audio/ogg; codecs="vorbis"'), + wav : X_Audio_rawAudio.canPlayType('audio/wav; codecs="1"'), + aac : X_Audio_rawAudio.canPlayType('audio/aac'), + m4a : X_Audio_rawAudio.canPlayType('audio/x-m4a') + X_Audio_rawAudio.canPlayType('audio/m4a') + X_Audio_rawAudio.canPlayType('audio/aac'), + mp4 : X_Audio_rawAudio.canPlayType('audio/x-mp4') + X_Audio_rawAudio.canPlayType('audio/mp4') + X_Audio_rawAudio.canPlayType('audio/aac'), + weba : X_Audio_rawAudio.canPlayType('audio/webm; codecs="vorbis"') }; - })(); - + (function( k, v ){ + for( k in X_Audio_codecs ){ + if( X_EMPTY_OBJECT[ k ] ) continue; + v = X_Audio_codecs[ k ]; + X_Audio_codecs[ k ] = v && v.split( 'no' ).join( '' ); + console.log( k + ' ' + X_Audio_codecs[ k ] ); + }; + })(); + } else { + // iOS3.2.3 + X_Audio_codecs = { + mp3 : X_UA.IE || X_UA.Chrome || ( X_UA.Windows && X_UA.Safari ), + ogg : 5 <= X_UA.Gecko || X_UA.Chrome || X_UA.Opera, + wav : X_UA.Gecko || X_UA.Opera || ( X_UA.Windows && X_UA.Safari ), + aac : X_UA.IE || X_UA.WebKit, + m4a : X_UA.IE || X_UA.WebKit, + mp4 : X_UA.IE || X_UA.WebKit, + weba : 2 <= X_UA.Gecko || 10.6 <= X_UA.Opera // firefox4+(Gecko2+) + }; + }; X_Audio_HTMLAudioWrapper = X.EventDispatcher.inherits( 'X.AV.HTML5AudioWrapper', @@ -107,7 +120,7 @@ if( window.HTMLAudioElement && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){ document.body.appendChild( this._rawObject ); //this._rawObject.load(); } else { - this._rawObject = X_Audio_rawAudio || new Audio( source );// X_Doc_create( 'audio', { src : source } ).appendToRoot();//( X.X_Node_systemNode ); + this._rawObject = X_Audio_rawAudio || new X_Audio_constructor( source );// X_Doc_create( 'audio', { src : source } ).appendToRoot();//( X.X_Node_systemNode ); this._rawObject.autobuffer = false; this._src = source; }; @@ -124,13 +137,13 @@ if( window.HTMLAudioElement && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){ if( X_Audio_HTMLAudioWrapper_badOperaAndroid ){ X_Audio_HTMLAudioWrapper_badOperaAndroid && alert( 12 ); X_EventDispatcher_toggleAllEvents( this, false ); - this._rawObject = new Audio( X_URL_toAbsolutePath( source ) ); + this._rawObject = new X_Audio_constructor( X_URL_toAbsolutePath( source ) ); //X_EventDispatcher_toggleAllEvents( this, true ); } else { X_Audio_rawAudio.src = source; }; - //this._rawObject = new Audio( X_URL_toAbsolutePath( source ) ); + //this._rawObject = new X_Audio_constructor( X_URL_toAbsolutePath( source ) ); /*!X_Audio_Sprite_needTouchFirst && */ X_Audio_rawAudio.load(); // 要る? X_Audio_rawAudio = null; }; diff --git a/0.6.x/js/07_audio/10_XAudioSprite.js b/0.6.x/js/07_audio/10_XAudioSprite.js index 717a7c4..6cdc290 100644 --- a/0.6.x/js/07_audio/10_XAudioSprite.js +++ b/0.6.x/js/07_audio/10_XAudioSprite.js @@ -7,7 +7,7 @@ var X_Audio_Sprite_shouldUse = window.HTMLAudioElement && ( X_UA.iOS || X_UA.AndroidBrowser || X_UA.OperaMobile || X_UA.OperaTablet ), // Flash がない X_Audio_Sprite_useVideoForMulti = 4 <= X_UA.AndroidBrowser && 534.3 < X_UA.AndroidBrowserWebkit, // ドスパラパッドはビデオのインライン再生が不可 X_Audio_Sprite_needTouchAndroid = X_Audio_Sprite_useVideoForMulti, - X_Audio_Sprite_needTouchFirst = !!X_UA.iOS || X_Audio_Sprite_needTouchAndroid || ( X_UA.WinPhone && X_UA.IE9 ), + X_Audio_Sprite_needTouchFirst = X_UA.iOS || X_Audio_Sprite_needTouchAndroid || ( X_UA.WinPhone && X_UA.IE9 ), X_Audio_Sprite_enableMultiTrack = !( X_UA.iOS && !X_Audio_WebAudio_context ) && !( X_UA.AndroidBrowser4 && X_UA.AndroidBrowserWebkit <= 534.3 ), X_Audio_Sprite_enableVolume = window.HTMLAudioElement && ( !X_UA.iOS && !X_UA.AndroidBrowser && !X_UA.OperaMobile && !X_UA.OperaTablet ), // TODO fennec は 25以上 X_Audio_Sprite_maxTracks = !X_Audio_Sprite_enableMultiTrack ? 1 : X_Audio_Sprite_useVideoForMulti ? 2 : 9, @@ -205,7 +205,7 @@ X_Audio_Sprite_members = { track = X_Audio_Sprite_TEMP.bgmTrack = tracks[ 0 ]; }; - if( track.listen( X.Event.MEDIA_BEFORE_LOOP, this, X_Audio_Sprite_handleEvent ).isPlaying() ){ + if( track.listen( [ X.Event.MEDIA_PLAYING, X.Event.MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent ).isPlaying() ){ track .state( { loop : true, @@ -227,7 +227,7 @@ X_Audio_Sprite_members = { if( 1 < tracks.length ){ track = X_Audio_Sprite_getTrackEnded( X_Audio_Sprite_TEMP.bgmPlaying ); track - .listen( X.Event.MEDIA_BEFORE_LOOP, this, X_Audio_Sprite_handleEvent ) + .listen( [ X.Event.MEDIA_PLAYING, X.Event.MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent ) .state( { looped : false } ) .play( preset[ 0 ], preset[ 1 ], true, 0, X_Audio_Sprite_lengthSilence ); } else { @@ -239,7 +239,7 @@ X_Audio_Sprite_members = { }; track = tracks[ 0 ]; - if( track.listen( X.Event.MEDIA_BEFORE_LOOP, this, X_Audio_Sprite_handleEvent ).isPlaying() ){ + if( track.listen( [ X.Event.MEDIA_PLAYING, X.Event.MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent ).isPlaying() ){ track .state( { loop : true, @@ -267,8 +267,8 @@ X_Audio_Sprite_members = { X_Audio_Sprite_TEMP.bgmPlaying = false; X_Audio_Sprite_TEMP.bgmTrack = null; }; - console.log( 'pause' ); track && track.play( 0, X_Audio_Sprite_lengthSilence, true, 0, X_Audio_Sprite_lengthSilence ).seek( 0 ); + this.asyncDispatch( X.Event.MEDIA_PAUSED ); return this; }, @@ -352,16 +352,20 @@ function X_Audio_Sprite_handleEvent( e ){ break; case X.Event.READY : + console.log( 'X.AudioSprite - Ready!' ); if( X_Audio_Sprite_needTouchAndroid ){ for( i = 0; i < X_Audio_Sprite_TEMP.tracks.length; ++i ){ X_Audio_Sprite_instance.pause( i ); }; - e.target.listenOnce( X.Event.MEDIA_PLAYING, this, X_Audio_Sprite_handleEvent ); // Android 標準ブラウザ + e.target.listenOnce( X.Event.MEDIA_PLAYING, this, this.asyncDispatch, [ X.Event.READY ] ); // Android 標準ブラウザ return; }; - case X.Event.MEDIA_PLAYING : this.asyncDispatch( X.Event.READY ); break; + + case X.Event.MEDIA_PLAYING : + ( e.target === X_Audio_Sprite_TEMP.bgmTrack || !e.target.state().looped ) && this.asyncDispatch( X.Event.MEDIA_PLAYING ); + break; case X.Event.MEDIA_BEFORE_LOOP : if( e.target === X_Audio_Sprite_TEMP.bgmTrack ){