console.log( '>> Gecko : ' + X_UA[ 'Gecko' ] );\r
};\r
\r
- if( dua.indexOf( 'Linux; U; Android ' ) !== -1 || dua.indexOf( 'Linux; Android ' ) !== -1 ){\r
+ if( ( dua.indexOf( 'Linux; U; Android ' ) !== -1 || dua.indexOf( 'Linux; Android ' ) !== -1 ) &&\r
+ ( dua.indexOf( 'Chrome\/' ) === -1 || dua.indexOf( 'Version\/' ) !== -1 ) ){ // Chrome/ を含まない または Version/ を含む\r
/**\r
* Android 標準ブラウザ\r
* @alias X.UA.AndroidBrowser\r
'Super' : function( var_args ){\r
var sClass = this,\r
i = X_Class_CALLING_SUPER.indexOf( sClass ),\r
- n = -1,\r
l, sList, def, sConst, ret;\r
\r
if( i === -1 ){\r
X_Class_CALLING_SUPER[ l = X_Class_CALLING_SUPER.length ] = sClass;\r
X_Class_CALL_SUPER_STACK[ l ] = sList = [];\r
+ def = X_Class_getClassDef( sClass );\r
+ if( !def.Constructor ) sClass = def.SuperClass;// 現在のクラスがコンストラクタを持たない場合 SuperConstructor を new で呼んでいるため再び呼ばないようにする\r
} else {\r
sList = X_Class_CALL_SUPER_STACK[ i ];\r
};\r
def = X_Class_getClassDef( sClass );\r
sClass = def.SuperClass;\r
sConst = def.SuperConstructor;\r
- if( sConst && sList[ ++n ] !== sConst ){\r
- sList[ n ] = sConst;\r
+ if( !sConst ) break;\r
+ if( sList.indexOf( sConst ) === -1 ){\r
+ sList[ sList.length ] = sConst;\r
ret = sConst.apply( this, arguments );\r
--sList.length;\r
if( !sList.length ){\r
\r
1 < i && list.sort( X_Timer_compareQueue );\r
\r
- n = list[ i - 1 ].last;\r
+ n = list[ 0 ].last;\r
\r
if( n < X_Timer_waitTime || X_Timer_timerId === 0 ){\r
if( X_Timer_timerId ){\r
\r
// 大きい -> 小さい\r
function X_Timer_compareQueue( a, b ){\r
- return a.last < b.last ? 1 : a.last === b.last ? 0 : -1;\r
+ return a.last < b.last ? -1 : a.last === b.last ? 0 : 1;\r
};\r
\r
// http://havelog.ayumusato.com/develop/javascript/e528-ios6_scrolling_timer_notcall.html\r
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,
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' :
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 ){
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;
}
};
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( '<script id="__ie_onload" defer src="javascript:void(0)"></script>' );
- //X_TEMP._script = document.getElementById( '__ie_onload' );
+ document.write( '<script id=__ieonload defer src=javascript:void(0)></script>' );
+ X_TEMP._script = document.getElementById( '__ieonload' );
// 上のコードはスタンドアローン版ie6でエラー
- X_TEMP._script = document.createElement( '<script id="__ie_onload" defer src="javascript:void(0)"></script>' ) ;
- document.getElementsByTagName("head")[ 0 ].appendChild( X_TEMP._script );
+ //X_TEMP._script = document.createElement( '<script id=__ieonload defer src=javascript:void(0)></script>' ) ;
+ //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();
};
\r
// http://modernizr.com/downloads/modernizr.js\r
// Thanks to Erik Dahlstrom\r
- X_NodeFlags_IS_SVG = document.createElementNS && document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' ).createSVGRect ? 2 << 25 : 0,\r
+ X_NodeFlags_IS_SVG = document.createElementNS && document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' )[ 'createSVGRect' ] ? 2 << 25 : 0,\r
X_NodeFlags_IS_VML =\r
( function(){\r
- if( !X_UA[ 'ActiveX' ] || X_UA[ 'IE' ] < 5 || 9 < X_UA[ 'IE' ] ) return 0;\r
+ if( !X_UA[ 'ActiveX' ] || X_UA[ 'IE' ] < 5 || 9 < X_UA[ 'IE' ] || X_UA[ 'ieExeComError' ] ) return 0; // standalone の除外 -> X_UA[ 'ieExeComError' ]\r
\r
- document.write( '<!--[if gte vml 1]><script id=vmltest>window.vml=1;<\/script><![endif]-->' );\r
+ document.write(\r
+ '<!--[if vml]><script id=vmltest1>__vml=1;</script><![endif]-->' +\r
+ '<!--[if gte vml 1]><script id=vmltest2>__vml=2;</script><![endif]-->' );\r
\r
- if( window[ 'vml' ] === 1 ){\r
- document.getElementById( 'vmltest' ).removeNode( true );\r
- return 2 << 26;\r
+ switch( window[ '__vml' ] ){\r
+ case 2 :\r
+ document.getElementById( 'vmltest2' ).removeNode( true );\r
+ case 1 :\r
+ document.getElementById( 'vmltest1' ).removeNode( true );\r
+ return 2 << 26;\r
};\r
return 0;\r
})(),\r
};\r
\r
/**\r
- * 要素の親要素に対する位置。\r
+ * 要素の文書内の位置。引数に xnode を与えた場合、\r
* @alias Node.prototype.offset\r
* @return {object} { x: {number}, y : {number} }\r
* @example node.offset();\r
*/\r
-function X_Node_offset( /* xnodeParent */ ){\r
- var flags = this[ '_flags' ], elm;\r
+function X_Node_offset( xnode ){\r
+ var flags = this[ '_flags' ],\r
+ offset = { x : 0, y : 0 },\r
+ obj, parent, elm;\r
\r
- if( ( flags & X_NodeFlags_IN_TREE ) === 0 || flags & X_NodeFlags_STYLE_IS_DISPLAY_NONE ) return { x : 0, y : 0 };\r
- \r
- if( X_Node_body === this || X_Node_html === this ){\r
- return { x : 0, y : 0 };\r
- };\r
+ if( ( flags & X_NodeFlags_IN_TREE ) === 0 || flags & X_NodeFlags_STYLE_IS_DISPLAY_NONE ) return offset;\r
\r
+ if( X_Node_body === this || X_Node_html === this ) return offset;\r
+\r
X_Node_updateTimerID && X_Node_startUpdate();\r
- \r
+\r
elm = this[ '_rawObject' ] || X_Node__ie4getRawNode && X_Node__ie4getRawNode( this );\r
\r
- return elm ? X_Node_getPosition( elm ) : { x : 0, y : 0 };\r
+ return elm ? X_Node_getPosition( elm ) : offset;\r
};\r
\r
// エレメントの座標取得 ~スクロール要素~\r
-// http://n-yagi.0r2.net/script/2009/06/post_14.html\r
+// http://n-yagi.0r2.net/script/2009/07/post_16.html\r
\r
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\r
// エレメントの絶対座標を得たい\r
//------------------------------------------------------------------------------\r
// 座標取得\r
var X_Node_getPosition =\r
- document.documentElement && document.documentElement.getBoundingClientRect ?\r
- function( el ){\r
- var pos = el.getBoundingClientRect(),\r
- html = document.documentElement,\r
- body = document.body;\r
- return { x:(pos.left + (body.scrollLeft||html.scrollLeft) - html.clientLeft)\r
- , y:(pos.top + (body.scrollTop||html.scrollTop) - html.clientTop) };\r
- } :\r
+ !X_UA[ 'IE4' ] && document.createElement( 'div' ).getBoundingClientRect ?\r
+ (\r
+ document.compatMode === 'CSS1Compat' && !X_UA[ 'Webkit' ] ? function( el ){\r
+ var pos = el.getBoundingClientRect(),\r
+ html = document.documentElement;\r
+ return { x:(pos.left + html.scrollLeft - html.clientLeft)\r
+ , y:(pos.top + html.scrollTop - html.clientTop) };\r
+ } :\r
+ function( el ){\r
+ var pos = el.getBoundingClientRect();\r
+ return { x:(pos.left + window.pageXOffset)\r
+ , y:(pos.top + window.pageYOffset) };\r
+ }\r
+ ) :\r
X_UA[ 'Opera' ] < 10 ?\r
function( el ){\r
var ex = 0;\r
case 'ns' :\r
case 'NS' :\r
if( v === 'svg' || v === 'SVG' ){\r
- that[ '_flags' ] |= XX_NodeFlags_IS_SVG;\r
+ that[ '_flags' ] |= X_NodeFlags_IS_SVG;\r
};\r
if( v === 'vml' || v === 'VML' ){\r
- that[ '_flags' ] |= XX_NodeFlags_IS_VML;\r
+ that[ '_flags' ] |= X_NodeFlags_IS_VML;\r
};\r
return;\r
\r
* @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' :
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 = [];
'>' ].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' ] );
};
};
// 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
// 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' ];
};
\r
for( i = 0, n = -1, l = xmlList.length; i < l; ++i ){\r
xml = xmlList[ i ];\r
- attr = elem.getAttribute( key, 2 );\r
+ attr = xml.getAttribute( key, 2 );\r
flag = attr != null;// && ( !useName || attr !== '' );\r
if( flag && op ){\r
//if( toLower ) attr = attr.toLowerCase();\r
X_NET_currentQueue = X_NET_currentWrapper = X_NET_currentData = null;\r
};\r
\r
+ console.log( '■■------------ X_NET_shiftQueue ' + X_NET_QUEUE_LIST.length );\r
+ \r
if( !X_NET_QUEUE_LIST.length ) return;\r
\r
+\r
X_NET_currentQueue = X_NET_QUEUE_LIST.shift();\r
X_NET_currentData = X_Pair_get( X_NET_currentQueue );\r
\r
},\r
\r
reset : function(){\r
+ console.log( 'X.Net.Image:reset ' + this.abspath + ' timerID:' + this.timerID );\r
+ \r
this.timerID && X_Timer_remove( this.timerID );\r
//X_Net_Image_isElement ? this[ '_rawObject' ].removeAttribute( 'src' ) : ( this[ '_rawObject' ].src = '' );\r
this[ '_rawObject' ].src = '';\r
if( raw && raw.complete ){\r
this._busy = false;\r
this.finish = true;\r
+ console.log( 'X.Net.Image:detect ' + raw.width );\r
if( raw.width ) return;\r
X_Timer_remove( this.timerID );\r
this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
function X_NET_Image_handleEvent( e ){\r
var size;\r
\r
+ console.log( 'X.Net.Image:handleEvent ' + e.type );\r
+ \r
switch( e.type ){\r
case 'error' :\r
//case 'abort' : // TODO ??\r
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,
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;
};
// Android 2.3.5(SBM101SH) では stalled は発生しない,,, ので必ず loadeddata もチェックする\r
X_UA[ 'AndroidBrowser' ] ? 'stalled' :\r
X_UA[ 'OperaMobile' ] || X_UA[ 'OperaTablet' ] ? 'loadeddata' :\r
- //X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ? 'canplay' :\r
'loadeddata', //'canplay',\r
X_Audio_HTMLAudioWrapper,\r
X_Audio_constructor = window[ 'Audio' ] || window.HTMLAudioElement,\r
// onended イベント時に再生を継続する場合、audio.play() を呼ぶ必要がある\r
X_Audio_HTMLAudioWrapper_needPlayOnended = !X_UA[ 'AndroidChromeBrowser' ] && X_UA[ 'AndroidBrowser' ],\r
// Opera Mobile 12 android4.4.4 & 2.3.5 は 2回目以降の currentTime へのセットで currentTime が更新されなくなるため、タイマーを使用する\r
- X_Audio_HTMLAudioWrapper_currentTimeFix = !!X_UA[ 'OperaMobile' ] || !!X_UA[ 'OperaTablet' ], // || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ),\r
+ X_Audio_HTMLAudioWrapper_currentTimeFix = !!X_UA[ 'OperaMobile' ] || !!X_UA[ 'OperaTablet' ],\r
// Android1.6+MobileOpera12では無理っぽい、、、\r
X_Audio_HTMLAudioWrapper_badOperaAndroid = X_Audio_HTMLAudioWrapper_currentTimeFix && X_UA[ 'Android' ] < 2,\r
\r
if( this.playing ){\r
end = X_AudioWrapper_getEndTime( this ) + this.shortPlayFix;\r
now = this.getActualCurrentTime();\r
- console.log( now + ' / ' + end );\r
+ //console.log( now + ' / ' + end );\r
if( 0 + end <= 0 + now ){ // 0+ なぜか iem9 で必要,,,\r
if( this.autoLoop ){\r
if( !( this.target[ 'dispatch' ]( X_EVENT_MEDIA_BEFORE_LOOP ) & X_CALLBACK_PREVENT_DEFAULT ) ){\r
};\r
\r
if( !loaded && type ){\r
- console.log( '(2) ' + e.type + ' d:' + ( this.duration | 0 ) );\r
+ // console.log( '(2) ' + e.type + ' d:' + ( this.duration | 0 ) );\r
this.target[ 'dispatch' ]( type );\r
type === X_EVENT_ERROR && this[ 'kill' ]();\r
};\r
actualPause : function(){\r
if( !this.playing ) return;\r
\r
+ console.log( '[HTMLAudio] pause' );\r
+ \r
this.seekTime = this.getActualCurrentTime();\r
\r
delete this._playTime;\r
false, //X_UA[ 'AndroidChromeBrowser' ],\r
X_Audio_Sprite_needTouchAndroid = X_UA[ 'AndroidChromeBrowser' ] && !X_Audio_WebAudioWrapper,\r
X_Audio_Sprite_needTouchFirst = X_UA[ 'iOS' ] || X_Audio_Sprite_needTouchAndroid || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ),\r
- X_Audio_Sprite_disableMultiTrack = ( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) || ( !X_UA[ 'AndroidChromeBrowser' ] && X_UA[ 'AndroidBrowser4' ] ) || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ),\r
- X_Audio_Sprite_enableVolume = window.HTMLAudioElement && ( !X_UA[ 'iOS' ] && !X_UA[ 'AndroidBrowser' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ), // TODO fennec は 25以上\r
+ X_Audio_Sprite_disableMultiTrack = ( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) || ( !X_UA[ 'AndroidChromeBrowser' ] && X_UA[ 'AndroidBrowser4' ] ) || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE' ] < 12 ),\r
+ X_Audio_Sprite_enableVolume = window.HTMLAudioElement && ( !X_UA[ 'iOS' ] && !X_UA[ 'AndroidBrowser' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ), // TODO fennec は 25以上\r
// http://tukumemo.com/html5-audio-sp/\r
// iOS6、Android4.1から同時再生が可能になりました。\r
X_Audio_Sprite_maxTracks = X_Audio_Sprite_useVideoForMulti ? 2 : X_Audio_Sprite_disableMultiTrack ? 1 : 9,\r
\r
'seek' : function( uid, position ){\r
var track = X_Audio_Sprite_TEMP.tracks[ uid ],\r
- end;\r
+ end, strat;\r
if( track ){\r
delete track.seekTime;\r
- end = X_AudioWrapper_getEndTime( track );\r
- position <= end && X_AudioWrapper_getStartTime( track, end ) <= position && track.seek( postion );\r
+ end = X_AudioWrapper_getEndTime( track );\r
+ start = X_AudioWrapper_getStartTime( track, end );\r
+ 0 <= position && position <= ( end - start ) && track.seek( start + position );\r
};\r
return this;\r
},\r
this[ 'source' ] = src = e[ 'source' ];\r
this[ 'backendName' ] = name = backend.backendName;\r
\r
- console.log( i + ' / ' + X_Audio_Sprite_numTracks );\r
+ //console.log( i + ' / ' + X_Audio_Sprite_numTracks );\r
\r
for( i = 0; i < X_Audio_Sprite_numTracks; ++i ){\r
if( X_Audio_Sprite_useVideo || ( i === 1 && X_Audio_Sprite_useVideoForMulti ) ){\r
X_Audio_Sprite_TEMP.tracks.push( last = backend.klass( null, e[ 'source' ], option ) );\r
\r
\r
- console.dir( backend );\r
- console.dir( last );\r
+ //console.dir( backend );\r
+ //console.dir( last );\r
};\r
\r
_e = {\r