From: itozyun Date: Tue, 22 Sep 2015 03:11:49 +0000 (+0900) Subject: Version 0.6.172, bugfix... X-Git-Url: http://git.osdn.jp/view?p=pettanr%2FclientJs.git;a=commitdiff_plain;h=eca68ae8a52822bb0d2d7556fd28784bb2103a2f Version 0.6.172, bugfix... --- diff --git a/0.6.x/js/01_core/02_XUA.js b/0.6.x/js/01_core/02_XUA.js index 94799e4..fafe846 100644 --- a/0.6.x/js/01_core/02_XUA.js +++ b/0.6.x/js/01_core/02_XUA.js @@ -502,7 +502,8 @@ var X_UA = X[ 'UA' ] = {}, console.log( '>> Gecko : ' + X_UA[ 'Gecko' ] ); }; - if( dua.indexOf( 'Linux; U; Android ' ) !== -1 || dua.indexOf( 'Linux; Android ' ) !== -1 ){ + if( ( dua.indexOf( 'Linux; U; Android ' ) !== -1 || dua.indexOf( 'Linux; Android ' ) !== -1 ) && + ( dua.indexOf( 'Chrome\/' ) === -1 || dua.indexOf( 'Version\/' ) !== -1 ) ){ // Chrome/ を含まない または Version/ を含む /** * Android 標準ブラウザ * @alias X.UA.AndroidBrowser diff --git a/0.6.x/js/01_core/13_XClass.js b/0.6.x/js/01_core/13_XClass.js index 6cf56b8..b475f11 100644 --- a/0.6.x/js/01_core/13_XClass.js +++ b/0.6.x/js/01_core/13_XClass.js @@ -130,12 +130,13 @@ X_Class_CommonMethods = 'Super' : function( var_args ){ var sClass = this, i = X_Class_CALLING_SUPER.indexOf( sClass ), - n = -1, l, sList, def, sConst, ret; if( i === -1 ){ X_Class_CALLING_SUPER[ l = X_Class_CALLING_SUPER.length ] = sClass; X_Class_CALL_SUPER_STACK[ l ] = sList = []; + def = X_Class_getClassDef( sClass ); + if( !def.Constructor ) sClass = def.SuperClass;// 現在のクラスがコンストラクタを持たない場合 SuperConstructor を new で呼んでいるため再び呼ばないようにする } else { sList = X_Class_CALL_SUPER_STACK[ i ]; }; @@ -144,8 +145,9 @@ X_Class_CommonMethods = def = X_Class_getClassDef( sClass ); sClass = def.SuperClass; sConst = def.SuperConstructor; - if( sConst && sList[ ++n ] !== sConst ){ - sList[ n ] = sConst; + if( !sConst ) break; + if( sList.indexOf( sConst ) === -1 ){ + sList[ sList.length ] = sConst; ret = sConst.apply( this, arguments ); --sList.length; if( !sList.length ){ diff --git a/0.6.x/js/01_core/16_XTimer.js b/0.6.x/js/01_core/16_XTimer.js index 4df6372..faa9031 100644 --- a/0.6.x/js/01_core/16_XTimer.js +++ b/0.6.x/js/01_core/16_XTimer.js @@ -374,7 +374,7 @@ function X_Timer_update(){ 1 < i && list.sort( X_Timer_compareQueue ); - n = list[ i - 1 ].last; + n = list[ 0 ].last; if( n < X_Timer_waitTime || X_Timer_timerId === 0 ){ if( X_Timer_timerId ){ @@ -390,7 +390,7 @@ function X_Timer_update(){ // 大きい -> 小さい function X_Timer_compareQueue( a, b ){ - return a.last < b.last ? 1 : a.last === b.last ? 0 : -1; + return a.last < b.last ? -1 : a.last === b.last ? 0 : 1; }; // http://havelog.ayumusato.com/develop/javascript/e528-ios6_scrolling_timer_notcall.html diff --git a/0.6.x/js/01_core/21_XViewPort.js b/0.6.x/js/01_core/21_XViewPort.js index 2349dde..aa8cdc3 100644 --- a/0.6.x/js/01_core/21_XViewPort.js +++ b/0.6.x/js/01_core/21_XViewPort.js @@ -1,6 +1,6 @@ var X_ViewPort_readyState, - X_ViewPort_active = !!window.parent || !!document.activeElement, // parent は frameに読み込まれた場合のieのerror回避 + X_ViewPort_active = ( window.parent === window ) || !window.parent, // parent は frameに読み込まれた場合のieのerror回避 X_ViewPort_activeTimerID, X_ViewPort_rootElement, X_ViewPort_lock, @@ -58,17 +58,19 @@ X_ViewPort = X_Class_override( case 'visibilitychange' : console.log( e.type + ':' + document[ 'hidden' ] ); - X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = document[ 'hidden' ] ) ? X_EVENT_VIEW_DEACTIVATE : X_EVENT_VIEW_ACTIVATE ); + X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = !document[ 'hidden' ] ) ? X_EVENT_VIEW_ACTIVATE : X_EVENT_VIEW_DEACTIVATE ); break; case 'msvisibilitychange' : - X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = document[ 'msHidden' ] ) ? X_EVENT_VIEW_DEACTIVATE : X_EVENT_VIEW_ACTIVATE ); + console.log( e.type + ':' + document[ 'msHidden' ] ); + X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = !document[ 'msHidden' ] ) ? X_EVENT_VIEW_ACTIVATE : X_EVENT_VIEW_DEACTIVATE ); break; case 'mozvisibilitychange' : - X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = document[ 'mozHidden' ] ) ? X_EVENT_VIEW_DEACTIVATE : X_EVENT_VIEW_ACTIVATE ); + console.log( e.type + ':' + document[ 'mozHidden' ] ); + X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = !document[ 'mozHidden' ] ) ? X_EVENT_VIEW_ACTIVATE : X_EVENT_VIEW_DEACTIVATE ); break; case 'webkitvisibilitychange' : console.log( e.type + ':' + document[ 'webkitHidden' ] ); - X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = document[ 'webkitHidden' ] ) ? X_EVENT_VIEW_DEACTIVATE : X_EVENT_VIEW_ACTIVATE ); + X_ViewPort[ 'dispatch' ]( ( X_ViewPort_active = !document[ 'webkitHidden' ] ) ? X_EVENT_VIEW_ACTIVATE : X_EVENT_VIEW_DEACTIVATE ); break; case 'blur' : @@ -76,7 +78,7 @@ X_ViewPort = X_Class_override( if( X_UA[ 'IE' ] < 9 ){ xnode = X_Node_getXNode( document.activeElement ); if( xnode ){ - xnode[ 'listen' ]( [ 'focus', 'blur' ], X_ViewPort_detectFocusForIE ); + xnode[ 'listenOnce' ]( [ 'focus', 'blur' ], X_ViewPort_detectFocusForIE ); //break; }; if( X_ViewPort_activeTimerID ){ @@ -308,6 +310,22 @@ X[ 'ViewPort' ] = { return X_ViewPort_baseFontSize = X_Node_fontSizeNode[ '_rawObject' ].offsetHeight; }; return X_ViewPort_baseFontSize; + }, + + /** + * キーボードイベントを受け付ける + * @alias X.ViewPort.isActive + */ + 'isActive' : function(){ + return X_ViewPort_active; + }, + + /** + * 可視である。iframe 内のhtmlも + * @alias X.ViewPort.isVisible + */ + 'isVisible' : function(){ + return X_ViewPort_active; } }; @@ -573,21 +591,21 @@ console.log( 'X.Dom dom:w3c=' + X_UA_DOM.W3C + ' ev:w3c=' + X_UA_EVENT.W3C ); if( X_UA_EVENT.W3C ){ X_ViewPort_document[ 'listenOnce' ]( 'DOMContentLoaded', X_TEMP.onDomContentLoaded ); } else -if( 6 <= X_UA[ 'IE' ] && X[ 'inHead' ] ){ +if( 6 <= X_UA[ 'IE' ] && X[ 'inHead' ] && !X_UA[ 'ieExeComError' ] ){ // standalone の除外 -> && !X_UA[ 'ieExeComError' ] // if this script in Head - //document.write( '' ); - //X_TEMP._script = document.getElementById( '__ie_onload' ); + document.write( '' ); + 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( '' ) ; + //document.getElementsByTagName( 'head' )[ 0 ].appendChild( X_TEMP._script ); X_TEMP._script.onreadystatechange = function(){ var s = X_TEMP._script; if( s && s.readyState === 'complete' ){ s.onreadystatechange = X_emptyFunction; s.onreadystatechange = null; - s.parentNode.removeChild( s ); + s.removeNode( true ); delete X_TEMP._script; X_TEMP.onDomContentLoaded && X_TEMP.onDomContentLoaded(); }; diff --git a/0.6.x/js/02_dom/02_XNodeFlags.js b/0.6.x/js/02_dom/02_XNodeFlags.js index ff3ac0f..0a9fad8 100644 --- a/0.6.x/js/02_dom/02_XNodeFlags.js +++ b/0.6.x/js/02_dom/02_XNodeFlags.js @@ -43,16 +43,21 @@ var X_NodeFlags_DESTROYED = 0x0, // http://modernizr.com/downloads/modernizr.js // Thanks to Erik Dahlstrom - X_NodeFlags_IS_SVG = document.createElementNS && document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' ).createSVGRect ? 2 << 25 : 0, + X_NodeFlags_IS_SVG = document.createElementNS && document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' )[ 'createSVGRect' ] ? 2 << 25 : 0, X_NodeFlags_IS_VML = ( function(){ - if( !X_UA[ 'ActiveX' ] || X_UA[ 'IE' ] < 5 || 9 < X_UA[ 'IE' ] ) return 0; + if( !X_UA[ 'ActiveX' ] || X_UA[ 'IE' ] < 5 || 9 < X_UA[ 'IE' ] || X_UA[ 'ieExeComError' ] ) return 0; // standalone の除外 -> X_UA[ 'ieExeComError' ] - document.write( '' ); + document.write( + '' + + '' ); - if( window[ 'vml' ] === 1 ){ - document.getElementById( 'vmltest' ).removeNode( true ); - return 2 << 26; + switch( window[ '__vml' ] ){ + case 2 : + document.getElementById( 'vmltest2' ).removeNode( true ); + case 1 : + document.getElementById( 'vmltest1' ).removeNode( true ); + return 2 << 26; }; return 0; })(), diff --git a/0.6.x/js/02_dom/04_XBoxModel.js b/0.6.x/js/02_dom/04_XBoxModel.js index acb0939..a609fc4 100644 --- a/0.6.x/js/02_dom/04_XBoxModel.js +++ b/0.6.x/js/02_dom/04_XBoxModel.js @@ -213,43 +213,49 @@ function X_Node_y(){ }; /** - * 要素の親要素に対する位置。 + * 要素の文書内の位置。引数に xnode を与えた場合、 * @alias Node.prototype.offset * @return {object} { x: {number}, y : {number} } * @example node.offset(); */ -function X_Node_offset( /* xnodeParent */ ){ - var flags = this[ '_flags' ], elm; +function X_Node_offset( xnode ){ + var flags = this[ '_flags' ], + offset = { x : 0, y : 0 }, + obj, parent, elm; - if( ( flags & X_NodeFlags_IN_TREE ) === 0 || flags & X_NodeFlags_STYLE_IS_DISPLAY_NONE ) return { x : 0, y : 0 }; - - if( X_Node_body === this || X_Node_html === this ){ - return { x : 0, y : 0 }; - }; + if( ( flags & X_NodeFlags_IN_TREE ) === 0 || flags & X_NodeFlags_STYLE_IS_DISPLAY_NONE ) return offset; + if( X_Node_body === this || X_Node_html === this ) return offset; + X_Node_updateTimerID && X_Node_startUpdate(); - + elm = this[ '_rawObject' ] || X_Node__ie4getRawNode && X_Node__ie4getRawNode( this ); - return elm ? X_Node_getPosition( elm ) : { x : 0, y : 0 }; + return elm ? X_Node_getPosition( elm ) : offset; }; // エレメントの座標取得 ~スクロール要素~ -// http://n-yagi.0r2.net/script/2009/06/post_14.html +// http://n-yagi.0r2.net/script/2009/07/post_16.html //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // エレメントの絶対座標を得たい //------------------------------------------------------------------------------ // 座標取得 var X_Node_getPosition = - document.documentElement && document.documentElement.getBoundingClientRect ? - function( el ){ - var pos = el.getBoundingClientRect(), - html = document.documentElement, - body = document.body; - return { x:(pos.left + (body.scrollLeft||html.scrollLeft) - html.clientLeft) - , y:(pos.top + (body.scrollTop||html.scrollTop) - html.clientTop) }; - } : + !X_UA[ 'IE4' ] && document.createElement( 'div' ).getBoundingClientRect ? + ( + document.compatMode === 'CSS1Compat' && !X_UA[ 'Webkit' ] ? function( el ){ + var pos = el.getBoundingClientRect(), + html = document.documentElement; + return { x:(pos.left + html.scrollLeft - html.clientLeft) + , y:(pos.top + html.scrollTop - html.clientTop) }; + } : + function( el ){ + var pos = el.getBoundingClientRect(); + return { x:(pos.left + window.pageXOffset) + , y:(pos.top + window.pageYOffset) }; + } + ) : X_UA[ 'Opera' ] < 10 ? function( el ){ var ex = 0; diff --git a/0.6.x/js/02_dom/05_XNodeAttr.js b/0.6.x/js/02_dom/05_XNodeAttr.js index a438590..6dcd5c7 100644 --- a/0.6.x/js/02_dom/05_XNodeAttr.js +++ b/0.6.x/js/02_dom/05_XNodeAttr.js @@ -241,10 +241,10 @@ function X_Node_Attr_setAttr( that, attrs, newAttrs, name, v ){ case 'ns' : case 'NS' : if( v === 'svg' || v === 'SVG' ){ - that[ '_flags' ] |= XX_NodeFlags_IS_SVG; + that[ '_flags' ] |= X_NodeFlags_IS_SVG; }; if( v === 'vml' || v === 'VML' ){ - that[ '_flags' ] |= XX_NodeFlags_IS_VML; + that[ '_flags' ] |= X_NodeFlags_IS_VML; }; return; diff --git a/0.6.x/js/02_dom/20_XNode.js b/0.6.x/js/02_dom/20_XNode.js index aad360f..b7f8ce9 100644 --- a/0.6.x/js/02_dom/20_XNode.js +++ b/0.6.x/js/02_dom/20_XNode.js @@ -1174,10 +1174,20 @@ function X_Node_text( text ){ * @example node.call( 'focus' ); */ function X_Node_call( name /*, opt_args... */ ){ - var l = arguments.length - 1, - v, raw, func, args, params, i; + var args = arguments, + l = args.length - 1, + v, raw, parent, body, + childX, childY, childW, childH, + parentW, parentH, + parentSX, parentSY, parentSW, parentSH, + visibleX, visibleY, visibleW, visibleH, + visiblePartX, visiblePartY, func, args, params, i; switch( name ){ + case 'isSVG' : + return !!( this[ '_flags' ] & X_NodeFlags_IS_SVG ); + case 'isVML' : + return !!( this[ '_flags' ] & X_NodeFlags_IS_VML ); case 'nodeType' : return this[ '_tag' ] ? 1 : 3; case 'outerHTML' : @@ -1196,28 +1206,79 @@ function X_Node_call( name /*, opt_args... */ ){ X_Node_updateTimerID && X_Node_startUpdate(); 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; + raw.scrollLeft = args[ 1 ] || 0; + raw.scrollTop = args[ 2 ] || 0; return; }; + if( name === 'inView' ){ + body = document.body; + child = raw; + visibleX = visibleY = visibleW = visibleH = 0; + while( child !== body ){ + parent = child.parentNode || child.parentElement; + parentH = parent.clientHeight; + parentW = parent.clientWidth; + parentSW = parent.scrollHeight; + parentSH = parent.scrollWidth; + // 親がスクロール領域を持つ + if( parentH < parentSH || parentW < parentSW ){ + childX = child.offsetLeft + visibleX; + childY = child.offsetTop + visibleY; + childW = visibleW || child.offsetWidth; + childH = visibleH || child.offsetHeight; + parentSX = parent.scrollLeft; + parentSY = parent.scrollTop; + // 子が表示領域内 + if( parentSY < childY + childH && + childY < parentSY + parentH && + parentSX < childX + childW && + childX < parentSX + parentW ){ + + // right:子の左側が見えている left:子の左側が見えている both:完全に見えている + visiblePartX = + childX < parentSX ? 'right' : + ( parentSX + parentW ) < ( childX + childW ) ? 'left' : 'both'; + visiblePartY = + childY < parentSY ? 'bottom' : + ( parentSY + parentH ) < ( childY + childH ) ? 'top' : 'both'; + + // 子が見える領域 + visibleX = visiblePartX === 'right' ? 0 : childX - parentSX; + visibleY = visiblePartX === 'bottom' ? 0 : childY - parentSY; + visibleW = + visiblePartX === 'both' ? childW : + visiblePartX === 'right' ? ( parentSX + parentW - childX ) : ( childX + childW - parentSX ); + visibleH = + visiblePartY === 'both' ? childH : + visiblePartY === 'bottom' ? ( parentSY + parentH - childY ) : ( childY + childH - parentSY ); + } else { + return { 'isInView' : false }; + }; + }; + child = parent; + }; + return { 'isInView' : true }; + }; + func = raw[ name ]; if( X_Type_isFunction( func ) ){ if( l ){ - args = X_Array_copy( arguments ); + args = X_Array_copy( args ); args.shift(); return func.apply( raw, args ); }; return raw[ name ](); } else - if( X_Type_isUnknown( func ) || ( X_UA[ 'IE' ] < 9 && X_Type_isObject( func ) ) ){ + if( X_UA[ 'IE' ] < 9 && ( X_Type_isUnknown( func ) || X_Type_isObject( func ) ) ){ // typeof func === unknown に対策 // http://la.ma.la/blog/diary_200509031529.htm if( l ){ - args = X_Array_copy( arguments ); + args = X_Array_copy( args ); args.shift(); params = []; @@ -1412,7 +1473,7 @@ var X_Node__commitUpdate = '>' ].join( '' ) ); } else { if( that[ '_flags' ] & X_NodeFlags_IS_SVG ){ - that[ '_rawObject' ] = elm = document.createElementNS( 'http://www.w3.org/2000/svg', that[ '_tag' ] ); + that[ '_rawObject' ] = elm = document.createElementNS( 'http://www.w3.org/2000/svg', that[ '_tag' ].toLowerCase() ); } else { that[ '_rawObject' ] = elm = document.createElement( that[ '_tag' ] ); }; @@ -1619,11 +1680,21 @@ var X_Node__updateRawNode = }; // id if( that[ '_flags' ] & X_NodeFlags_DIRTY_ID ){ - that[ '_id' ] ? ( elm.id = that[ '_id' ] ) : ( elm.id && elm.removeAttribute( 'id' ) ); + that[ '_id' ] ? + ( ( that[ '_flags' ] & X_NodeFlags_IS_SVG ) ? + elm.setAttribute( 'id', that[ '_id' ] ) : + ( elm.id = that[ '_id' ] ) + ) : + ( elm.id && elm.removeAttribute( 'id' ) ); }; // className if( that[ '_flags' ] & X_NodeFlags_DIRTY_CLASSNAME ){ - that[ '_className' ] ? ( elm.className = that[ '_className' ] ) : ( elm.className && elm.removeAttribute( X_UA[ 'IE' ] < 8 ? 'className' : 'class' ) ); // className は ie7- + that[ '_className' ] ? + ( ( that[ '_flags' ] & X_NodeFlags_IS_SVG ) ? + elm.setAttribute( 'class', that[ '_className' ] ) : + ( elm.className = that[ '_className' ] ) + ) : + ( elm.className && elm.removeAttribute( X_UA[ 'IE' ] < 8 ? 'className' : 'class' ) ); // className は ie7- }; // attr @@ -1665,7 +1736,10 @@ var X_Node__updateRawNode = // TODO IE では input, なぜか button, object も type, name の変更が出来ない、同値で置き換えようとしても不可 v === undefined ? elm.removeAttribute( rename[ k ] || k ) : - ( elm[ rename[ k ] || k ] = X_Node_Attr_noValue[ k ] ? k : v ); + ( ( that[ '_flags' ] & X_NodeFlags_IS_SVG ) ? + elm.setAttribute( k, v ) : + ( elm[ rename[ k ] || k ] = X_Node_Attr_noValue[ k ] ? k : v ) + ); }; delete that[ '_newAttrs' ]; }; diff --git a/0.6.x/js/05_util/04_XXML.js b/0.6.x/js/05_util/04_XXML.js index 6ef1908..39e2b0c 100644 --- a/0.6.x/js/05_util/04_XXML.js +++ b/0.6.x/js/05_util/04_XXML.js @@ -315,7 +315,7 @@ function XMLWrapper_val( queryString, type ){ for( i = 0, n = -1, l = xmlList.length; i < l; ++i ){ xml = xmlList[ i ]; - attr = elem.getAttribute( key, 2 ); + attr = xml.getAttribute( key, 2 ); flag = attr != null;// && ( !useName || attr !== '' ); if( flag && op ){ //if( toLower ) attr = attr.toLowerCase(); diff --git a/0.6.x/js/06_net/00_XNet.js b/0.6.x/js/06_net/00_XNet.js index d69d68a..af64b4d 100644 --- a/0.6.x/js/06_net/00_XNet.js +++ b/0.6.x/js/06_net/00_XNet.js @@ -299,8 +299,11 @@ function X_NET_shiftQueue(){ X_NET_currentQueue = X_NET_currentWrapper = X_NET_currentData = null; }; + console.log( '■■------------ X_NET_shiftQueue ' + X_NET_QUEUE_LIST.length ); + if( !X_NET_QUEUE_LIST.length ) return; + X_NET_currentQueue = X_NET_QUEUE_LIST.shift(); X_NET_currentData = X_Pair_get( X_NET_currentQueue ); diff --git a/0.6.x/js/06_net/04_XNetImage.js b/0.6.x/js/06_net/04_XNetImage.js index c7d95d5..63174a4 100644 --- a/0.6.x/js/06_net/04_XNetImage.js +++ b/0.6.x/js/06_net/04_XNetImage.js @@ -65,6 +65,8 @@ X_TEMP.X_NET_Image_params = { }, reset : function(){ + 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 = '' ); this[ '_rawObject' ].src = ''; @@ -82,6 +84,7 @@ function X_NET_Image_detect(){ if( raw && raw.complete ){ this._busy = false; this.finish = true; + console.log( 'X.Net.Image:detect ' + raw.width ); if( raw.width ) return; X_Timer_remove( this.timerID ); this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR ); @@ -97,6 +100,8 @@ function X_NET_Image_detect(){ function X_NET_Image_handleEvent( e ){ var size; + console.log( 'X.Net.Image:handleEvent ' + e.type ); + switch( e.type ){ case 'error' : //case 'abort' : // TODO ?? diff --git a/0.6.x/js/07_audio/01_XWebAudio.js b/0.6.x/js/07_audio/01_XWebAudio.js index f1bc2bd..08eb781 100644 --- a/0.6.x/js/07_audio/01_XWebAudio.js +++ b/0.6.x/js/07_audio/01_XWebAudio.js @@ -2,6 +2,8 @@ var X_Audio_WebAudio_context = !X_UA[ 'iPhone_4s' ] && !X_UA[ 'iPad_2Mini1' ] && !X_UA[ 'iPod_4' ] && // TODO なんで fennec を禁止? !( X_UA[ 'Gecko' ] && X_UA[ 'Android' ] ) && + // Firefox40.0.5 + Windows8 で音声が鳴らない + !( X_UA[ 'Gecko' ] === 40 && X_UA[ 'Windows' ] ) && ( window[ 'AudioContext' ] || window[ 'webkitAudioContext' ] ), X_Audio_BUFFER_LIST = [], X_Audio_WebAudioWrapper, @@ -292,8 +294,8 @@ if( X_Audio_WebAudio_context ){ if( time < 0 ) return; } else { if( time < 0 ){ - console.log( '> onEnd crt:' + ( X_Audio_WebAudio_context.currentTime * 1000 ) + ' startTime:' + this._startTime + - ' from:' + this._startPos + ' to:' + this._endPosition ); + //console.log( '> onEnd crt:' + ( X_Audio_WebAudio_context.currentTime * 1000 ) + ' startTime:' + this._startTime + + // ' from:' + this._startPos + ' to:' + this._endPosition ); this._timerID = X_Timer_once( -time, this, this._onEnded ); return; }; diff --git a/0.6.x/js/07_audio/02_XHTMLAudio.js b/0.6.x/js/07_audio/02_XHTMLAudio.js index dd71bde..0a8060d 100644 --- a/0.6.x/js/07_audio/02_XHTMLAudio.js +++ b/0.6.x/js/07_audio/02_XHTMLAudio.js @@ -12,7 +12,6 @@ var X_Audio_HTMLAudio_playTrigger = // Android 2.3.5(SBM101SH) では stalled は発生しない,,, ので必ず loadeddata もチェックする X_UA[ 'AndroidBrowser' ] ? 'stalled' : X_UA[ 'OperaMobile' ] || X_UA[ 'OperaTablet' ] ? 'loadeddata' : - //X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ? 'canplay' : 'loadeddata', //'canplay', X_Audio_HTMLAudioWrapper, X_Audio_constructor = window[ 'Audio' ] || window.HTMLAudioElement, @@ -20,7 +19,7 @@ var X_Audio_HTMLAudio_playTrigger = // onended イベント時に再生を継続する場合、audio.play() を呼ぶ必要がある X_Audio_HTMLAudioWrapper_needPlayOnended = !X_UA[ 'AndroidChromeBrowser' ] && X_UA[ 'AndroidBrowser' ], // 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' ] ), + X_Audio_HTMLAudioWrapper_currentTimeFix = !!X_UA[ 'OperaMobile' ] || !!X_UA[ 'OperaTablet' ], // Android1.6+MobileOpera12では無理っぽい、、、 X_Audio_HTMLAudioWrapper_badOperaAndroid = X_Audio_HTMLAudioWrapper_currentTimeFix && X_UA[ 'Android' ] < 2, @@ -298,7 +297,7 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){ if( this.playing ){ end = X_AudioWrapper_getEndTime( this ) + this.shortPlayFix; now = this.getActualCurrentTime(); - console.log( now + ' / ' + end ); + //console.log( now + ' / ' + end ); if( 0 + end <= 0 + now ){ // 0+ なぜか iem9 で必要,,, if( this.autoLoop ){ if( !( this.target[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_CALLBACK_PREVENT_DEFAULT ) ){ @@ -373,7 +372,7 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){ }; if( !loaded && type ){ - console.log( '(2) ' + e.type + ' d:' + ( this.duration | 0 ) ); + // console.log( '(2) ' + e.type + ' d:' + ( this.duration | 0 ) ); this.target[ 'dispatch' ]( type ); type === X_EVENT_ERROR && this[ 'kill' ](); }; @@ -448,6 +447,8 @@ if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){ actualPause : function(){ if( !this.playing ) return; + console.log( '[HTMLAudio] pause' ); + this.seekTime = this.getActualCurrentTime(); delete this._playTime; diff --git a/0.6.x/js/07_audio/10_XAudioSprite.js b/0.6.x/js/07_audio/10_XAudioSprite.js index 53f5ed0..0aa4206 100644 --- a/0.6.x/js/07_audio/10_XAudioSprite.js +++ b/0.6.x/js/07_audio/10_XAudioSprite.js @@ -11,8 +11,8 @@ var X_Audio_Sprite_shouldUse = window.HTMLAudioElement && ( X_UA[ 'iOS' ] false, //X_UA[ 'AndroidChromeBrowser' ], X_Audio_Sprite_needTouchAndroid = X_UA[ 'AndroidChromeBrowser' ] && !X_Audio_WebAudioWrapper, X_Audio_Sprite_needTouchFirst = X_UA[ 'iOS' ] || X_Audio_Sprite_needTouchAndroid || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ), - X_Audio_Sprite_disableMultiTrack = ( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) || ( !X_UA[ 'AndroidChromeBrowser' ] && X_UA[ 'AndroidBrowser4' ] ) || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ), - X_Audio_Sprite_enableVolume = window.HTMLAudioElement && ( !X_UA[ 'iOS' ] && !X_UA[ 'AndroidBrowser' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ), // TODO fennec は 25以上 + X_Audio_Sprite_disableMultiTrack = ( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) || ( !X_UA[ 'AndroidChromeBrowser' ] && X_UA[ 'AndroidBrowser4' ] ) || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE' ] < 12 ), + X_Audio_Sprite_enableVolume = window.HTMLAudioElement && ( !X_UA[ 'iOS' ] && !X_UA[ 'AndroidBrowser' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ), // TODO fennec は 25以上 // http://tukumemo.com/html5-audio-sp/ // iOS6、Android4.1から同時再生が可能になりました。 X_Audio_Sprite_maxTracks = X_Audio_Sprite_useVideoForMulti ? 2 : X_Audio_Sprite_disableMultiTrack ? 1 : 9, @@ -256,11 +256,12 @@ X_Audio_Sprite_members = { 'seek' : function( uid, position ){ var track = X_Audio_Sprite_TEMP.tracks[ uid ], - end; + end, strat; if( track ){ delete track.seekTime; - end = X_AudioWrapper_getEndTime( track ); - position <= end && X_AudioWrapper_getStartTime( track, end ) <= position && track.seek( postion ); + end = X_AudioWrapper_getEndTime( track ); + start = X_AudioWrapper_getStartTime( track, end ); + 0 <= position && position <= ( end - start ) && track.seek( start + position ); }; return this; }, @@ -321,7 +322,7 @@ function X_AudioSprite_backendHandler( e ){ this[ 'source' ] = src = e[ 'source' ]; this[ 'backendName' ] = name = backend.backendName; - console.log( i + ' / ' + X_Audio_Sprite_numTracks ); + //console.log( i + ' / ' + X_Audio_Sprite_numTracks ); for( i = 0; i < X_Audio_Sprite_numTracks; ++i ){ if( X_Audio_Sprite_useVideo || ( i === 1 && X_Audio_Sprite_useVideoForMulti ) ){ @@ -332,8 +333,8 @@ function X_AudioSprite_backendHandler( e ){ X_Audio_Sprite_TEMP.tracks.push( last = backend.klass( null, e[ 'source' ], option ) ); - console.dir( backend ); - console.dir( last ); + //console.dir( backend ); + //console.dir( last ); }; _e = {