valuetype : 'valueType',\r
checked : 'defaultChecked'\r
},\r
+ \r
+ HAS_VALUE : {\r
+ INPUT : true,\r
+ TEXTAREA : true,\r
+ SELECT : true\r
+ },\r
+ \r
renameForTag : {},\r
+ // http://nanto.asablo.jp/blog/2005/10/29/123294\r
+ // checked -> defaultChecked\r
+ // 動的に生成した input 要素を文書ツリーに挿入する前に設定した checked 属性は反映されず、defaultChecked だと反映される\r
+ // 先頭にスペース\r
objToAttrText : function( obj ){\r
- var attrs = [], noValue = X.Dom.Attr.noValue, p;\r
+ var noValue = X.Dom.Attr.noValue,\r
+ attrs = [ '' ], n = 0, p, v;\r
for( p in obj ){\r
- attrs[ attrs.length ] = noValue[ p ] ? p : [ p, '="', obj[ p ], '"' ].join( '' );\r
+ v = obj[ p ];\r
+ if( p === 'value' ){\r
+ v = v.split( '"' ).join( '"' ).split( '>' ).join( '>' ).split( '<' ).join( '<' );\r
+ };\r
+ attrs[ ++n ] = noValue[ p ] ? p : [ p, '="', v, '"' ].join( '' );\r
};\r
- return attrs.join( ' ' );\r
+ return 0 < n ? attrs.join( ' ' ) : '';\r
}\r
};\r
\r
* \r
*/\r
X.Dom.Node.prototype.attr = function( nameOrObj /* v */ ){\r
- var attrs = this._attrs,\r
- node, v, name;\r
+ var attrs = this._attrs, newAttrs, f, p, elm;\r
\r
- if( this._nodeType !== 1 ) return this;\r
+ if( this._xnodeType !== 1 ) return this;\r
\r
if( nameOrObj && X.Type.isObject( nameOrObj ) ){\r
- if( !attrs ) attrs = this._attrs = {};\r
- node = this._ie4getRawNode ? this._ie4getRawNode() : this._rawNode;\r
+ attrs || ( attrs = this._attrs = {} );\r
+ newAttrs = this._newAttrs || ( this._newAttrs = {} );\r
+ \r
for( p in nameOrObj ){\r
- this.__attr( node, attrs, p, nameOrObj[ p ] );\r
+ if( this._setAttr( attrs, newAttrs, p, nameOrObj[ p ] ) === true ) f = true;\r
+ };\r
+ if( f ){\r
+ delete this._attrText;\r
+ this._dirty |= X.Dom.Dirty.ATTR;\r
+ this._root && this._reserveUpdate(); \r
};\r
- this._attrText = X.Dom.Attr.objToAttrText( this._attrs );\r
return this;\r
} else\r
if( 1 < arguments.length ){\r
// setter\r
- // this._attrText use when Node.create()\r
- if( !attrs ) attrs = this._attrs = {};\r
- this.__attr(\r
- this._ie4getRawNode ? ( this._rawNode || this._ie4getRawNode() ) : this._rawNode,\r
- attrs, nameOrObj, arguments[ 1 ]\r
- );\r
- //if( !attrs[ name ] ){\r
- // !this._attrText ? ( this._attrText = '' ) : ( this._attrText += ' ' );\r
- // this._attrText += X.Dom.Attr.noValue[ name ] ? name : name + '="' + v + '"';\r
- // attrs[ name ] = v;\r
- //} else {\r
- // attrs[ name ] = v;\r
- this._attrText = X.Dom.Attr.objToAttrText( attrs );\r
- //};\r
+ if( this._setAttr( attrs || ( this._attrs = {} ), this._newAttrs || ( this._newAttrs = {} ), nameOrObj, arguments[ 1 ] ) === true ){\r
+ delete this._attrText;\r
+ this._dirty |= X.Dom.Dirty.ATTR;\r
+ this._root && this._reserveUpdate();\r
+ };\r
return this;\r
} else\r
- if( typeof nameOrObj === 'string' ){\r
+ if( nameOrObj === 'value' && X.Dom.Attr.HAS_VALUE[ this._tag.toUpperCase() ] ){\r
+ if( this._newAttrs && this._newAttrs.value ) return this._newAttrs.value;\r
+ if( elm = X.Dom.DOM_IE4 ? this._rawNode || this._ie4getRawNode() : this._rawNode ){\r
+ attrs.value = elm.value;\r
+ };\r
+ return attrs.value;\r
+ } else\r
+ if( typeof nameOrObj === 'string' && attrs ){\r
// getter\r
- if( !attrs ) return;\r
- \r
- return attrs[ v ];\r
+ return attrs[ nameOrObj ];\r
};\r
};\r
-X.Dom.Node.prototype.__attr = function( node, attrs, name, v ){\r
- name = X.Dom.Attr.renameForTag[ name ] || name;\r
+X.Dom.Node.prototype._setAttr = function( attrs, newAttrs, name, v ){\r
+ if( name === 'UID' ) return;\r
+ if( name === 'id' ){\r
+ v = ( v !== 'ie4uid' + this._uid ) ? v : undefined;\r
+ if( v !== this._id ){\r
+ this._id = v;\r
+ this._dirty |= X.Dom.Dirty.ID;\r
+ this._root && this._reserveUpdate();\r
+ };\r
+ return;\r
+ }; \r
+ if( name === 'class' ) return this.className( v ); \r
+ if( name === 'style' ) return this.cssText( v );\r
\r
- if( attrs[ name ] === v ) return;\r
- if( name === 'style' ){\r
- return this.cssText( v );\r
- };\r
if( name.indexOf( 'on' ) === 0 ){\r
X.Notification.warn( 'xnode.attr("' + name + '") is wrong, xnode.listen() & xnode.unlisten().' );\r
return;\r
};\r
- // className\r
- if( name === 'class' ) return this.className( v );\r
- // update node\r
- if( node ){\r
- this._ie4getRawNode ?\r
- v ? node.setAttribute( name, v ) : node.removeAttribute( name ) : // val\r
- ( node[ X.Dom.Attr.renameForDOM[ name ] || name ] = v || undefined ); // val\r
- };\r
- // id\r
- if( name === 'id' ){\r
- this._id = v === 'ie4uid' + this._uid ? undefined : !v ? undefined : v;\r
- return;\r
- };\r
- // update this._attrs\r
- if( !v ){\r
- delete attrs[ name ];\r
+ \r
+ name = X.Dom.Attr.renameForTag[ name ] || name;\r
+ if( attrs[ name ] === v ) return;\r
+ \r
+ if( v == null ){\r
+ newAttrs[ name ] = undefined;\r
+ if( attrs.hasOwnProperty( name ) ) delete attrs[ name ];\r
} else {\r
- attrs[ name ] = v;\r
+ newAttrs[ name ] = attrs[ name ] = v;\r
};\r
-};
\ No newline at end of file
+ return true;\r
+};\r
+\r