リビジョン | 4ff55e875a0aa86831f3a07e0c278deddc1e18bb (tree) |
---|---|
日時 | 2015-02-12 23:26:32 |
作者 | itozyun <itozyun@user...> |
コミッター | itozyun |
Version 0.6.130, fix X.Net & X.Audio.
@@ -28,7 +28,7 @@ function X( v ){ | ||
28 | 28 | }; |
29 | 29 | }; |
30 | 30 | |
31 | -X.VERSION = '0.6.103'; | |
31 | +X.VERSION = '0.6.127'; | |
32 | 32 | |
33 | 33 | X.bootTime = + new Date; |
34 | 34 |
@@ -368,7 +368,7 @@ if( X_UA.Safari && X_UA.WebKit < 525.13 ){ | ||
368 | 368 | // ------------------------------------------------------------------------- // |
369 | 369 | X.UA = X_UA; |
370 | 370 | |
371 | - | |
371 | +// TODO 構文のサポート instanceof, in, try catch | |
372 | 372 | |
373 | 373 | if( X_UA.IE < 7 ){ // error @ NN7.2 |
374 | 374 | // bonus: hotfix for IE6 SP1 (bug KB823727) |
@@ -298,8 +298,9 @@ X.ViewPort = { | ||
298 | 298 | |
299 | 299 | html.appendTo = html.appendToRoot = html.before = html.after = html.clone = html.remove = html.destroy = html.prev = html.next = |
300 | 300 | html.create = html.createText = html.createAt = html.createTextAt = html.append = html.appendAt = html.empty = html.html = html.text = |
301 | + html.css = html.cssText = | |
301 | 302 | 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 = | |
303 | 304 | body.appendTo = body.appendToRoot = body.before = body.after = body.clone = body.remove = body.destroy = new Function( 'return this' ); |
304 | 305 | |
305 | 306 | X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_PRE_INIT, function(){ |
@@ -110,13 +110,14 @@ var | ||
110 | 110 | _rect : null, // |
111 | 111 | _fontSize : 0, |
112 | 112 | |
113 | + length : 1, | |
113 | 114 | parent : null, // remove された枝も親子構造は維持している。 |
114 | 115 | _xnodes : null, // Array.<Node> |
115 | 116 | |
116 | 117 | _tag : '', |
117 | 118 | _text : '', |
118 | - _id : '', | |
119 | - _className : '', | |
119 | + _id : '', // | |
120 | + _className : '', // | |
120 | 121 | |
121 | 122 | _attrs : null, // see X_Node_Attr |
122 | 123 | _newAttrs : null, |
@@ -131,12 +132,12 @@ var | ||
131 | 132 | * TODO Node の継承ができない! |
132 | 133 | */ |
133 | 134 | 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; | |
135 | 137 | |
136 | 138 | if( X_Node_newByTag ){ |
137 | 139 | X_Node_newByTag = false; |
138 | 140 | this._tag = v.toUpperCase(); |
139 | - this._flags |= X_Node_State.EXIST; | |
140 | 141 | arguments[ 1 ] && this.attr( arguments[ 1 ] ); |
141 | 142 | css = arguments[ 2 ]; |
142 | 143 | css && this[ X.Type.isString( css ) ? 'cssText' : 'css' ]( css ); |
@@ -144,7 +145,6 @@ var | ||
144 | 145 | if( X_Node_newByText ){ |
145 | 146 | X_Node_newByText = false; |
146 | 147 | this._text = v; |
147 | - this._flags |= X_Node_State.EXIST; | |
148 | 148 | } else { |
149 | 149 | if( 1 < arguments.length ) return new X_NodeList( arguments ); |
150 | 150 | if( X.Type.isArray( v ) && v.length ) return new X_NodeList( v ); |
@@ -158,11 +158,7 @@ var | ||
158 | 158 | if( xnode = X_Node_getXNode( v ) ) return xnode; |
159 | 159 | // v.parentNode || v.parentElement : dom1 || dom0 |
160 | 160 | 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 | - }; | |
164 | 161 | this._rawObject = v; |
165 | - this._flags |= X_Node_State.EXIST; | |
166 | 162 | this._tag = v.tagName.toUpperCase(); |
167 | 163 | this._id = v.id; |
168 | 164 | this._className = v.className; |
@@ -170,7 +166,7 @@ var | ||
170 | 166 | this.cssText( v.style.cssText ); |
171 | 167 | this._flags &= X_Node_BitMask_RESET_DIRTY; // X_Node_State.DIRTY_CSS を落とす |
172 | 168 | |
173 | - // TODO attr の回収は不可能、、、 | |
169 | + // TODO attr の回収は不可能、、、? | |
174 | 170 | if( X_UA_DOM.IE4 ){ |
175 | 171 | v.setAttribute( 'UID', '' + uid ); |
176 | 172 | } else { |
@@ -182,11 +178,7 @@ var | ||
182 | 178 | case X_Node_TYPE.RAW_TEXT : |
183 | 179 | if( xnode = X_Node_getXNode( v ) ) return xnode; |
184 | 180 | 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 | - }; | |
188 | 181 | this._rawObject = v; |
189 | - this._flags |= X_Node_State.EXIST; | |
190 | 182 | this._text = v.data; |
191 | 183 | v.UID = uid; |
192 | 184 | break; |
@@ -198,11 +190,16 @@ var | ||
198 | 190 | return X_Node_none; |
199 | 191 | |
200 | 192 | default : |
193 | + this.length = 0; | |
201 | 194 | if( X_Node_none ) return X_Node_none; |
202 | 195 | return; |
203 | 196 | }; |
204 | 197 | }; |
205 | 198 | |
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; | |
206 | 203 | X_Node_CHASHE[ this._uid = uid ] = this; |
207 | 204 | }, |
208 | 205 |
@@ -768,7 +765,7 @@ function X_Node_className( v ){ | ||
768 | 765 | |
769 | 766 | // setter |
770 | 767 | if( this._className === v ) return this; |
771 | - if( !v || typeof v !== 'string' ){ | |
768 | + if( !v || !X.Type.isString( v ) ){ | |
772 | 769 | delete this._className; |
773 | 770 | } else { |
774 | 771 | // cleanup |
@@ -957,6 +954,12 @@ function X_Node_call( name /*, opt_args... */ ){ | ||
957 | 954 | raw = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ); |
958 | 955 | if( !raw ) return; |
959 | 956 | |
957 | + if( name === 'scrollTo' ){ | |
958 | + raw.scrollLeft = arguments[ 1 ] || 0; | |
959 | + raw.scrollTop = arguments[ 2 ] || 0; | |
960 | + return; | |
961 | + }; | |
962 | + | |
960 | 963 | func = raw[ name ]; |
961 | 964 | if( X.Type.isFunction( func ) ){ |
962 | 965 | if( l ){ |
@@ -1115,8 +1118,8 @@ var X_Node__commitUpdate = | ||
1115 | 1118 | return nextElement; |
1116 | 1119 | }; |
1117 | 1120 | elm && ( elm.style.display = 'none' ); |
1118 | - return elm || nextElement; | |
1119 | - }; | |
1121 | + return elm.nextSibling === nextElement ? elm : nextElement; | |
1122 | + }; | |
1120 | 1123 | |
1121 | 1124 | // 5. ie5 非表示fixフラグ |
1122 | 1125 | accumulatedFlags |= that._flags; |
@@ -1132,6 +1135,9 @@ var X_Node__commitUpdate = | ||
1132 | 1135 | if( !that._tag ){ |
1133 | 1136 | that._flags &= X_Node_BitMask_RESET_DIRTY; |
1134 | 1137 | that._rawObject = elm = document.createTextNode( X_String_chrReferanceTo( that._text ) ); |
1138 | + if( !X.UA.IE ){ | |
1139 | + elm.UID = that._uid; | |
1140 | + }; | |
1135 | 1141 | } else |
1136 | 1142 | if( X_Node_strictElmCreation ){ |
1137 | 1143 | that._flags & X_Node_State.DIRTY_CSS && X_Node_CSS_objToCssText( that, true ); |
@@ -1154,13 +1160,13 @@ var X_Node__commitUpdate = | ||
1154 | 1160 | nextElement ? |
1155 | 1161 | parentElement.insertBefore( elm, nextElement ) : |
1156 | 1162 | parentElement.appendChild( elm ); |
1157 | - //elm.UID = that._uid; | |
1158 | - // src の onload があるので先ではないか? | |
1159 | - // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか? | |
1160 | - X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰 | |
1161 | 1163 | }; |
1162 | 1164 | |
1163 | 1165 | if( that._tag ){ |
1166 | + // src の onload があるので先ではないか? | |
1167 | + // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか? | |
1168 | + X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰 | |
1169 | + | |
1164 | 1170 | if( X_Node_documentFragment ){ |
1165 | 1171 | //( frg = X_Node_documentFragment ).appendChild( elm ); |
1166 | 1172 | }; |
@@ -1173,6 +1179,7 @@ var X_Node__commitUpdate = | ||
1173 | 1179 | } else { |
1174 | 1180 | elm.UID = that._uid; |
1175 | 1181 | that._newAttrs = that._attrs; |
1182 | + that._flags &= X_Node_BitMask_RESET_DIRTY; | |
1176 | 1183 | 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; |
1177 | 1184 | |
1178 | 1185 | // http://outcloud.blogspot.jp/2010/09/iframe.html |
@@ -1232,7 +1239,10 @@ var X_Node__commitUpdate = | ||
1232 | 1239 | parentElement.insertBefore( elm, nextElement ) : |
1233 | 1240 | parentElement.appendChild( elm ); |
1234 | 1241 | |
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 | + }; | |
1236 | 1246 | }; |
1237 | 1247 | |
1238 | 1248 | return elm; |
@@ -1256,7 +1266,7 @@ var X_Node__commitUpdate = | ||
1256 | 1266 | return prevElement; |
1257 | 1267 | }; |
1258 | 1268 | }; |
1259 | - return elm || prevElement; | |
1269 | + return elm || nextElement; | |
1260 | 1270 | }; |
1261 | 1271 | |
1262 | 1272 | if( !elm ){ |
@@ -1351,7 +1361,7 @@ var X_Node__updateRawNode = | ||
1351 | 1361 | }; |
1352 | 1362 | // className |
1353 | 1363 | 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- | |
1355 | 1365 | }; |
1356 | 1366 | |
1357 | 1367 | // attr |
@@ -1375,7 +1385,7 @@ var X_Node__updateRawNode = | ||
1375 | 1385 | case 'IFRAMEsrc' : |
1376 | 1386 | // http://outcloud.blogspot.jp/2010/09/iframe.html |
1377 | 1387 | // この問題は firefox3.6 で確認 |
1378 | - if( X_UA.Gecko ){ | |
1388 | + if( X_UA.Gecko && elm.contentWindow ){ | |
1379 | 1389 | elm.contentWindow.location.replace = elm.src = v || ''; |
1380 | 1390 | continue; |
1381 | 1391 | }; |
@@ -508,7 +508,7 @@ Node.prototype.css = function( nameOrObj /* orUnitID, valuOrUnitOrName */ ){ | ||
508 | 508 | var args = arguments, |
509 | 509 | css = this._css, |
510 | 510 | 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; | |
512 | 512 | // setter:object |
513 | 513 | if( X.Type.isObject( nameOrObj ) ){ |
514 | 514 | if( !css ) css = this._css = {}; |
@@ -281,7 +281,7 @@ function X_Node_Anime_updateAnimation( xnode ){ | ||
281 | 281 | X_ViewPort.unlisten( X.Event.AFTER_UPDATE, xnode, X_Node_Anime_gpuReleased ); |
282 | 282 | |
283 | 283 | xnode.css({ |
284 | - willChange : X_Node_Anime_transitionProps + ',opacity,width,height', | |
284 | + //willChange : X_Node_Anime_transitionProps + ',opacity,width,height', | |
285 | 285 | backfaceVisibility : 'hidden', |
286 | 286 | transitionTimingFunction : obj.easing.style, |
287 | 287 | transitionDelay : '0s' // 0.001 にすると transitionend のタイミングが狂う、、、 |
@@ -326,7 +326,7 @@ function X_Node_Anime_updateAnimation( xnode ){ | ||
326 | 326 | |
327 | 327 | case 10 : |
328 | 328 | // アニメーションは停止・GPUレイヤーは解除していない(再アニメーションに備えて待機) |
329 | - X_Node_Anime_clearTransition( xnode ); // TODO X_Node_Anime_releaseGPULayer に移動? | |
329 | + //X_Node_Anime_clearTransition( xnode ); // TODO X_Node_Anime_releaseGPULayer に移動? | |
330 | 330 | if( !obj.gpuTimerID ){ |
331 | 331 | if( obj.wait ){ |
332 | 332 | obj.gpuTimerID = X.Timer.once( obj.wait, xnode, X_Node_Anime_releaseGPULayer ); |
@@ -427,6 +427,7 @@ function X_Node_Anime_releaseGPULayer(){ | ||
427 | 427 | console.log( '_anime無' ); |
428 | 428 | return; |
429 | 429 | }; |
430 | + X_Node_Anime_clearTransition( this ); | |
430 | 431 | X_Node_Anime_updatePosition( this, obj.destX, obj.destY, obj.destA, false ); |
431 | 432 | X_Node_ANIMATIONS.splice( X_Node_ANIMATIONS.indexOf( this ), 1 ); |
432 | 433 | delete obj.gpuTimerID; |
@@ -448,7 +449,7 @@ function X_Node_Anime_clearTransition( xnode ){ | ||
448 | 449 | xnode.unlisten( 'transitionend', X_Node_Anime_onTransitionEnd ); |
449 | 450 | |
450 | 451 | xnode.css({ |
451 | - willChange : '', | |
452 | + //willChange : '', | |
452 | 453 | backfaceVisibility : '', |
453 | 454 | transitionTimingFunction : '', |
454 | 455 | transitionDelay : '', |
@@ -105,7 +105,7 @@ if( X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X ){ | ||
105 | 105 | async = obj[ 'async' ], |
106 | 106 | user = obj[ 'user' ], |
107 | 107 | password = obj[ 'password' ], |
108 | - headers = obj[ 'headers' ], | |
108 | + headers = obj[ 'headers' ] || {}, | |
109 | 109 | postbody = obj[ 'postbody' ], |
110 | 110 | timeout = obj[ 'timeout' ] || 20000, |
111 | 111 | temp; |
@@ -168,6 +168,11 @@ if( X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X ){ | ||
168 | 168 | // http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_r_1.html |
169 | 169 | // raw.overrideMimeType() |
170 | 170 | 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 | + | |
171 | 176 | for( p in headers ){ |
172 | 177 | if( X_EMPTY_OBJECT[ p ] ) continue; |
173 | 178 | raw.setRequestHeader( p, headers[ p ] ); // Opera8.01+, MSXML3+ |
@@ -28,7 +28,7 @@ X.Net.JSONP = { | ||
28 | 28 | X_NET_JSONPWrapper |
29 | 29 | .asyncDispatch( { |
30 | 30 | 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' ) | |
32 | 32 | } ); |
33 | 33 | |
34 | 34 | console.log( 'ms : ' + time + ' speed : ' + ( ( jsonString.length + ( opt_json2FileSize || 0 ) ) / time * 1000 ) + ' バイト/秒.' ); |
@@ -91,7 +91,8 @@ if( X_Audio_WebAudio_context ){ | ||
91 | 91 | // http://qiita.com/sou/items/5688d4e7d3a37b4e2ff1 |
92 | 92 | // iOS 7.1 で decodeAudioData に処理が入った瞬間にスクリーンを長押しする(スクロールを繰り返す)と |
93 | 93 | // 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 ){ | |
95 | 96 | this._onDecodeSuccess( X_Audio_WebAudio_context.createBuffer( e.data, false ) ); |
96 | 97 | } else |
97 | 98 | if( X_Audio_WebAudio_context.decodeAudioData ){ |
@@ -5,11 +5,13 @@ | ||
5 | 5 | */ |
6 | 6 | |
7 | 7 | var X_Audio_HTMLAudio_playTrigger = |
8 | + 6 <= X_UA.iOS ? 'loadeddata' : | |
8 | 9 | X_UA.iOS ? 'suspend' : |
9 | 10 | X_UA.AndroidBrowser2 ? 'stalled' : // Android 2.3.5(SBM101SH) では stalled は発生しない,,, |
10 | 11 | X_UA.AndroidBrowser4 ? 'loadeddata' : |
11 | 12 | X_UA.OperaMobile || X_UA.OperaTablet ? 'loadeddata' : 'canplay', |
12 | 13 | X_Audio_HTMLAudioWrapper, |
14 | + X_Audio_constructor = window.Audio || window.HTMLAudioElement, | |
13 | 15 | X_Audio_rawAudio, |
14 | 16 | // Opera Mobile 12 android4.4.4 & 2.3.5 は 2回目以降の currentTime へのセットで currentTime が更新されなくなるため、タイマーを使用する |
15 | 17 | 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 = | ||
31 | 33 | |
32 | 34 | X_Audio_codecs; |
33 | 35 | |
34 | -if( window.HTMLAudioElement && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){ | |
36 | +if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){ | |
35 | 37 | //http://himaxoff.blog111.fc2.com/blog-entry-97.html |
36 | 38 | //引数なしで 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"') | |
56 | 51 | }; |
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 | + }; | |
59 | 72 | |
60 | 73 | X_Audio_HTMLAudioWrapper = X.EventDispatcher.inherits( |
61 | 74 | 'X.AV.HTML5AudioWrapper', |
@@ -107,7 +120,7 @@ if( window.HTMLAudioElement && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){ | ||
107 | 120 | document.body.appendChild( this._rawObject ); |
108 | 121 | //this._rawObject.load(); |
109 | 122 | } 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 ); | |
111 | 124 | this._rawObject.autobuffer = false; |
112 | 125 | this._src = source; |
113 | 126 | }; |
@@ -124,13 +137,13 @@ if( window.HTMLAudioElement && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){ | ||
124 | 137 | if( X_Audio_HTMLAudioWrapper_badOperaAndroid ){ |
125 | 138 | X_Audio_HTMLAudioWrapper_badOperaAndroid && alert( 12 ); |
126 | 139 | 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 ) ); | |
128 | 141 | //X_EventDispatcher_toggleAllEvents( this, true ); |
129 | 142 | } else { |
130 | 143 | X_Audio_rawAudio.src = source; |
131 | 144 | }; |
132 | 145 | |
133 | - //this._rawObject = new Audio( X_URL_toAbsolutePath( source ) ); | |
146 | + //this._rawObject = new X_Audio_constructor( X_URL_toAbsolutePath( source ) ); | |
134 | 147 | /*!X_Audio_Sprite_needTouchFirst && */ X_Audio_rawAudio.load(); // 要る? |
135 | 148 | X_Audio_rawAudio = null; |
136 | 149 | }; |
@@ -7,7 +7,7 @@ | ||
7 | 7 | var X_Audio_Sprite_shouldUse = window.HTMLAudioElement && ( X_UA.iOS || X_UA.AndroidBrowser || X_UA.OperaMobile || X_UA.OperaTablet ), // Flash がない |
8 | 8 | X_Audio_Sprite_useVideoForMulti = 4 <= X_UA.AndroidBrowser && 534.3 < X_UA.AndroidBrowserWebkit, // ドスパラパッドはビデオのインライン再生が不可 |
9 | 9 | 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 ), | |
11 | 11 | X_Audio_Sprite_enableMultiTrack = !( X_UA.iOS && !X_Audio_WebAudio_context ) && !( X_UA.AndroidBrowser4 && X_UA.AndroidBrowserWebkit <= 534.3 ), |
12 | 12 | X_Audio_Sprite_enableVolume = window.HTMLAudioElement && ( !X_UA.iOS && !X_UA.AndroidBrowser && !X_UA.OperaMobile && !X_UA.OperaTablet ), // TODO fennec は 25以上 |
13 | 13 | X_Audio_Sprite_maxTracks = !X_Audio_Sprite_enableMultiTrack ? 1 : X_Audio_Sprite_useVideoForMulti ? 2 : 9, |
@@ -205,7 +205,7 @@ X_Audio_Sprite_members = { | ||
205 | 205 | track = X_Audio_Sprite_TEMP.bgmTrack = tracks[ 0 ]; |
206 | 206 | }; |
207 | 207 | |
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() ){ | |
209 | 209 | track |
210 | 210 | .state( { |
211 | 211 | loop : true, |
@@ -227,7 +227,7 @@ X_Audio_Sprite_members = { | ||
227 | 227 | if( 1 < tracks.length ){ |
228 | 228 | track = X_Audio_Sprite_getTrackEnded( X_Audio_Sprite_TEMP.bgmPlaying ); |
229 | 229 | 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 ) | |
231 | 231 | .state( { looped : false } ) |
232 | 232 | .play( preset[ 0 ], preset[ 1 ], true, 0, X_Audio_Sprite_lengthSilence ); |
233 | 233 | } else { |
@@ -239,7 +239,7 @@ X_Audio_Sprite_members = { | ||
239 | 239 | }; |
240 | 240 | track = tracks[ 0 ]; |
241 | 241 | |
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() ){ | |
243 | 243 | track |
244 | 244 | .state( { |
245 | 245 | loop : true, |
@@ -267,8 +267,8 @@ X_Audio_Sprite_members = { | ||
267 | 267 | X_Audio_Sprite_TEMP.bgmPlaying = false; |
268 | 268 | X_Audio_Sprite_TEMP.bgmTrack = null; |
269 | 269 | }; |
270 | - console.log( 'pause' ); | |
271 | 270 | track && track.play( 0, X_Audio_Sprite_lengthSilence, true, 0, X_Audio_Sprite_lengthSilence ).seek( 0 ); |
271 | + this.asyncDispatch( X.Event.MEDIA_PAUSED ); | |
272 | 272 | return this; |
273 | 273 | }, |
274 | 274 |
@@ -352,16 +352,20 @@ function X_Audio_Sprite_handleEvent( e ){ | ||
352 | 352 | break; |
353 | 353 | |
354 | 354 | case X.Event.READY : |
355 | + console.log( 'X.AudioSprite - Ready!' ); | |
355 | 356 | if( X_Audio_Sprite_needTouchAndroid ){ |
356 | 357 | for( i = 0; i < X_Audio_Sprite_TEMP.tracks.length; ++i ){ |
357 | 358 | X_Audio_Sprite_instance.pause( i ); |
358 | 359 | }; |
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 標準ブラウザ | |
360 | 361 | return; |
361 | 362 | }; |
362 | - case X.Event.MEDIA_PLAYING : | |
363 | 363 | this.asyncDispatch( X.Event.READY ); |
364 | 364 | 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; | |
365 | 369 | |
366 | 370 | case X.Event.MEDIA_BEFORE_LOOP : |
367 | 371 | if( e.target === X_Audio_Sprite_TEMP.bgmTrack ){ |