* https://web.archive.org/web/20070526063400/http://web.paulownia.jp/script/oop/closure.html\r
* MacOSX 10.3のsafariにはhasOwnPropertyが実装されていないので、独自に追加する必要があります。\r
*/\r
-/*-----------------\r
-result | 1 | 2 | 3 |\r
-this | NaN | | | NaN | NaN | NaN |\r
-_proto_ | | NaN | | NaN | | NaN |\r
-_super_ | | | NaN | | NaN | NaN |\r
-*/\r
-\r
/*\r
Object.prototype.hasOwnProperty || (Object.prototype.hasOwnProperty = function( p ){\r
- var _proto_ = this.constructor && this.constructor.prototype,\r
- v = this[ p ],\r
- nan = v !== v; // isNaN\r
- save, r = false;\r
+ var proto = this.constructor && this.constructor.prototype,\r
+ __p__ = proto && ( '__proto__' in proto ) && proto.__proto__,\r
+ v = this[ p ],\r
+ nan = v !== v, // isNaN\r
+ r = false, save;\r
+ \r
+ if( __p__ ) proto.__proto__ = v === null ? undefined : null;\r
+ \r
if( nan ){\r
- // NaN の判定は完全に chain を辿る必要がある\r
- save = _proto_[ p ];\r
- _proto_[ p ] = true;\r
- r = this[ p ] !== this[ p ]; // isNaN\r
- \r
- delete _proto_[ p ];\r
- // もっと深い chain で定義されていた.\r
- if( this[ p ] !== this[ p ] ) return r; // 1\r
- // __proto__ で定義されていた.\r
- _proto_[ p ] = save;\r
+ if( proto[ p ] !== proto[ p ] ){ // proto is NaN\r
+ proto[ p ] = 0; // different value\r
+ r = this[ p ] !== this[ p ]; // isNaN\r
+ proto[ p ] = NaN; // proto で定義されていた.\r
+ } else {\r
+ r = true;\r
+ };\r
} else\r
if( p in this ){\r
- if(\r
- !_proto_ ||\r
- !( p in _proto_ ) ||\r
- ( _proto_[ p ] !== v )\r
- ) return true;\r
- \r
- // this と __proto__ に同名で同値が書かれている可能性あり\r
-\r
- save = _proto_[ p ];\r
- _proto_[ p ] = v + ' ';\r
- r = v === this[ p ];\r
+ if( !proto || !( p in proto ) || ( proto[ p ] !== v ) ){\r
+ r = true;\r
+ } else {\r
+ // this と proto に同名で同値が書かれている可能性あり\r
+ save = proto[ p ];\r
+ proto[ p ] = v + ' '; // different value\r
+ r = v === this[ p ];\r
+ \r
+ delete proto[ p ];\r
\r
- delete _proto_[ p ];\r
- // もっと深い chain で定義されていた.\r
- if( _proto_[ p ] === v ) return r;\r
- // __proto__ で定義されていた.\r
- _proto_[ p ] = save;\r
+ if( proto[ p ] !== v ){\r
+ // proto で定義されていた.\r
+ proto[ p ] = save; \r
+ };\r
+ };\r
};\r
+ \r
+ if( __p__ ) proto.__proto__ = __p__;\r
+ \r
return r;\r
- }); */
\ No newline at end of file
+ });*/\r
i !== -1 ? parseFloat( dua.substr( i + 6 ) ) : 0,\r
j !== -1 ? parseFloat( dua.substr( j + 8 ) ) : 0,\r
tv );\r
- acme.Opera7 = acme.Opera < 8;\r
+ // closure compiler で minify するとOpera7で動かない \r
+ // --compilation_level WHITESPACE_ONLY --formatting pretty_print <- 動く\r
+ acme.Opera7 = acme.Opera < 8;\r
+ acme.Opera78 = acme.Opera < 9;\r
acme.OperaMini = 0 < dua.indexOf("Opera Mini");\r
acme.OperaMobile = 0 < dua.indexOf("Opera Mobi");\r
acme.OperaTablet = 0 < dua.indexOf("Opera Tablet");\r
+ // TODO NDS\r
return acme;\r
};\r
\r
// Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko\r
if( document.all ){\r
acme.ActiveX = !!window[ 'ActiveXObject' ];\r
- acme.IE = document.documentMode || parseFloat(dav.split("MSIE ")[1]) || parseFloat(dua.split("rv:")[1]) || 0;\r
- acme.MacIE = dav.indexOf( 'Mac_PowerPC' ) !== -1 || dav.indexOf( 'Mac_PPC' ) !== -1 || dav.indexOf( 'Mac_68K' ) !== -1;\r
- acme.IEMobile = dua.toLowerCase().indexOf( 'iemobile' ) !== -1 ||\r
- dua.toLowerCase().indexOf( 'windows phone' ) !== -1;\r
+ acme.IE = document.documentMode || parseFloat(dua.split("MSIE ")[1]) || parseFloat(dua.split("rv:")[1]) || parseFloat(dav.split("MSIE ")[1]) || 0;\r
+ acme.IE4 = acme.IE && acme.IE < 5;\r
+ acme.IE5678 = 5 <= acme.IE && acme.IE < 9;\r
+ acme.MacIE = dua.indexOf( 'Mac_PowerPC' ) !== -1 || dua.indexOf( 'Mac_PPC' ) !== -1 || dua.indexOf( 'Mac_68K' ) !== -1;\r
+ acme.IEMobile = dua.toLowerCase().indexOf( 'iemobile' ) !== -1;\r
+ acme.WinPhone = dua.toLowerCase().indexOf( 'windows phone' ) !== -1;\r
return acme;\r
};\r
\r
return acme;\r
};\r
\r
+ // http://www.useragentstring.com/pages/Playstation%203/\r
+ // Mozilla/5.0 (PLAYSTATION 3; 3.55)\r
+ // Mozilla/4.0 (PS3 (PlayStation 3); 1.00)\r
+ if( ( i = dua.toUpperCase().indexOf( 'PLAYSTATION 3' ) !== -1 ) ){\r
+ acme.PS3 = parseFloat( dua.substr( i + 15 ) ) || 0;\r
+ return acme;\r
+ };\r
+ \r
+ // http://www.useragentstring.com/pages/iCab/\r
+ // iCab/3.0.2 (Macintosh; U; PPC Mac OS X)\r
+ // Mozilla/5.0 (Macintosh; U; PPC Mac OS; en) iCab 3\r
+ if( ( i = dua.indexOf( 'iCab' ) !== -1 ) ){\r
+ acme.iCab = parseFloat( dua.substr( i + 5 ) ) || 0;\r
+ return acme;\r
+ };\r
+ \r
if( 0 < dua.indexOf( 'Gecko\/' ) && ( i = dua.indexOf( 'rv:' ) ) ){\r
v = dua.substr( i + 3 ).split( '.' );\r
acme.Gecko = parseFloat( v[ 0 ] ) || 0 +\r
( parseFloat( v[ 2 ] ) || 0 ) / 100;\r
\r
//Fennec\r
+ if( ( i = dua.indexOf( 'Fennec/' ) ) !== -1 ){\r
+ acme.Fennec = parseFloat( dua.substr( i + 7 ) );\r
+ };\r
//Firefox\r
+ \r
//Netscape\r
+ //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3\r
+ if( ( i = dua.indexOf( 'Netscape6/' ) ) !== -1 && ( v = parseFloat( dua.substr( i + 10 ) ) ) ){\r
+ acme.NN = v;\r
+ acme.NN6 = true;\r
+ return acme;\r
+ } else\r
+ //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax)\r
+ //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20070321 Netscape/8.1.3\r
+ if( ( i = dua.indexOf( 'Netscape/' ) ) !== -1 && ( v = parseFloat( dua.substr( i + 9 ) ) ) ){\r
+ acme.NN = v;\r
+ return acme;\r
+ } else\r
+ //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6\r
+ if( ( i = dua.indexOf( 'Navigator/' ) ) !== -1 && ( v = parseFloat( dua.substr( i + 10 ) ) ) ){\r
+ acme.NN = v;\r
+ return acme;\r
+ };\r
};\r
\r
- // Blink\r
- // iCab\r
+ // TODO Blink\r
acme.Khtml = ( dav.indexOf("Konqueror") >= 0 ) ? tv : undefined;\r
- acme.WebKit = parseFloat(dua.split("WebKit\/")[1]) || undefined;\r
+ acme.WebKit = i = parseFloat(dua.split("WebKit\/")[1]) || undefined;\r
acme.Chrome = parseFloat(dua.split("Chrome\/")[1]) || undefined;\r
- i = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0);\r
- if( i && !acme.Chrome ){\r
- acme.Safari = parseFloat( dav.split("Version/")[1] );\r
- i = parseFloat(dav.substr( i + 7 ));\r
- if( !acme.Safari && i < 100 ){\r
- acme.Safari = 1;\r
- };\r
- if( !acme.Safari && i < 125 ){\r
- acme.Safari = 1.1;\r
- };\r
- if( !acme.Safari && i < 312 ){\r
- acme.Safari = 1.2;\r
- };\r
- if( !acme.Safari && i < 412 ){\r
- acme.Safari = 1.3;\r
- };\r
- if( !acme.Safari && i <= 419.3 ){\r
- acme.Safari = 2;\r
+\r
+ if( i && !acme.Chrome && dua.indexOf( 'Safari' ) !== -1 ){\r
+ if( dav.indexOf( 'Version/' ) !== -1 ){\r
+ acme.Safari = parseFloat( dav.split("Version/")[1] );\r
+ } else {\r
+ if( i < 73 ){\r
+ acme.Safari = 0.8;\r
+ } else\r
+ if( i < 85 ){\r
+ acme.Safari = 0.9;\r
+ } else\r
+ if( i < 100 ){\r
+ acme.Safari = 1;\r
+ } else\r
+ if( i < 125 ){\r
+ acme.Safari = 1.1;\r
+ } else\r
+ if( i < 312 ){\r
+ acme.Safari = 1.2;\r
+ } else\r
+ if( i < 412 ){\r
+ acme.Safari = 1.3;\r
+ } else\r
+ if( i <= 419.3 ){\r
+ acme.Safari = 2;\r
+ } else\r
+ if( i <= 525.13 ){\r
+ acme.Safari = 3;\r
+ } else\r
+ if( i <= 525.25 ){\r
+ acme.Safari = 3.1;\r
+ } else\r
+ if( i <= 528.16 ){\r
+ acme.Safari = 3.2;\r
+ };\r
};\r
};\r
\r
return acme;\r
})( navigator );\r
\r
+//alert(X.UA.Safari + ' ' + X.UA.WebKit + '\n\n' + navigator.userAgent + '\n\n' + navigator.appVersion + '\n\n' + navigator.platform );\r
+\r
// Safari 3.1 未満は開発コンソールがない!\r
// http://shimax.cocolog-nifty.com/search/2006/09/safarijavascrip_c54d.html\r
\r
_override : function ( target, src, force ){\r
var p;\r
for( p in src ){\r
- if( p === 'Super' || p === 'SuperConstructor' ){\r
+ if( p === 'Super' || p === 'SuperConstructor' || p === '__proto__' || p === 'prototype' || p === 'constructor' ){\r
X.Notification.critical( 'Super & SuperConstructor is reserved!' );\r
return;\r
};\r
delete X.Dom._init;\r
X.Dom.readyState = X.Dom.Event.DOM_PRE_INIT;\r
\r
- /* if( X.UA.IE ) */\r
- X.Dom._root = ( document.compatMode !== 'CSS1Compat' ? document.body : document.documentElement );\r
+ X.Dom._root = document.compatMode !== 'CSS1Compat' ? document.body : document.documentElement || document.body;\r
\r
h = Node._html = document.documentElement ?\r
new Node( document.documentElement ) :\r
};\r
};\r
\r
-if( document.getElementById && ( !X.UA.IEMobile || 5 <= X.UA.IE ) ){\r
+/*\r
+ * http://d.hatena.ne.jp/t-uchima/20051003/p1\r
+ * MacIEにはattachEventが一応あるけどwindow.attachEventとdocument.attachEventしかなく他の要素にはattachEventはない。\r
+ */\r
+if( X.UA.MacIE ){\r
+ X.Dom.DOM_W3C = true;\r
+ X.Dom.EVENT_DOM0 = true;\r
+} else\r
+if( X.UA.IE4 ){ // ie4 & iemobi4\r
+ X.Dom.DOM_IE4 = true;\r
+ X.Dom.EVENT_DOM0 = true;\r
+} else\r
+if( document.getElementById ){\r
X.Dom.DOM_W3C = true;\r
if( document.addEventListener ){\r
X.Dom.EVENT_W3C = true;\r
if( document.all ){\r
X.Dom.DOM_IE4 = true;\r
X.Dom.EVENT_DOM0 = true;\r
+} else\r
+if( document.layers ){\r
+ \r
+} else {\r
+ \r
};\r
\r
X.Dom.moveToHead = {\r
STYLE : true,\r
+ LINK : true,\r
+ TITLE : true,\r
BGSOUND : true,\r
AREA : true,\r
BASE : true,\r
CLASSNAME : 8, // _getCharSize, width, height, x, y\r
ATTR : 16, // _getCharSize, width, height, x, y\r
CSS : 32, // _getCharSize, width, height, x, y\r
- IE_FILTER : X.UA.IE && X.UA.IE < 9 ? 64 : 0,\r
+ IE_FILTER : X.UA.IE && X.UA.IE < 9 && !X.UA.MacIE ? 64 : 0,\r
UNKNOWN_TAG_FIX : 128,\r
IE4_TEXTNODE_FIX : 256\r
};\r
HAS_HEIGHT_LENGTH : 512,\r
HAS_HEIGHT_PERCENT : 1024,\r
IE4_ONLY_TEXT : 2048,\r
- IE5_DISPLAY_NONE_FIX : 5 <= X.UA.IE && X.UA.IE < 5.5 ? 4096 : 0 // MacIE5.2- は ?\r
+ IE5_DISPLAY_NONE_FIX : !X.UA.MacIE && 5 <= X.UA.IE && X.UA.IE < 5.5 ? 4096 : 0 // filterがかかっていると不可? MacIE5.2- は ?\r
};\r
\r
-X.Dom._strictElmCreation = X.UA.IE && X.UA.IE < 9;// && !X.UA.MacIE;\r
+X.Dom._strictElmCreation = !X.UA.MacIE && X.UA.IE5678;// && !X.UA.MacIE;\r
+\r
+X.Dom._useDocumentFragment = document.createDocumentFragment && ( !X.UA.IE || 5.5 <= X.UA.IE ) && document.createDocumentFragment();\r
\r
/*\r
* Node( rawElement | rawTextnode | htmlString | textString )\r
Node.IS_DOCUMENT = 9;\r
Node.IS_IMAGE = 10;\r
\r
-Node._useDocumentFragment = document.createDocumentFragment && ( !X.UA.IE || 5.5 <= X.UA.IE ) && document.createDocumentFragment();\r
-\r
Node._getType = function( v ){\r
if( v === '' ) return Node.IS_STRING;\r
if( !v ) return 0;\r
} else\r
if( ( xnodes = this._xnodes ) && ( l = xnodes.length ) ) {\r
\r
- /*if( elm.childNodes.length !== l && ( frg = Node._useDocumentFragment ) ){\r
+ /*if( elm.childNodes.length !== l && ( frg = X.Dom._useDocumentFragment ) ){\r
for( i = 0; i < l; ++i ){\r
frg.appendChild( xnodes[ i ]._actualCreate( true ) );\r
};\r
};\r
// className\r
if( this._dirty & X.Dom.Dirty.CLASSNAME ){\r
- this._className ? ( elm.className = this._className ) : ( elm.className && elm.removeAttribute( 'class' ) ); \r
+ this._className ? ( elm.className = this._className ) : ( elm.className && elm.removeAttribute( X.UA.IE ? 'className' : 'class' ) ); \r
\r
// ie5 only\r
if( X.Dom.State.IE5_DISPLAY_NONE_FIX && elm.currentStyle.display === 'none' ){\r
// style\r
if( this._dirty & X.Dom.Dirty.CSS ){\r
if( this._cssText !== null || ( this._cssText = X.Dom.Style.objToCssText( this._css ) ) ){\r
- X.UA.Opera && X.UA.Opera < 9 ?\r
+ X.UA.Opera78 || X.UA.NN6 ?\r
elm.setAttribute( 'style', this._cssText ) : // opera8用\r
( elm.style.cssText = this._cssText );\r
} else {\r
if( this._dirty & X.Dom.Dirty.ATTR && ( attrs = this._newAttrs || this._attrs ) ){\r
rename = X.Dom.Attr.renameForDOM;\r
for( k in attrs ){\r
- if( 5 <= X.UA.IE && X.UA.IE < 6 ){ // IETester 5.5 ではエラーが出なかった.MultipulIE5.5 ではエラーが出たので\r
+ if( !X.UA.MacIE && 5 <= X.UA.IE && X.UA.IE < 6 ){ // IETester 5.5 ではエラーが出なかった.MultipulIE5.5 ではエラーが出たので\r
if( this._tag === 'TEXTAREA' && k === 'value' ){\r
elm.firstChild ?\r
( elm.firstChild.data = attrs[ k ] ) :\r
'>' ].join( '' ) ) :\r
document.createElement( this._tag );\r
};\r
- if( Node._useDocumentFragment ){\r
+ if( X.Dom._useDocumentFragment ){\r
if( ( xnodes = this._xnodes ) && ( l = xnodes.length ) ){\r
- !isChild && ( frg = Node._useDocumentFragment ).appendChild( elm );\r
+ !isChild && ( frg = X.Dom._useDocumentFragment ).appendChild( elm );\r
for( i = 0; i < l; ++i ){\r
elm.appendChild( xnodes[ i ]._actualCreate( true ) );\r
};\r
Node.prototype._afterActualCreate =\r
X.Dom.DOM_W3C ? (function(){\r
var elm = this._rawNode, xnodes, l, attrs, k, i;\r
- if( !this.parent ){\r
- alert( 'afterActualCreate : ' + this._tag );\r
- };\r
+\r
this._root = this.parent._root;\r
\r
if( this._xnodeType === 3 ){\r
l = xnodes && xnodes.length;\r
\r
if( this._isNew ){\r
- if( !Node._useDocumentFragment && l ){// docFrg が使えない場合、doc 追加後に子を追加\r
+ if( !X.Dom._useDocumentFragment && l ){// docFrg が使えない場合、doc 追加後に子を追加\r
for( i = 0; i < l; ++i ){\r
elm.appendChild( xnodes[ i ]._actualCreate( true ) );\r
};\r
if( !elm ) return;\r
this._xnodeType === 1 && this._migrateEvent();// イベントの退避\r
// elm.parentNode.tagName for ie7\r
- //if( !X.UA.Opera7 ){\r
+ if( !X.UA.MacIE ){\r
!isChild && elm.parentNode && elm.parentNode.tagName && elm.parentNode.removeChild( elm );\r
- //} else {\r
- // !isChild && elm.parentNode && X.Dom._o7_remove( elm );\r
- //};\r
+ } else {\r
+ !isChild && elm.parentNode && elm.parentNode.tagName && X.Dom._fixed_remove( elm, this );\r
+ };\r
}) :\r
X.Dom.DOM_IE4 ?\r
( function( isChild ){\r
var xnodes = this._xnodes,\r
- elm = this._rawNode || this._ie4getRawNode(),\r
+ elm = this._rawNode || this._xnodeType === 1 && this._ie4getRawNode(),\r
i, l, xnode;\r
if( xnodes && ( l = xnodes.length ) ){\r
for( i = 0; i < l; ++i ){\r
this._rawNode.attachEvent( 'on' + type, this._handleEvent );\r
}) :\r
(function( type ){\r
- var elm = this._rawNode || this._ie4getRawNode && this._ie4getRawNode();\r
+ var elm = this._rawNode || ( this._ie4getRawNode && this._ie4getRawNode() );\r
if( !elm ) return;\r
this._handleEvent = elm[ 'on' + type ] = this._handleEvent || X.Callback.create( this );\r
});\r
};\r
}) :\r
(function( type ){\r
- var elm = this._rawNode || this._ie4getRawNode && this._ie4getRawNode();\r
+ var elm = this._rawNode || ( this._ie4getRawNode && this._ie4getRawNode() );\r
if( !elm ) return;\r
elm[ 'on' + type ] = X.emptyFunction;\r
elm[ 'on' + type ] = '';\r
\r
/* for other browsers */\r
Node._window.listenOnce( 'load', X.Dom._init );\r
-\r
//\r
X.Dom.listenOnce( X.Dom.Event.XDOM_READY, function(e){\r
console.log( 'X.Dom XDomReady ' + X.Dom.readyState );\r
* Width, Height\r
* display:blobk かつ overflow:hidden かつ size(px,em)が設定されていたら、再描画しないでその値を返す\r
* display:none なら 0\r
+ * \r
+ * getBoxObjectFor\r
+ * getBoundingClientRect\r
*/\r
Node.prototype.width = function(){\r
if( !this.parent ){// todo : _state で tree に所属しているか?判定\r
} else\r
if( typeof nameOrObj === 'string' && attrs ){\r
// getter\r
- return attrs[ nameOrObj ];\r
+ switch( nameOrObj ){\r
+ case 'id' :\r
+ return this._tag;\r
+ case 'class' :\r
+ case 'className' :\r
+ return this._className;\r
+ case 'tag' :\r
+ case 'tagName' :\r
+ return this._tag;\r
+ case 'style' :\r
+ case 'cssText' :\r
+ return this.cssText();\r
+ };\r
+ return attrs[ X.Dom.Attr.renameForTag[ nameOrObj ] || nameOrObj ];\r
};\r
};\r
X.Dom.Node.prototype._setAttr = function( attrs, newAttrs, name, v ){\r
},
IE_FILTER_FIX :
- X.UA.IE && X.UA.IE < 9 ?
+ X.UA.IE && X.UA.IE < 9 && !X.UA.MacIE ?
{
opacity : 1,
textShadow : 1
X.Dom.Style.SPECIAL_FIX =
// ~IE8
- X.UA.IE && X.UA.IE < 9 ?
+ X.UA.IE && X.UA.IE < 9 && !X.UA.MacIE?
(function( obj ){
var test = X.Dom.Style.SPECIAL_FIX_PROP,
filters = [],
X.Dom.Style.SPECIAL_FIX_PROP =
// ~IE8
- X.UA.IE && X.UA.IE < 9 ?
+ X.UA.IE && X.UA.IE < 9 && !X.UA.MacIE ?
{
filter : 1,
opacity : 2//, uinode ChromeNode で行う
var cname = ' ' + elm.className + ' ',\r
tag = ( elm.tagName || '' ).toUpperCase();\r
return cname.indexOf( ' skip-cleanup ' ) === -1 &&\r
- ( X.Dom.cleanupTagNames[ tag ] || 0 < cname.indexOf( ' cleanup-target ' ) );\r
+ ( X.Dom.cleanupTagNames[ tag ] || cname.indexOf( ' cleanup-target ' ) !== -1 );\r
};\r
\r
-X.Dom._o7_remove = function( node ){\r
- var parent = node.parentNode;\r
- if( node.nodeType === 1 || node.nodeType === 3 ){\r
- parent && parent.removeChild( node );\r
- } else {\r
- node.data = '';\r
+if( X.UA.MacIE ){\r
+\r
+ X.Dom._fixed_remove = function( node, xnode ){\r
+ var parent = node.parentNode, l;\r
+\r
+ node.nodeType !== 3 && alert( node.nodeType + '\n' + ( node.outerHTML || node.data ) );\r
+ if( node.nodeType === 1 ){\r
+ //node.outerHTML = '';\r
+ parent && parent.removeChild( node );\r
+ } else\r
+ if( node.nodeType === 3 ){\r
+ //node.data = '';\r
+ l = X.Dom._removalTextNodes.length;\r
+ if( parent ){\r
+ //!l && X.Timer.once( 0, X.Dom._timer_remove );\r
+ //X.Dom._removalTextNodes[ l ] = node;\r
+ //var str=[],p;\r
+ //for( p in node ){\r
+ // str[str.length] = p;\r
+ //};\r
+ //alert( str.join( ',' ) + parent.innerHTML );\r
+ //node.nodeValue = '';\r
+ //parent.replaceChild( document.createElement( 'span' ), node );\r
+ //var e;\r
+ //var f = document.createDocumentFragment();\r
+ //f.appendChild( e = document.createElement( 'span' ) );\r
+ //f.replaceChild( node, e );\r
+ //e.appendChild( f );\r
+ //parent.appendChild( e = document.createElement( 'span' ) );\r
+ //e.appendChild( node );\r
+ //parent.removeChild( e );\r
+ //node.parentNode = null;\r
+ //document.body.appendChild( node );\r
+ //parent.replaceChild( document.createComment( '' ), node );\r
+ document.body.appendChild( node );\r
+ return;\r
+ if( parent.parentNode !== document.body ){\r
+ var clone = parent.cloneNode( true );\r
+ for( var i = 0, l = parent.childNodes.length; i < l; ++i ){\r
+ if( parent.childNodes[ i ] !== node ){\r
+ clone.removeChild( clone.childNodes[ i ] );\r
+ };\r
+ }; \r
+ //parent.parentNode.insertBefore( clone, parent );\r
+ //parent.parentNode.removeChild( parent );\r
+ parent.parentNode.insertBefore( clone, parent );\r
+ parent.style.display = 'none';\r
+ if( xnode ){\r
+ xnode.parent.parent._rawNode = clone;\r
+ };\r
+ } else {\r
+ // ignore\r
+ };\r
+\r
+ };\r
+ //if( !node.ownerDocument ) alert( 'no owner' );\r
+ } else {\r
+ //node.data = '';\r
+ };\r
+ };\r
+ \r
+ X.Dom._removalTextNodes = [];\r
+ \r
+ X.Dom._timer_remove = function(){\r
+ var nodes = X.Dom._removalTextNodes,\r
+ i = 0, node;\r
+ while( i < 5 && nodes.length ){\r
+ node = nodes.shift();\r
+ if( node.parentNode ){\r
+ //node.parentNode.removeChild( node );\r
+ ++i;\r
+ };\r
+ };\r
+ \r
+ //nodes.length && X.Timer.once( 1000, X.Dom._timer_remove );\r
+ };\r
+ \r
+} else\r
+if( X.UA.Opera7 ){\r
+\r
+ X.Dom._fixed_remove = function( node ){\r
+ if( node.nodeType === 1 || node.nodeType === 3 ){\r
+ node.parentNode && node.parentNode.removeChild( node );\r
+ } else {\r
+ //node.data = '';\r
+ };\r
};\r
};\r
\r
(function(){\r
var r = Node.root,\r
body = r._rawNode,\r
- i, n = 0,\r
- html,\r
+ copy, i, l, node, html,\r
elmProgress;\r
// TODO\r
// textarea の内容を控えて、消す。xnode tree 構築後に復帰。でないと、html パースでこける\r
-\r
+ //X.UA.MacIE && alert( body.innerHTML );\r
// cleanup tree \r
- X.UA.MacIE || (function/*cleanUpTree*/( elm, skip, head ){\r
+ (function/*cleanUpTree*/( elm, skip, head ){\r
var nodes = X.copyArray( elm.childNodes ),\r
i = 0,\r
l = nodes.length,\r
head.appendChild( node );\r
continue;\r
} else\r
- if( X.Dom.cleanupTagNames[ tag ] ){\r
+ if( X.Dom._isCleanupTarget( node ) ){\r
elm.removeChild( node );\r
continue;\r
} else {\r
// ブロック要素直下のスペースだけは削除??\r
default :\r
//console.log( 'Remove type: ' + node.nodeType + ' value: ' + node.nodeValue );\r
- if( !X.UA.Opera7 ){\r
+ if( !X.UA.Opera7 /*&& !X.UA.MacIE */ ){\r
elm.removeChild( node );\r
} else {\r
- X.Dom._o7_remove( node );\r
+ X.Dom._fixed_remove( node );\r
};\r
//++count;\r
};\r
};\r
- })( body );\r
+ })( X.UA.MacIE ? ( copy = body.cloneNode( true ) ) : body );\r
\r
- // body の属性値の取得\r
- html = body.innerHTML;\r
+ if( X.UA.MacIE ){\r
+ document.write( html = copy.innerHTML );\r
+ } else {\r
+ // body の属性値の取得\r
+ html = body.innerHTML;\r
+ \r
+ // Nokia s60 Safari\r
+ if( html === 'fastinnerhtml!' ){\r
+ html = '';\r
+ for( i = 0, l = body.childNodes.length; i < l; ++i ){\r
+ node = body.childNodes[ i ];\r
+ html += ( node.outerHTML || node.data );\r
+ };\r
+ }; \r
+ };\r
\r
body.appendChild( elmProgress = document.createElement( 'div' ) );\r
elmProgress.style.cssText = 'position:absolute;top:0;left:0;z-index:9999;width:0;height:0.5em;background:#00f;overflow:hidden;';\r
elm = elems[ current.j ];\r
tag = elm.tagName && elm.tagName.toUpperCase();\r
if( ( elm.nodeType !== 1 && elm.nodeType !== 3 ) || tag === '!' || ( tag && tag.charAt( 0 ) === '/' ) ){\r
- if( !X.UA.Opera7 ){\r
+ if( !X.UA.Opera7 && !X.UA.MacIE ){\r
elm.parentNode.removeChild( elm );\r
} else {\r
- X.Dom._o7_remove( elm );\r
+ X.Dom._fixed_remove( elm );\r
};\r
continue;\r
};\r
if( elm.nodeType === 3 ){\r
if( !( text = elm.data ) || ( text = X.Dom.cleanupWhiteSpace( text ) ) === ' ' ){\r
//alert( text.charCodeAt( 0 ) );\r
- if( !X.UA.Opera7 ){\r
+ if( !X.UA.Opera7 && !X.UA.MacIE ){\r
elm.parentNode.removeChild( elm );\r
} else {\r
- X.Dom._o7_remove( elm );\r
+ X.Dom._fixed_remove( elm );\r
};\r
continue;\r
};\r
alert( '1:[' +parent._tag + '>' +xnode._tag + '] !== ' + elm.nodeType + '\n' + ( elm.data ) );\r
} else\r
+ if( X.Dom.moveToHead[ tag ] ){\r
+ alert( tag );\r
+ continue;\r
+ } else\r
if( xnode._tag !== tag ){\r
alert( '2:[' +parent._tag + '>' +xnode._tag + ' len:' + (xnode._xnodes ? xnode._xnodes.length : '' ) + '] !== ' + tag + ' ' + (elm.childNodes ? elm.childNodes.length : '' ) + '\n' + elm.outerHTML );\r
} else {\r
xnode.attr( 'value', xnode.html() ).empty();\r
current.xtext = null;\r
} else\r
- if( !xnode.hasClass( 'skip-cleanup' ) && ( X.Dom.cleanupTagNames[ tag ] || xnode.hasClass( 'cleanup-target' ) ) ){ // ie で body 内の script が2度よばれるのに対処\r
+ if( X.Dom._isCleanupTarget( elm ) ){// !xnode.hasClass( 'skip-cleanup' ) && ( X.Dom.cleanupTagNames[ tag ] || xnode.hasClass( 'cleanup-target' ) ) ){ // ie で body 内の script が2度よばれるのに対処\r
//alert( '[' +parent._tag + '>' + xnode._tag + '] remove ... ' );\r
xnode.destroy();\r
} else\r
xnode._rawNode = elm;\r
xnode._root = parent._root;\r
//xnode._tag = X.Dom.DTD.TAG_FIX[ tag ] || tag;\r
- if( !xnode.hasClass( 'skip-cleanup' ) && ( X.Dom.cleanupTagNames[ tag ] || xnode.hasClass( 'cleanup-target' ) ) ){\r
+ if( X.Dom._isCleanupTarget( elm ) ){ //!xnode.hasClass( 'skip-cleanup' ) && ( X.Dom.cleanupTagNames[ tag ] || xnode.hasClass( 'cleanup-target' ) ) ){\r
xnode.destroy();\r
break;\r
};\r
getAttr : function( name ){\r
var attrs = this.attrObject || this.attrClass.prototype || X.UI.AttrClass,\r
support = this.supportAttrs[ name ],\r
- v;\r
+ v, type, list;\r
if( !support ) return;\r
\r
if( name.indexOf( 'border' ) === 0 ){\r
mesure : function(){\r
var dirty = this.dirty,\r
w, h, xnode;\r
+ \r
+ if( dirty === X.UI.Dirty.CLEAN ){\r
+ if( this.percentWidth || this.percentHeight ){\r
+ \r
+ };\r
+ };\r
+ \r
switch( dirty ){\r
\r
case X.UI.Dirty.CONTENT : // コンテンツが変更された\r
- case X.UI.Dirty.FONT : // フォントサイズが変更された\r
- delete this.lastContentWidth;\r
+ case X.UI.Dirty.FONT : // フォントサイズが変更された\r
+ delete this.lastContentWidth; \r
+ \r
case X.UI.Dirty.LAYOUT : // レイアウトの再計算が必要\r
\r
default : // TODO レイアウト崩れに対処 パフォーマンス悪い!\r
},\r
\r
calculate : function( data, isNeedsDetection, x, y, w, h ){\r
- var uinodes, l, _x, _y, _w, _h, node;\r
+ var uinodes, l, i, _x, _y, _w, _h, node;\r
\r
data.preMesure( w, h );\r
\r
uinodes = data.uinodes,\r
l = uinodes && uinodes.length, \r
childW, childH, gapY,\r
- i, _x, _y, _w, node;\r
+ i, _x, _y, _w, node,\r
+ contentW, contentH, autoW, autoH, detectionPhase;\r
\r
data.preMesure( w, h );\r
\r
uinodes = data.uinodes,\r
l = uinodes && uinodes.length, \r
childW, childH, gapX,\r
- i, _x, _y, _h, node;\r
+ i, _x, _y, _h, node,\r
+ contentW, contentH, autoW, autoH, detectionPhase;\r
\r
data.preMesure( w, h );\r
\r