checkbox : true\r
},\r
\r
+// 自由な内容が入るため、参照文字への変換が必要\r
+X_Node_Attr_toChrReferance = {\r
+ value : true,\r
+ title : true,\r
+ alt : true\r
+},\r
+\r
X_Node_Attr_renameForTag = {};\r
// http://nanto.asablo.jp/blog/2005/10/29/123294\r
// checked -> defaultChecked\r
// 動的に生成した input 要素を文書ツリーに挿入する前に設定した checked 属性は反映されず、defaultChecked だと反映される\r
- // 先頭にスペース\r
-function X_Node_Attr_objToAttrText( obj ){\r
- var noValue = X_Node_Attr_noValue,\r
- attrs = [ '' ], n = 0, k, v;\r
- if( !obj ) return ''; // Opera7\r
- for( k in obj ){\r
- //if( X_EMPTY_OBJECT[ k ] ) continue;\r
- v = obj[ k ];\r
- if( k === 'value' ){\r
- v = v.split( '"' ).join( '"' ).split( '>' ).join( '>' ).split( '<' ).join( '<' );\r
+ // ロードイベントを拾うために、要素生成時にネットワーク関連の属性を設定しない。\r
+ // -> src (img, iframe, ), link の href, <param name="movie" src=>\r
+ // \r
+function X_Node_Attr_objToAttrText( that, skipNetworkForElmCreation ){\r
+ var obj = that._attrs,\r
+ noValue = X_Node_Attr_noValue,\r
+ attrs = [ '' ], // 先頭にスペース\r
+ plain = X_EMPTY_OBJECT,\r
+ n = 0, k, check;\r
+\r
+ if( skipNetworkForElmCreation ){\r
+ delete that._newAttrs;\r
+ // このあとで _newAttr にネットワーク系の属性を控える, attrText には加えない\r
+ } else {\r
+ that._flags &= ~X_Node_State.OLD_ATTRTEXT;\r
+ // 完全な attrText\r
+ };\r
+ \r
+ if( !obj ){ // Opera7\r
+ delete that._attrText;\r
+ return '';\r
+ };\r
+ \r
+ for( k in obj ){\r
+ if( plain[ k ] ) continue;\r
+ \r
+ if( skipNetworkForElmCreation ){\r
+ check = false;\r
+ switch( that._tag + k ){\r
+ case 'PARAMvalue' :\r
+ check = obj[ 'name' ] !== 'movie';\r
+ case 'INPUTsrc' :\r
+ check = check || ( obj[ 'type' ] !== 'image' );\r
+ case 'LINKhref' :\r
+ check = check || ( obj[ 'rel' ] !== 'stylesheet' );\r
+ \r
+ if( !check ) break;\r
+\r
+ case 'IMGsrc' :\r
+ case 'IFRAMEsrc' :\r
+ case 'FRAMEsrc' :\r
+ case 'SCRIPTsrc' :\r
+ case 'EMBEDsrc' :\r
+ case 'OBJECTdata' :\r
+ case 'BGSOUNDsrc' :\r
+ case 'APPLETcode' :\r
+ //case 'AUDIOsrc' :\r
+ //case 'VIDEOsrc' :\r
+ if( !that._newAttrs ) that._newAttrs = {};\r
+ that._newAttrs[ k ] = obj[ k ];\r
+ continue;\r
};\r
- attrs[ ++n ] = noValue[ k ] ? k : [ k, '="', v, '"' ].join( '' );\r
};\r
- return 0 < n ? attrs.join( ' ' ) : '';\r
+\r
+ attrs[ ++n ] = noValue[ k ] ? k : [\r
+ k, '="',\r
+ X_Node_Attr_toChrReferance[ k ] ? X_String_toChrReferance( obj[ k ] ) : obj[ k ],\r
+ '"' ].join( '' );\r
+ };\r
+ \r
+ if( 0 < n ){\r
+ return that._attrText = attrs.join( ' ' );\r
+ };\r
+ delete that._attrText;\r
+ return '';\r
};\r
\r
(function( renameForDOM, renameForTag ){\r
Node.prototype.attr = function( nameOrObj /* v */ ){\r
var attrs = this._attrs, newAttrs, f, k, elm, v;\r
\r
- if( this._xnodeType !== 1 ) return this;\r
+ if( !this._tag ) return this;\r
\r
if( nameOrObj && X.Type.isObject( nameOrObj ) ){\r
attrs || ( attrs = this._attrs = {} );\r
if( X_Node_Attr_setAttr( this, attrs, newAttrs, k, nameOrObj[ k ] ) === true ) f = true;\r
};\r
if( f ){\r
- this._attrText = false;\r
- this._flags |= X_Node_State.DIRTY_ATTR;\r
- this._root && X_Node_reserveUpdate();\r
+ delete this._attrText;\r
+ this._flags |= X_Node_State.DIRTY_ATTR | X_Node_State.OLD_ATTRTEXT;\r
+ this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();\r
};\r
return this;\r
} else\r
if( 1 < arguments.length ){\r
// setter\r
if( X_Node_Attr_setAttr( this, attrs || ( this._attrs = {} ), this._newAttrs || ( this._newAttrs = {} ), nameOrObj, arguments[ 1 ] ) === true ){\r
- this._attrText = false;\r
- this._flags |= X_Node_State.DIRTY_ATTR;\r
- this._root && X_Node_reserveUpdate();\r
+ delete this._attrText;\r
+ this._flags |= X_Node_State.DIRTY_ATTR | X_Node_State.OLD_ATTRTEXT;\r
+ this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();\r
};\r
return this;\r
} else\r
case 'tag' :\r
case 'tagName' :\r
return this._tag;\r
- case 'nodeType' :\r
- return this._tag ? 1 : 3;\r
case 'style' :\r
case 'cssText' :\r
return this.cssText();\r
- case 'text' :\r
- return this.text();\r
- case 'html' :\r
- case 'innerHTML' :\r
- return this.html();\r
- case 'outerHTML' :\r
- X_Node_outerXNode = this;\r
- v = this.html();\r
- X_Node_outerXNode = null;\r
- return v;\r
\r
+ case 'src' : // src は遷移して変化する, name も?\r
+ if( this._tag !== 'IFRAME' ) break;\r
+ if( this._newAttrs && X_Object_inObject( nameOrObj, this._newAttrs ) ) return this._newAttrs[ nameOrObj ];\r
+ if( elm = X_UA_DOM.IE4 ? this._rawObject || X_Node__ie4getRawNode( this ) : this._rawObject ){\r
+ if( !attrs ) attrs = this._attrs = {};\r
+ return attrs[ nameOrObj ] = elm[ nameOrObj ]; // getAttribute( nameOrObj )?\r
+ };\r
+ break;\r
+ \r
case 'selected' :\r
// kquery.js : safariのバグ対策\r
// if ($.browser.safari && key === "selected" && tmp) tmp.selectedIndex;\r
if( v !== that._id ){\r
that._id = v;\r
that._flags |= X_Node_State.DIRTY_ID;\r
- that._root && X_Node_reserveUpdate();\r
+ that._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();\r
};\r
return; \r
case 'class' :\r
\r
if( v == null ){\r
newAttrs[ name ] = undefined;\r
- if( attrs.hasOwnProperty( name ) ) delete attrs[ name ];\r
+ if( X_Object_inObject( name, attrs ) ) delete attrs[ name ];\r
} else {\r
newAttrs[ name ] = attrs[ name ] = v;\r
};\r