1 var X_Node_Attr_noValue = {
\r
16 X_Node_Attr_renameForDOM = {
\r
17 'class' : 'className',
\r
18 accesskey : 'accessKey',
\r
19 'accept-charset' : 'acceptCharset',
\r
20 bgcolor : 'bgColor',
\r
21 cellpadding : 'cellPadding',
\r
22 cellspacing : 'cellSpacing',
\r
25 codebase : 'codeBase',
\r
26 codetype : 'codeType',
\r
27 colspan : 'colSpan',
\r
28 datetime : 'dateTime',
\r
30 frameborder : 'frameBorder',
\r
31 'http-equiv' : 'httpEquiv',
\r
33 longdesc : 'longDesc',
\r
34 maxlength : 'maxLength',
\r
36 readonly : 'readOnly',
\r
37 rowspan : 'rowSpan',
\r
38 tabindex : 'tabIndex',
\r
40 valuetype : 'valueType',
\r
41 checked : 'defaultChecked'
\r
44 X_Node_Attr_HAS_VALUE = {
\r
50 PARAM : true // FlashVars が flash 側から書き換えられるケースがある??
\r
53 // <input type=button,hidden,submit,reset,radio,checkbox> の場合、value の値はユーザーで変えることはない
\r
54 // <input type=text,password,file> はユーザーによって常に変更される HTML5 ではこれにさらにいろいろ加わる
\r
55 X_Node_Attr_STATIC_VALUE_TYPES = {
\r
64 X_Node_Attr_renameForTag = {};
\r
65 // http://nanto.asablo.jp/blog/2005/10/29/123294
\r
66 // checked -> defaultChecked
\r
67 // 動的に生成した input 要素を文書ツリーに挿入する前に設定した checked 属性は反映されず、defaultChecked だと反映される
\r
68 // ロードイベントを拾うために、要素生成時にネットワーク関連の属性を設定しない。
\r
69 // -> src (img, iframe, ), link の href, <param name="movie" src=>
\r
70 function X_Node_Attr_objToAttrText( that, skipNetwork, escape ){ // TODO value の escape " -> "
\r
71 var obj = that._attrs,
\r
72 noValue = X_Node_Attr_noValue,
\r
73 attrs = [ '' ], // 先頭にスペース
\r
74 plain = X_EMPTY_OBJECT,
\r
75 n = 0, k, hasNetwork;
\r
77 that._flags &= ~X_Node_State.OLD_ATTRTEXT;
\r
79 if( !obj ){ // Opera7
\r
80 delete that._attrText;
\r
84 if( plain[ k ] ) continue;
\r
89 if( that._tag === 'LINK' && that._attr && that._attr.name === 'movie' ){
\r
100 if( that._tag === 'LINK' ){
\r
107 attrs[ ++n ] = noValue[ k ] ? k : [
\r
109 k === 'value' ? X_String_toChrReferance( obj[ k ] ) : obj[ k ],
\r
113 //if( hasNetwork ) that._flags |= X_Node_State.IE_NETWORK_ATTR
\r
116 return that._attrText = attrs.join( ' ' );
\r
118 delete that._attrText;
\r
122 (function( renameForDOM, renameForTag ){
\r
124 for( k in renameForDOM ){
\r
125 //if( X_EMPTY_OBJECT[ k ] ) continue;
\r
126 renameForTag[ renameForDOM[ k ] ] = k;
\r
128 })( X_Node_Attr_renameForDOM, X_Node_Attr_renameForTag );
\r
132 /* --------------------------------------
\r
135 * http://nanto.asablo.jp/blog/2005/10/29/123294
\r
136 * className, onclick等 はここで設定しない
\r
139 Node.prototype.attr = function( nameOrObj /* v */ ){
\r
140 var attrs = this._attrs, newAttrs, f, k, elm, v;
\r
142 if( !this._tag ) return this;
\r
144 if( nameOrObj && X.Type.isObject( nameOrObj ) ){
\r
145 attrs || ( attrs = this._attrs = {} );
\r
146 newAttrs = this._newAttrs || ( this._newAttrs = {} );
\r
148 for( k in nameOrObj ){
\r
149 //if( X_EMPTY_OBJECT[ k ] ) continue;
\r
150 if( X_Node_Attr_setAttr( this, attrs, newAttrs, k, nameOrObj[ k ] ) === true ) f = true;
\r
153 delete this._attrText;
\r
154 this._flags |= X_Node_State.DIRTY_ATTR | X_Node_State.OLD_ATTRTEXT;
\r
155 this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();
\r
159 if( 1 < arguments.length ){
\r
161 if( X_Node_Attr_setAttr( this, attrs || ( this._attrs = {} ), this._newAttrs || ( this._newAttrs = {} ), nameOrObj, arguments[ 1 ] ) === true ){
\r
162 delete this._attrText;
\r
163 this._flags |= X_Node_State.DIRTY_ATTR | X_Node_State.OLD_ATTRTEXT;
\r
164 this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();
\r
168 if( typeof nameOrObj === 'string' ){
\r
170 switch( nameOrObj ){
\r
175 return this._className;
\r
181 return this.cssText();
\r
184 // kquery.js : safariのバグ対策
\r
185 // if ($.browser.safari && key === "selected" && tmp) tmp.selectedIndex;
\r
186 // 親ノードの selectedIndex の getter を呼んでおくと値が正しくなる、ということ?( by itozyun )
\r
187 if( X_UA.WebKit ) this._rawObject.parentNode && this._rawObject.parentNode.selectedIndex;
\r
189 if( this._tag === 'INPUT' && X_Node_Attr_STATIC_VALUE_TYPES[ attrs[ 'type' ] ] ) break;
\r
192 case 'selectedIndex' :
\r
193 if( X_Node_Attr_HAS_VALUE[ this._tag ] ){
\r
194 if( this._newAttrs && X_Object_inObject( nameOrObj, this._newAttrs ) ) return this._newAttrs[ nameOrObj ];
\r
195 if( elm = X_UA_DOM.IE4 ? this._rawObject || X_Node__ie4getRawNode( this ) : this._rawObject ){
\r
196 if( !attrs ) attrs = this._attrs = {};
\r
197 return attrs[ nameOrObj ] = elm[ nameOrObj ]; // getAttribute( nameOrObj )?
\r
202 return attrs && attrs[ X_Node_Attr_renameForTag[ nameOrObj ] || nameOrObj ];
\r
205 function X_Node_Attr_setAttr( that, attrs, newAttrs, name, v ){
\r
207 // case 'type' : TODO IE は input, button, object に対して type の再設定が出来ない _state が要素生成済なら不可
\r
213 v = ( v !== 'ie4uid' + that._uid ) ? v : undefined;
\r
214 // TODO unique の check
\r
215 if( v !== that._id ){
\r
217 that._flags |= X_Node_State.DIRTY_ID;
\r
218 that._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();
\r
223 return that.className( v );
\r
226 return that.cssText( v );
\r
228 return that.text( v );
\r
230 return that.html( v );
\r
233 if( name.indexOf( 'on' ) === 0 ){
\r
234 X.Logger.warn( 'xnode.attr("' + name + '") is wrong, xnode.listen() & xnode.unlisten().' );
\r
238 name = X_Node_Attr_renameForTag[ name ] || name;
\r
239 if( attrs[ name ] === v ) return;
\r
242 newAttrs[ name ] = undefined;
\r
243 if( X_Object_inObject( name, attrs ) ) delete attrs[ name ];
\r
245 newAttrs[ name ] = attrs[ name ] = v;
\r