};\r
};\r
\r
-X.VERSION = '0.6.103';\r
+X.VERSION = '0.6.127';\r
\r
X.bootTime = + new Date;\r
\r
// ------------------------------------------------------------------------- //\r
X.UA = X_UA;\r
\r
-\r
+// TODO 構文のサポート instanceof, in, try catch\r
\r
if( X_UA.IE < 7 ){ // error @ NN7.2\r
// bonus: hotfix for IE6 SP1 (bug KB823727)\r
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(){
_rect : null, // \r
_fontSize : 0,\r
\r
+ length : 1,\r
parent : null, // remove された枝も親子構造は維持している。\r
_xnodes : null, // Array.<Node>\r
\r
_tag : '',\r
_text : '',\r
- _id : '',\r
- _className : '',\r
+ _id : '', //\r
+ _className : '', //\r
\r
_attrs : null, // see X_Node_Attr\r
_newAttrs : null,\r
* TODO Node の継承ができない!\r
*/\r
Constructor : function( v ){\r
- var css, xnodes, xnode, parent, uid = X_Node_CHASHE.length;\r
+ var uid = X_Node_CHASHE.length,\r
+ css, xnodes, xnode, parent;\r
\r
if( X_Node_newByTag ){\r
X_Node_newByTag = false;\r
this._tag = v.toUpperCase();\r
- this._flags |= X_Node_State.EXIST;\r
arguments[ 1 ] && this.attr( arguments[ 1 ] );\r
css = arguments[ 2 ];\r
css && this[ X.Type.isString( css ) ? 'cssText' : 'css' ]( css );\r
if( X_Node_newByText ){\r
X_Node_newByText = false;\r
this._text = v;\r
- this._flags |= X_Node_State.EXIST;\r
} else {\r
if( 1 < arguments.length ) return new X_NodeList( arguments );\r
if( X.Type.isArray( v ) && v.length ) return new X_NodeList( v );\r
if( xnode = X_Node_getXNode( v ) ) return xnode;\r
// v.parentNode || v.parentElement : dom1 || dom0\r
this.parent = ( parent = v.parentNode || v.parentElement ) && parent.tagName /* ie7- */ && X_Node_getXNode( parent );\r
- if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){\r
- this._flags |= X_Node_State.IN_TREE;\r
- };\r
this._rawObject = v;\r
- this._flags |= X_Node_State.EXIST;\r
this._tag = v.tagName.toUpperCase();\r
this._id = v.id;\r
this._className = v.className;\r
this.cssText( v.style.cssText );\r
this._flags &= X_Node_BitMask_RESET_DIRTY; // X_Node_State.DIRTY_CSS を落とす\r
\r
- // TODO attr の回収は不可能、、、\r
+ // TODO attr の回収は不可能、、、?\r
if( X_UA_DOM.IE4 ){\r
v.setAttribute( 'UID', '' + uid );\r
} else {\r
case X_Node_TYPE.RAW_TEXT :\r
if( xnode = X_Node_getXNode( v ) ) return xnode;\r
this.parent = X_Node_getXNode( v.parentNode );\r
- if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){\r
- this._flags |= X_Node_State.IN_TREE;\r
- };\r
this._rawObject = v;\r
- this._flags |= X_Node_State.EXIST;\r
this._text = v.data;\r
v.UID = uid;\r
break;\r
return X_Node_none;\r
\r
default :\r
+ this.length = 0;\r
if( X_Node_none ) return X_Node_none;\r
return;\r
};\r
};\r
\r
+ if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){\r
+ this._flags |= X_Node_State.IN_TREE;\r
+ };\r
+ this._flags |= X_Node_State.EXIST;\r
X_Node_CHASHE[ this._uid = uid ] = this;\r
},\r
\r
\r
// setter\r
if( this._className === v ) return this;\r
- if( !v || typeof v !== 'string' ){\r
+ if( !v || !X.Type.isString( v ) ){\r
delete this._className;\r
} else {\r
// cleanup\r
raw = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
if( !raw ) return;\r
\r
+ if( name === 'scrollTo' ){\r
+ raw.scrollLeft = arguments[ 1 ] || 0;\r
+ raw.scrollTop = arguments[ 2 ] || 0;\r
+ return;\r
+ };\r
+ \r
func = raw[ name ];\r
if( X.Type.isFunction( func ) ){\r
if( l ){\r
return nextElement;\r
};\r
elm && ( elm.style.display = 'none' );\r
- return elm || nextElement;\r
- }; \r
+ return elm.nextSibling === nextElement ? elm : nextElement;\r
+ };\r
\r
// 5. ie5 非表示fixフラグ\r
accumulatedFlags |= that._flags;\r
if( !that._tag ){\r
that._flags &= X_Node_BitMask_RESET_DIRTY;\r
that._rawObject = elm = document.createTextNode( X_String_chrReferanceTo( that._text ) );\r
+ if( !X.UA.IE ){\r
+ elm.UID = that._uid;\r
+ };\r
} else\r
if( X_Node_strictElmCreation ){\r
that._flags & X_Node_State.DIRTY_CSS && X_Node_CSS_objToCssText( that, true );\r
nextElement ?\r
parentElement.insertBefore( elm, nextElement ) :\r
parentElement.appendChild( elm );\r
- //elm.UID = that._uid;\r
- // src の onload があるので先ではないか?\r
- // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか?\r
- X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
};\r
\r
if( that._tag ){\r
+ // src の onload があるので先ではないか?\r
+ // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか?\r
+ X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰 \r
+ \r
if( X_Node_documentFragment ){\r
//( frg = X_Node_documentFragment ).appendChild( elm );\r
};\r
} else {\r
elm.UID = that._uid;\r
that._newAttrs = that._attrs;\r
+ that._flags &= X_Node_BitMask_RESET_DIRTY;\r
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;\r
\r
// http://outcloud.blogspot.jp/2010/09/iframe.html\r
parentElement.insertBefore( elm, nextElement ) :\r
parentElement.appendChild( elm );\r
\r
- X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
+ if( X_UA.Gecko && that._tag === 'IFRAME' && elm.contentWindow ){\r
+ // tree に追加されるまで contentWindow は存在しない。\r
+ elm.contentWindow.location.replace = elm.src;\r
+ };\r
};\r
\r
return elm;\r
return prevElement;\r
};\r
};\r
- return elm || prevElement;\r
+ return elm || nextElement;\r
};\r
\r
if( !elm ){\r
};\r
// className\r
if( that._flags & X_Node_State.DIRTY_CLASSNAME ){\r
- that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X_UA.IE5678 ? 'className' : 'class' ) ); // className は ie7-? \r
+ that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X_UA.IE < 8 ? 'className' : 'class' ) ); // className は ie7- \r
};\r
\r
// attr\r
case 'IFRAMEsrc' :\r
// http://outcloud.blogspot.jp/2010/09/iframe.html\r
// この問題は firefox3.6 で確認\r
- if( X_UA.Gecko ){\r
+ if( X_UA.Gecko && elm.contentWindow ){\r
elm.contentWindow.location.replace = elm.src = v || '';\r
continue;\r
};\r
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 = {};
X_ViewPort.unlisten( X.Event.AFTER_UPDATE, xnode, X_Node_Anime_gpuReleased );\r
\r
xnode.css({\r
- willChange : X_Node_Anime_transitionProps + ',opacity,width,height',\r
+ //willChange : X_Node_Anime_transitionProps + ',opacity,width,height',\r
backfaceVisibility : 'hidden',\r
transitionTimingFunction : obj.easing.style,\r
transitionDelay : '0s' // 0.001 にすると transitionend のタイミングが狂う、、、\r
\r
case 10 :\r
// アニメーションは停止・GPUレイヤーは解除していない(再アニメーションに備えて待機)\r
- X_Node_Anime_clearTransition( xnode ); // TODO X_Node_Anime_releaseGPULayer に移動?\r
+ //X_Node_Anime_clearTransition( xnode ); // TODO X_Node_Anime_releaseGPULayer に移動?\r
if( !obj.gpuTimerID ){\r
if( obj.wait ){\r
obj.gpuTimerID = X.Timer.once( obj.wait, xnode, X_Node_Anime_releaseGPULayer );\r
console.log( '_anime無' );\r
return;\r
};\r
+ X_Node_Anime_clearTransition( this );\r
X_Node_Anime_updatePosition( this, obj.destX, obj.destY, obj.destA, false );\r
X_Node_ANIMATIONS.splice( X_Node_ANIMATIONS.indexOf( this ), 1 );\r
delete obj.gpuTimerID;\r
xnode.unlisten( 'transitionend', X_Node_Anime_onTransitionEnd );\r
\r
xnode.css({\r
- willChange : '',\r
+ //willChange : '',\r
backfaceVisibility : '',\r
transitionTimingFunction : '',\r
transitionDelay : '',\r
async = obj[ 'async' ],\r
user = obj[ 'user' ],\r
password = obj[ 'password' ],\r
- headers = obj[ 'headers' ],\r
+ headers = obj[ 'headers' ] || {},\r
postbody = obj[ 'postbody' ],\r
timeout = obj[ 'timeout' ] || 20000,\r
temp;\r
// http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_r_1.html\r
// raw.overrideMimeType()\r
if( !X_Net_XHR_ACTIVE_X && X.Type.isFunction( raw.setRequestHeader ) ){\r
+ \r
+ // http://nakigao.sitemix.jp/blog/?p=2040\r
+ // SafariでHTTP/412のエラー\r
+ headers[ 'If-Modified-Since' ] = ( new Date ).toUTCString();\r
+ \r
for( p in headers ){\r
if( X_EMPTY_OBJECT[ p ] ) continue;\r
raw.setRequestHeader( p, headers[ p ] ); // Opera8.01+, MSXML3+\r
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 ) + ' バイト/秒.' );
// 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 ){
*/\r
\r
var X_Audio_HTMLAudio_playTrigger =\r
+ 6 <= X_UA.iOS ? 'loadeddata' :\r
X_UA.iOS ? 'suspend' :\r
X_UA.AndroidBrowser2 ? 'stalled' : // Android 2.3.5(SBM101SH) では stalled は発生しない,,,\r
X_UA.AndroidBrowser4 ? 'loadeddata' : \r
X_UA.OperaMobile || X_UA.OperaTablet ? 'loadeddata' : 'canplay',\r
X_Audio_HTMLAudioWrapper,\r
+ X_Audio_constructor = window.Audio || window.HTMLAudioElement,\r
X_Audio_rawAudio,\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
\r
X_Audio_codecs;\r
\r
-if( window.HTMLAudioElement && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){\r
+if( X_Audio_constructor && !X_Audio_HTMLAudioWrapper_badOperaAndroid ){\r
//http://himaxoff.blog111.fc2.com/blog-entry-97.html\r
//引数なしで new Audio() とすると、Operaでエラーになるそうなので注意。\r
- X_Audio_rawAudio = new Audio( '' );\r
- \r
- X_Audio_codecs = {\r
- mp3 : X_Audio_rawAudio.canPlayType('audio/mpeg'),\r
- opus : X_Audio_rawAudio.canPlayType('audio/ogg; codecs="opus"'),\r
- ogg : X_Audio_rawAudio.canPlayType('audio/ogg; codecs="vorbis"'),\r
- wav : X_Audio_rawAudio.canPlayType('audio/wav; codecs="1"'),\r
- aac : X_Audio_rawAudio.canPlayType('audio/aac'),\r
- m4a : X_Audio_rawAudio.canPlayType('audio/x-m4a') + X_Audio_rawAudio.canPlayType('audio/m4a') + X_Audio_rawAudio.canPlayType('audio/aac'),\r
- mp4 : X_Audio_rawAudio.canPlayType('audio/x-mp4') + X_Audio_rawAudio.canPlayType('audio/mp4') + X_Audio_rawAudio.canPlayType('audio/aac'),\r
- weba : X_Audio_rawAudio.canPlayType('audio/webm; codecs="vorbis"')\r
- };\r
- \r
- (function( k, v ){\r
- for( k in X_Audio_codecs ){\r
- if( X_EMPTY_OBJECT[ k ] ) continue;\r
- v = X_Audio_codecs[ k ];\r
- X_Audio_codecs[ k ] = v && v.split( 'no' ).join( '' );\r
- console.log( k + ' ' + X_Audio_codecs[ k ] );\r
+ X_Audio_rawAudio = new X_Audio_constructor( '' );\r
+\r
+ if( X_Audio_rawAudio.canPlayType ){\r
+ X_Audio_codecs = {\r
+ mp3 : X_Audio_rawAudio.canPlayType('audio/mpeg'),\r
+ opus : X_Audio_rawAudio.canPlayType('audio/ogg; codecs="opus"'),\r
+ ogg : X_Audio_rawAudio.canPlayType('audio/ogg; codecs="vorbis"'),\r
+ wav : X_Audio_rawAudio.canPlayType('audio/wav; codecs="1"'),\r
+ aac : X_Audio_rawAudio.canPlayType('audio/aac'),\r
+ m4a : X_Audio_rawAudio.canPlayType('audio/x-m4a') + X_Audio_rawAudio.canPlayType('audio/m4a') + X_Audio_rawAudio.canPlayType('audio/aac'),\r
+ mp4 : X_Audio_rawAudio.canPlayType('audio/x-mp4') + X_Audio_rawAudio.canPlayType('audio/mp4') + X_Audio_rawAudio.canPlayType('audio/aac'),\r
+ weba : X_Audio_rawAudio.canPlayType('audio/webm; codecs="vorbis"')\r
};\r
- })();\r
- \r
+ (function( k, v ){\r
+ for( k in X_Audio_codecs ){\r
+ if( X_EMPTY_OBJECT[ k ] ) continue;\r
+ v = X_Audio_codecs[ k ];\r
+ X_Audio_codecs[ k ] = v && v.split( 'no' ).join( '' );\r
+ console.log( k + ' ' + X_Audio_codecs[ k ] );\r
+ };\r
+ })();\r
+ } else {\r
+ // iOS3.2.3\r
+ X_Audio_codecs = {\r
+ mp3 : X_UA.IE || X_UA.Chrome || ( X_UA.Windows && X_UA.Safari ),\r
+ ogg : 5 <= X_UA.Gecko || X_UA.Chrome || X_UA.Opera,\r
+ wav : X_UA.Gecko || X_UA.Opera || ( X_UA.Windows && X_UA.Safari ),\r
+ aac : X_UA.IE || X_UA.WebKit,\r
+ m4a : X_UA.IE || X_UA.WebKit,\r
+ mp4 : X_UA.IE || X_UA.WebKit,\r
+ weba : 2 <= X_UA.Gecko || 10.6 <= X_UA.Opera // firefox4+(Gecko2+)\r
+ };\r
+ };\r
\r
X_Audio_HTMLAudioWrapper = X.EventDispatcher.inherits(\r
'X.AV.HTML5AudioWrapper',\r
document.body.appendChild( this._rawObject );\r
//this._rawObject.load();\r
} else {\r
- this._rawObject = X_Audio_rawAudio || new Audio( source );// X_Doc_create( 'audio', { src : source } ).appendToRoot();//( X.X_Node_systemNode );\r
+ this._rawObject = X_Audio_rawAudio || new X_Audio_constructor( source );// X_Doc_create( 'audio', { src : source } ).appendToRoot();//( X.X_Node_systemNode );\r
this._rawObject.autobuffer = false;\r
this._src = source;\r
};\r
if( X_Audio_HTMLAudioWrapper_badOperaAndroid ){\r
X_Audio_HTMLAudioWrapper_badOperaAndroid && alert( 12 );\r
X_EventDispatcher_toggleAllEvents( this, false );\r
- this._rawObject = new Audio( X_URL_toAbsolutePath( source ) );\r
+ this._rawObject = new X_Audio_constructor( X_URL_toAbsolutePath( source ) );\r
//X_EventDispatcher_toggleAllEvents( this, true );\r
} else {\r
X_Audio_rawAudio.src = source;\r
};\r
\r
- //this._rawObject = new Audio( X_URL_toAbsolutePath( source ) );\r
+ //this._rawObject = new X_Audio_constructor( X_URL_toAbsolutePath( source ) );\r
/*!X_Audio_Sprite_needTouchFirst && */ X_Audio_rawAudio.load(); // 要る?\r
X_Audio_rawAudio = null;\r
};\r
var X_Audio_Sprite_shouldUse = window.HTMLAudioElement && ( X_UA.iOS || X_UA.AndroidBrowser || X_UA.OperaMobile || X_UA.OperaTablet ), // Flash がない\r
X_Audio_Sprite_useVideoForMulti = 4 <= X_UA.AndroidBrowser && 534.3 < X_UA.AndroidBrowserWebkit, // ドスパラパッドはビデオのインライン再生が不可 \r
X_Audio_Sprite_needTouchAndroid = X_Audio_Sprite_useVideoForMulti, \r
- X_Audio_Sprite_needTouchFirst = !!X_UA.iOS || X_Audio_Sprite_needTouchAndroid || ( X_UA.WinPhone && X_UA.IE9 ),\r
+ X_Audio_Sprite_needTouchFirst = X_UA.iOS || X_Audio_Sprite_needTouchAndroid || ( X_UA.WinPhone && X_UA.IE9 ),\r
X_Audio_Sprite_enableMultiTrack = !( X_UA.iOS && !X_Audio_WebAudio_context ) && !( X_UA.AndroidBrowser4 && X_UA.AndroidBrowserWebkit <= 534.3 ),\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_maxTracks = !X_Audio_Sprite_enableMultiTrack ? 1 : X_Audio_Sprite_useVideoForMulti ? 2 : 9,\r
track = X_Audio_Sprite_TEMP.bgmTrack = tracks[ 0 ];\r
};\r
\r
- if( track.listen( X.Event.MEDIA_BEFORE_LOOP, this, X_Audio_Sprite_handleEvent ).isPlaying() ){\r
+ if( track.listen( [ X.Event.MEDIA_PLAYING, X.Event.MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent ).isPlaying() ){\r
track\r
.state( {\r
loop : true,\r
if( 1 < tracks.length ){\r
track = X_Audio_Sprite_getTrackEnded( X_Audio_Sprite_TEMP.bgmPlaying );\r
track\r
- .listen( X.Event.MEDIA_BEFORE_LOOP, this, X_Audio_Sprite_handleEvent )\r
+ .listen( [ X.Event.MEDIA_PLAYING, X.Event.MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent )\r
.state( { looped : false } )\r
.play( preset[ 0 ], preset[ 1 ], true, 0, X_Audio_Sprite_lengthSilence );\r
} else {\r
};\r
track = tracks[ 0 ];\r
\r
- if( track.listen( X.Event.MEDIA_BEFORE_LOOP, this, X_Audio_Sprite_handleEvent ).isPlaying() ){\r
+ if( track.listen( [ X.Event.MEDIA_PLAYING, X.Event.MEDIA_BEFORE_LOOP ], this, X_Audio_Sprite_handleEvent ).isPlaying() ){\r
track\r
.state( {\r
loop : true,\r
X_Audio_Sprite_TEMP.bgmPlaying = false;\r
X_Audio_Sprite_TEMP.bgmTrack = null;\r
};\r
- console.log( 'pause' );\r
track && track.play( 0, X_Audio_Sprite_lengthSilence, true, 0, X_Audio_Sprite_lengthSilence ).seek( 0 );\r
+ this.asyncDispatch( X.Event.MEDIA_PAUSED );\r
return this;\r
},\r
\r
break;\r
\r
case X.Event.READY :\r
+ console.log( 'X.AudioSprite - Ready!' );\r
if( X_Audio_Sprite_needTouchAndroid ){\r
for( i = 0; i < X_Audio_Sprite_TEMP.tracks.length; ++i ){\r
X_Audio_Sprite_instance.pause( i );\r
};\r
- e.target.listenOnce( X.Event.MEDIA_PLAYING, this, X_Audio_Sprite_handleEvent ); // Android 標準ブラウザ\r
+ e.target.listenOnce( X.Event.MEDIA_PLAYING, this, this.asyncDispatch, [ X.Event.READY ] ); // Android 標準ブラウザ\r
return;\r
};\r
- case X.Event.MEDIA_PLAYING :\r
this.asyncDispatch( X.Event.READY );\r
break;\r
+ \r
+ case X.Event.MEDIA_PLAYING :\r
+ ( e.target === X_Audio_Sprite_TEMP.bgmTrack || !e.target.state().looped ) && this.asyncDispatch( X.Event.MEDIA_PLAYING );\r
+ break;\r
\r
case X.Event.MEDIA_BEFORE_LOOP :\r
if( e.target === X_Audio_Sprite_TEMP.bgmTrack ){\r