• R/O
  • HTTP
  • SSH
  • HTTPS

clientJs: コミット

クライアント側 js 開発用


コミットメタ情報

リビジョン4ff55e875a0aa86831f3a07e0c278deddc1e18bb (tree)
日時2015-02-12 23:26:32
作者itozyun <itozyun@user...>
コミッターitozyun

ログメッセージ

Version 0.6.130, fix X.Net & X.Audio.

変更サマリ

差分

--- 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 ){
2828 };
2929 };
3030
31-X.VERSION = '0.6.103';
31+X.VERSION = '0.6.127';
3232
3333 X.bootTime = + new Date;
3434
--- 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 ){
368368 // ------------------------------------------------------------------------- //
369369 X.UA = X_UA;
370370
371-
371+// TODO 構文のサポート instanceof, in, try catch
372372
373373 if( X_UA.IE < 7 ){ // error @ NN7.2
374374 // bonus: hotfix for IE6 SP1 (bug KB823727)
--- 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 = {
298298
299299 html.appendTo = html.appendToRoot = html.before = html.after = html.clone = html.remove = html.destroy = html.prev = html.next =
300300 html.create = html.createText = html.createAt = html.createTextAt = html.append = html.appendAt = html.empty = html.html = html.text =
301+ html.css = html.cssText =
301302 head.appendTo = head.appendToRoot = head.before = head.after = head.clone = head.remove = head.destroy =
302- head.empty = head.html = head.text =
303+ head.createText = head.createTextAt = head.empty = head.html = head.text = head.css = head.cssText =
303304 body.appendTo = body.appendToRoot = body.before = body.after = body.clone = body.remove = body.destroy = new Function( 'return this' );
304305
305306 X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_PRE_INIT, function(){
--- 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
110110 _rect : null, //
111111 _fontSize : 0,
112112
113+ length : 1,
113114 parent : null, // remove された枝も親子構造は維持している。
114115 _xnodes : null, // Array.<Node>
115116
116117 _tag : '',
117118 _text : '',
118- _id : '',
119- _className : '',
119+ _id : '', //
120+ _className : '', //
120121
121122 _attrs : null, // see X_Node_Attr
122123 _newAttrs : null,
@@ -131,12 +132,12 @@ var
131132 * TODO Node の継承ができない!
132133 */
133134 Constructor : function( v ){
134- var css, xnodes, xnode, parent, uid = X_Node_CHASHE.length;
135+ var uid = X_Node_CHASHE.length,
136+ css, xnodes, xnode, parent;
135137
136138 if( X_Node_newByTag ){
137139 X_Node_newByTag = false;
138140 this._tag = v.toUpperCase();
139- this._flags |= X_Node_State.EXIST;
140141 arguments[ 1 ] && this.attr( arguments[ 1 ] );
141142 css = arguments[ 2 ];
142143 css && this[ X.Type.isString( css ) ? 'cssText' : 'css' ]( css );
@@ -144,7 +145,6 @@ var
144145 if( X_Node_newByText ){
145146 X_Node_newByText = false;
146147 this._text = v;
147- this._flags |= X_Node_State.EXIST;
148148 } else {
149149 if( 1 < arguments.length ) return new X_NodeList( arguments );
150150 if( X.Type.isArray( v ) && v.length ) return new X_NodeList( v );
@@ -158,11 +158,7 @@ var
158158 if( xnode = X_Node_getXNode( v ) ) return xnode;
159159 // v.parentNode || v.parentElement : dom1 || dom0
160160 this.parent = ( parent = v.parentNode || v.parentElement ) && parent.tagName /* ie7- */ && X_Node_getXNode( parent );
161- if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){
162- this._flags |= X_Node_State.IN_TREE;
163- };
164161 this._rawObject = v;
165- this._flags |= X_Node_State.EXIST;
166162 this._tag = v.tagName.toUpperCase();
167163 this._id = v.id;
168164 this._className = v.className;
@@ -170,7 +166,7 @@ var
170166 this.cssText( v.style.cssText );
171167 this._flags &= X_Node_BitMask_RESET_DIRTY; // X_Node_State.DIRTY_CSS を落とす
172168
173- // TODO attr の回収は不可能、、、
169+ // TODO attr の回収は不可能、、、?
174170 if( X_UA_DOM.IE4 ){
175171 v.setAttribute( 'UID', '' + uid );
176172 } else {
@@ -182,11 +178,7 @@ var
182178 case X_Node_TYPE.RAW_TEXT :
183179 if( xnode = X_Node_getXNode( v ) ) return xnode;
184180 this.parent = X_Node_getXNode( v.parentNode );
185- if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){
186- this._flags |= X_Node_State.IN_TREE;
187- };
188181 this._rawObject = v;
189- this._flags |= X_Node_State.EXIST;
190182 this._text = v.data;
191183 v.UID = uid;
192184 break;
@@ -198,11 +190,16 @@ var
198190 return X_Node_none;
199191
200192 default :
193+ this.length = 0;
201194 if( X_Node_none ) return X_Node_none;
202195 return;
203196 };
204197 };
205198
199+ if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){
200+ this._flags |= X_Node_State.IN_TREE;
201+ };
202+ this._flags |= X_Node_State.EXIST;
206203 X_Node_CHASHE[ this._uid = uid ] = this;
207204 },
208205
@@ -768,7 +765,7 @@ function X_Node_className( v ){
768765
769766 // setter
770767 if( this._className === v ) return this;
771- if( !v || typeof v !== 'string' ){
768+ if( !v || !X.Type.isString( v ) ){
772769 delete this._className;
773770 } else {
774771 // cleanup
@@ -957,6 +954,12 @@ function X_Node_call( name /*, opt_args... */ ){
957954 raw = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );
958955 if( !raw ) return;
959956
957+ if( name === 'scrollTo' ){
958+ raw.scrollLeft = arguments[ 1 ] || 0;
959+ raw.scrollTop = arguments[ 2 ] || 0;
960+ return;
961+ };
962+
960963 func = raw[ name ];
961964 if( X.Type.isFunction( func ) ){
962965 if( l ){
@@ -1115,8 +1118,8 @@ var X_Node__commitUpdate =
11151118 return nextElement;
11161119 };
11171120 elm && ( elm.style.display = 'none' );
1118- return elm || nextElement;
1119- };
1121+ return elm.nextSibling === nextElement ? elm : nextElement;
1122+ };
11201123
11211124 // 5. ie5 非表示fixフラグ
11221125 accumulatedFlags |= that._flags;
@@ -1132,6 +1135,9 @@ var X_Node__commitUpdate =
11321135 if( !that._tag ){
11331136 that._flags &= X_Node_BitMask_RESET_DIRTY;
11341137 that._rawObject = elm = document.createTextNode( X_String_chrReferanceTo( that._text ) );
1138+ if( !X.UA.IE ){
1139+ elm.UID = that._uid;
1140+ };
11351141 } else
11361142 if( X_Node_strictElmCreation ){
11371143 that._flags & X_Node_State.DIRTY_CSS && X_Node_CSS_objToCssText( that, true );
@@ -1154,13 +1160,13 @@ var X_Node__commitUpdate =
11541160 nextElement ?
11551161 parentElement.insertBefore( elm, nextElement ) :
11561162 parentElement.appendChild( elm );
1157- //elm.UID = that._uid;
1158- // src の onload があるので先ではないか?
1159- // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか?
1160- X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰
11611163 };
11621164
11631165 if( that._tag ){
1166+ // src の onload があるので先ではないか?
1167+ // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか?
1168+ X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰
1169+
11641170 if( X_Node_documentFragment ){
11651171 //( frg = X_Node_documentFragment ).appendChild( elm );
11661172 };
@@ -1173,6 +1179,7 @@ var X_Node__commitUpdate =
11731179 } else {
11741180 elm.UID = that._uid;
11751181 that._newAttrs = that._attrs;
1182+ that._flags &= X_Node_BitMask_RESET_DIRTY;
11761183 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;
11771184
11781185 // http://outcloud.blogspot.jp/2010/09/iframe.html
@@ -1232,7 +1239,10 @@ var X_Node__commitUpdate =
12321239 parentElement.insertBefore( elm, nextElement ) :
12331240 parentElement.appendChild( elm );
12341241
1235- X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰
1242+ if( X_UA.Gecko && that._tag === 'IFRAME' && elm.contentWindow ){
1243+ // tree に追加されるまで contentWindow は存在しない。
1244+ elm.contentWindow.location.replace = elm.src;
1245+ };
12361246 };
12371247
12381248 return elm;
@@ -1256,7 +1266,7 @@ var X_Node__commitUpdate =
12561266 return prevElement;
12571267 };
12581268 };
1259- return elm || prevElement;
1269+ return elm || nextElement;
12601270 };
12611271
12621272 if( !elm ){
@@ -1351,7 +1361,7 @@ var X_Node__updateRawNode =
13511361 };
13521362 // className
13531363 if( that._flags & X_Node_State.DIRTY_CLASSNAME ){
1354- that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X_UA.IE5678 ? 'className' : 'class' ) ); // className は ie7-?
1364+ that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X_UA.IE < 8 ? 'className' : 'class' ) ); // className は ie7-
13551365 };
13561366
13571367 // attr
@@ -1375,7 +1385,7 @@ var X_Node__updateRawNode =
13751385 case 'IFRAMEsrc' :
13761386 // http://outcloud.blogspot.jp/2010/09/iframe.html
13771387 // この問題は firefox3.6 で確認
1378- if( X_UA.Gecko ){
1388+ if( X_UA.Gecko && elm.contentWindow ){
13791389 elm.contentWindow.location.replace = elm.src = v || '';
13801390 continue;
13811391 };
--- 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 */ ){
508508 var args = arguments,
509509 css = this._css,
510510 p, name, v, plain, camelize, flags;
511- if( !this._tag ) return this;
511+ if( !this._tag || X_Dom_DTD_MOVE_TO_HEAD[ this._tag ] || this._tag === 'SCRIPT' ) return this;
512512 // setter:object
513513 if( X.Type.isObject( nameOrObj ) ){
514514 if( !css ) css = this._css = {};
--- 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 ){
281281 X_ViewPort.unlisten( X.Event.AFTER_UPDATE, xnode, X_Node_Anime_gpuReleased );
282282
283283 xnode.css({
284- willChange : X_Node_Anime_transitionProps + ',opacity,width,height',
284+ //willChange : X_Node_Anime_transitionProps + ',opacity,width,height',
285285 backfaceVisibility : 'hidden',
286286 transitionTimingFunction : obj.easing.style,
287287 transitionDelay : '0s' // 0.001 にすると transitionend のタイミングが狂う、、、
@@ -326,7 +326,7 @@ function X_Node_Anime_updateAnimation( xnode ){
326326
327327 case 10 :
328328 // アニメーションは停止・GPUレイヤーは解除していない(再アニメーションに備えて待機)
329- X_Node_Anime_clearTransition( xnode ); // TODO X_Node_Anime_releaseGPULayer に移動?
329+ //X_Node_Anime_clearTransition( xnode ); // TODO X_Node_Anime_releaseGPULayer に移動?
330330 if( !obj.gpuTimerID ){
331331 if( obj.wait ){
332332 obj.gpuTimerID = X.Timer.once( obj.wait, xnode, X_Node_Anime_releaseGPULayer );
@@ -427,6 +427,7 @@ function X_Node_Anime_releaseGPULayer(){
427427 console.log( '_anime無' );
428428 return;
429429 };
430+ X_Node_Anime_clearTransition( this );
430431 X_Node_Anime_updatePosition( this, obj.destX, obj.destY, obj.destA, false );
431432 X_Node_ANIMATIONS.splice( X_Node_ANIMATIONS.indexOf( this ), 1 );
432433 delete obj.gpuTimerID;
@@ -448,7 +449,7 @@ function X_Node_Anime_clearTransition( xnode ){
448449 xnode.unlisten( 'transitionend', X_Node_Anime_onTransitionEnd );
449450
450451 xnode.css({
451- willChange : '',
452+ //willChange : '',
452453 backfaceVisibility : '',
453454 transitionTimingFunction : '',
454455 transitionDelay : '',
--- 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 ){
105105 async = obj[ 'async' ],
106106 user = obj[ 'user' ],
107107 password = obj[ 'password' ],
108- headers = obj[ 'headers' ],
108+ headers = obj[ 'headers' ] || {},
109109 postbody = obj[ 'postbody' ],
110110 timeout = obj[ 'timeout' ] || 20000,
111111 temp;
@@ -168,6 +168,11 @@ if( X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X ){
168168 // http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_r_1.html
169169 // raw.overrideMimeType()
170170 if( !X_Net_XHR_ACTIVE_X && X.Type.isFunction( raw.setRequestHeader ) ){
171+
172+ // http://nakigao.sitemix.jp/blog/?p=2040
173+ // SafariでHTTP/412のエラー
174+ headers[ 'If-Modified-Since' ] = ( new Date ).toUTCString();
175+
171176 for( p in headers ){
172177 if( X_EMPTY_OBJECT[ p ] ) continue;
173178 raw.setRequestHeader( p, headers[ p ] ); // Opera8.01+, MSXML3+
--- 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 = {
2828 X_NET_JSONPWrapper
2929 .asyncDispatch( {
3030 type : jsonString ? X.Event.SUCCESS : X.Event.ERROR,
31- data : jsonString //window.JSON ? JSON.parse( jsonString ) : eval( jsonString )
31+ data : window.JSON ? JSON.parse( jsonString ) : eval( 'var a=' + jsonString + ';a' )
3232 } );
3333
3434 console.log( 'ms : ' + time + ' speed : ' + ( ( jsonString.length + ( opt_json2FileSize || 0 ) ) / time * 1000 ) + ' バイト/秒.' );
--- 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 ){
9191 // http://qiita.com/sou/items/5688d4e7d3a37b4e2ff1
9292 // iOS 7.1 で decodeAudioData に処理が入った瞬間にスクリーンを長押しする(スクロールを繰り返す)と
9393 // decoeAudioData の処理がキャンセルされることがある(エラーやコールバックの発火もなく、ただ処理が消滅する)。
94- if( X_Audio_WebAudio_context.createBuffer && X_UA.iOS ){
94+ // ただし iOS 8.1.2 では エラーになる
95+ if( X_Audio_WebAudio_context.createBuffer && X_UA.iOS < 8 ){
9596 this._onDecodeSuccess( X_Audio_WebAudio_context.createBuffer( e.data, false ) );
9697 } else
9798 if( X_Audio_WebAudio_context.decodeAudioData ){
--- a/0.6.x/js/07_audio/02_XHTMLAudio.js
+++ b/0.6.x/js/07_audio/02_XHTMLAudio.js
@@ -5,11 +5,13 @@
55 */
66
77 var X_Audio_HTMLAudio_playTrigger =
8+ 6 <= X_UA.iOS ? 'loadeddata' :
89 X_UA.iOS ? 'suspend' :
910 X_UA.AndroidBrowser2 ? 'stalled' : // Android 2.3.5(SBM101SH) では stalled は発生しない,,,
1011 X_UA.AndroidBrowser4 ? 'loadeddata' :
1112 X_UA.OperaMobile || X_UA.OperaTablet ? 'loadeddata' : 'canplay',
1213 X_Audio_HTMLAudioWrapper,
14+ X_Audio_constructor = window.Audio || window.HTMLAudioElement,
1315 X_Audio_rawAudio,
1416 // Opera Mobile 12 android4.4.4 & 2.3.5 は 2回目以降の currentTime へのセットで currentTime が更新されなくなるため、タイマーを使用する
1517 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 =
3133
3234 X_Audio_codecs;
3335
34-if( window.HTMLAudioElement && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
36+if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
3537 //http://himaxoff.blog111.fc2.com/blog-entry-97.html
3638 //引数なしで new Audio() とすると、Operaでエラーになるそうなので注意。
37- X_Audio_rawAudio = new Audio( '' );
38-
39- X_Audio_codecs = {
40- mp3 : X_Audio_rawAudio.canPlayType('audio/mpeg'),
41- opus : X_Audio_rawAudio.canPlayType('audio/ogg; codecs="opus"'),
42- ogg : X_Audio_rawAudio.canPlayType('audio/ogg; codecs="vorbis"'),
43- wav : X_Audio_rawAudio.canPlayType('audio/wav; codecs="1"'),
44- aac : X_Audio_rawAudio.canPlayType('audio/aac'),
45- m4a : X_Audio_rawAudio.canPlayType('audio/x-m4a') + X_Audio_rawAudio.canPlayType('audio/m4a') + X_Audio_rawAudio.canPlayType('audio/aac'),
46- mp4 : X_Audio_rawAudio.canPlayType('audio/x-mp4') + X_Audio_rawAudio.canPlayType('audio/mp4') + X_Audio_rawAudio.canPlayType('audio/aac'),
47- weba : X_Audio_rawAudio.canPlayType('audio/webm; codecs="vorbis"')
48- };
49-
50- (function( k, v ){
51- for( k in X_Audio_codecs ){
52- if( X_EMPTY_OBJECT[ k ] ) continue;
53- v = X_Audio_codecs[ k ];
54- X_Audio_codecs[ k ] = v && v.split( 'no' ).join( '' );
55- console.log( k + ' ' + X_Audio_codecs[ k ] );
39+ X_Audio_rawAudio = new X_Audio_constructor( '' );
40+
41+ if( X_Audio_rawAudio.canPlayType ){
42+ X_Audio_codecs = {
43+ mp3 : X_Audio_rawAudio.canPlayType('audio/mpeg'),
44+ opus : X_Audio_rawAudio.canPlayType('audio/ogg; codecs="opus"'),
45+ ogg : X_Audio_rawAudio.canPlayType('audio/ogg; codecs="vorbis"'),
46+ wav : X_Audio_rawAudio.canPlayType('audio/wav; codecs="1"'),
47+ aac : X_Audio_rawAudio.canPlayType('audio/aac'),
48+ m4a : X_Audio_rawAudio.canPlayType('audio/x-m4a') + X_Audio_rawAudio.canPlayType('audio/m4a') + X_Audio_rawAudio.canPlayType('audio/aac'),
49+ mp4 : X_Audio_rawAudio.canPlayType('audio/x-mp4') + X_Audio_rawAudio.canPlayType('audio/mp4') + X_Audio_rawAudio.canPlayType('audio/aac'),
50+ weba : X_Audio_rawAudio.canPlayType('audio/webm; codecs="vorbis"')
5651 };
57- })();
58-
52+ (function( k, v ){
53+ for( k in X_Audio_codecs ){
54+ if( X_EMPTY_OBJECT[ k ] ) continue;
55+ v = X_Audio_codecs[ k ];
56+ X_Audio_codecs[ k ] = v && v.split( 'no' ).join( '' );
57+ console.log( k + ' ' + X_Audio_codecs[ k ] );
58+ };
59+ })();
60+ } else {
61+ // iOS3.2.3
62+ X_Audio_codecs = {
63+ mp3 : X_UA.IE || X_UA.Chrome || ( X_UA.Windows && X_UA.Safari ),
64+ ogg : 5 <= X_UA.Gecko || X_UA.Chrome || X_UA.Opera,
65+ wav : X_UA.Gecko || X_UA.Opera || ( X_UA.Windows && X_UA.Safari ),
66+ aac : X_UA.IE || X_UA.WebKit,
67+ m4a : X_UA.IE || X_UA.WebKit,
68+ mp4 : X_UA.IE || X_UA.WebKit,
69+ weba : 2 <= X_UA.Gecko || 10.6 <= X_UA.Opera // firefox4+(Gecko2+)
70+ };
71+ };
5972
6073 X_Audio_HTMLAudioWrapper = X.EventDispatcher.inherits(
6174 'X.AV.HTML5AudioWrapper',
@@ -107,7 +120,7 @@ if( window.HTMLAudioElement && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
107120 document.body.appendChild( this._rawObject );
108121 //this._rawObject.load();
109122 } else {
110- this._rawObject = X_Audio_rawAudio || new Audio( source );// X_Doc_create( 'audio', { src : source } ).appendToRoot();//( X.X_Node_systemNode );
123+ this._rawObject = X_Audio_rawAudio || new X_Audio_constructor( source );// X_Doc_create( 'audio', { src : source } ).appendToRoot();//( X.X_Node_systemNode );
111124 this._rawObject.autobuffer = false;
112125 this._src = source;
113126 };
@@ -124,13 +137,13 @@ if( window.HTMLAudioElement && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){
124137 if( X_Audio_HTMLAudioWrapper_badOperaAndroid ){
125138 X_Audio_HTMLAudioWrapper_badOperaAndroid && alert( 12 );
126139 X_EventDispatcher_toggleAllEvents( this, false );
127- this._rawObject = new Audio( X_URL_toAbsolutePath( source ) );
140+ this._rawObject = new X_Audio_constructor( X_URL_toAbsolutePath( source ) );
128141 //X_EventDispatcher_toggleAllEvents( this, true );
129142 } else {
130143 X_Audio_rawAudio.src = source;
131144 };
132145
133- //this._rawObject = new Audio( X_URL_toAbsolutePath( source ) );
146+ //this._rawObject = new X_Audio_constructor( X_URL_toAbsolutePath( source ) );
134147 /*!X_Audio_Sprite_needTouchFirst && */ X_Audio_rawAudio.load(); // 要る?
135148 X_Audio_rawAudio = null;
136149 };
--- a/0.6.x/js/07_audio/10_XAudioSprite.js
+++ b/0.6.x/js/07_audio/10_XAudioSprite.js
@@ -7,7 +7,7 @@
77 var X_Audio_Sprite_shouldUse = window.HTMLAudioElement && ( X_UA.iOS || X_UA.AndroidBrowser || X_UA.OperaMobile || X_UA.OperaTablet ), // Flash がない
88 X_Audio_Sprite_useVideoForMulti = 4 <= X_UA.AndroidBrowser && 534.3 < X_UA.AndroidBrowserWebkit, // ドスパラパッドはビデオのインライン再生が不可
99 X_Audio_Sprite_needTouchAndroid = X_Audio_Sprite_useVideoForMulti,
10- X_Audio_Sprite_needTouchFirst = !!X_UA.iOS || X_Audio_Sprite_needTouchAndroid || ( X_UA.WinPhone && X_UA.IE9 ),
10+ X_Audio_Sprite_needTouchFirst = X_UA.iOS || X_Audio_Sprite_needTouchAndroid || ( X_UA.WinPhone && X_UA.IE9 ),
1111 X_Audio_Sprite_enableMultiTrack = !( X_UA.iOS && !X_Audio_WebAudio_context ) && !( X_UA.AndroidBrowser4 && X_UA.AndroidBrowserWebkit <= 534.3 ),
1212 X_Audio_Sprite_enableVolume = window.HTMLAudioElement && ( !X_UA.iOS && !X_UA.AndroidBrowser && !X_UA.OperaMobile && !X_UA.OperaTablet ), // TODO fennec は 25以上
1313 X_Audio_Sprite_maxTracks = !X_Audio_Sprite_enableMultiTrack ? 1 : X_Audio_Sprite_useVideoForMulti ? 2 : 9,
@@ -205,7 +205,7 @@ X_Audio_Sprite_members = {
205205 track = X_Audio_Sprite_TEMP.bgmTrack = tracks[ 0 ];
206206 };
207207
208- if( track.listen( X.Event.MEDIA_BEFORE_LOOP, this, X_Audio_Sprite_handleEvent ).isPlaying() ){
208+ if( track.listen( [ X.Event.MEDIA_PLAYING, X.Event.MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent ).isPlaying() ){
209209 track
210210 .state( {
211211 loop : true,
@@ -227,7 +227,7 @@ X_Audio_Sprite_members = {
227227 if( 1 < tracks.length ){
228228 track = X_Audio_Sprite_getTrackEnded( X_Audio_Sprite_TEMP.bgmPlaying );
229229 track
230- .listen( X.Event.MEDIA_BEFORE_LOOP, this, X_Audio_Sprite_handleEvent )
230+ .listen( [ X.Event.MEDIA_PLAYING, X.Event.MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent )
231231 .state( { looped : false } )
232232 .play( preset[ 0 ], preset[ 1 ], true, 0, X_Audio_Sprite_lengthSilence );
233233 } else {
@@ -239,7 +239,7 @@ X_Audio_Sprite_members = {
239239 };
240240 track = tracks[ 0 ];
241241
242- if( track.listen( X.Event.MEDIA_BEFORE_LOOP, this, X_Audio_Sprite_handleEvent ).isPlaying() ){
242+ if( track.listen( [ X.Event.MEDIA_PLAYING, X.Event.MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent ).isPlaying() ){
243243 track
244244 .state( {
245245 loop : true,
@@ -267,8 +267,8 @@ X_Audio_Sprite_members = {
267267 X_Audio_Sprite_TEMP.bgmPlaying = false;
268268 X_Audio_Sprite_TEMP.bgmTrack = null;
269269 };
270- console.log( 'pause' );
271270 track && track.play( 0, X_Audio_Sprite_lengthSilence, true, 0, X_Audio_Sprite_lengthSilence ).seek( 0 );
271+ this.asyncDispatch( X.Event.MEDIA_PAUSED );
272272 return this;
273273 },
274274
@@ -352,16 +352,20 @@ function X_Audio_Sprite_handleEvent( e ){
352352 break;
353353
354354 case X.Event.READY :
355+ console.log( 'X.AudioSprite - Ready!' );
355356 if( X_Audio_Sprite_needTouchAndroid ){
356357 for( i = 0; i < X_Audio_Sprite_TEMP.tracks.length; ++i ){
357358 X_Audio_Sprite_instance.pause( i );
358359 };
359- e.target.listenOnce( X.Event.MEDIA_PLAYING, this, X_Audio_Sprite_handleEvent ); // Android 標準ブラウザ
360+ e.target.listenOnce( X.Event.MEDIA_PLAYING, this, this.asyncDispatch, [ X.Event.READY ] ); // Android 標準ブラウザ
360361 return;
361362 };
362- case X.Event.MEDIA_PLAYING :
363363 this.asyncDispatch( X.Event.READY );
364364 break;
365+
366+ case X.Event.MEDIA_PLAYING :
367+ ( e.target === X_Audio_Sprite_TEMP.bgmTrack || !e.target.state().looped ) && this.asyncDispatch( X.Event.MEDIA_PLAYING );
368+ break;
365369
366370 case X.Event.MEDIA_BEFORE_LOOP :
367371 if( e.target === X_Audio_Sprite_TEMP.bgmTrack ){
旧リポジトリブラウザで表示