OSDN Git Service

Version 0.6.48, fix X.UA for s60 Safari.
[pettanr/clientJs.git] / 0.6.x / js / dom / 14_XDomAttr.js
1 X.Dom.Attr = {\r
2         noValue : {\r
3                 checked  : 1,\r
4                 compact  : 1,\r
5                 declare  : 1,\r
6                 defer    : 1,\r
7                 disabled : 1,\r
8                 ismap    : 1,\r
9                 multiple : 1,\r
10                 nohref   : 1,\r
11                 noresize : 1,\r
12                 noshade  : 1,\r
13                 nowrap   : 1,\r
14                 readonly : 1,\r
15                 selected : 1\r
16         },\r
17         renameForDOM : {\r
18                 'class'          : 'className',\r
19                 accesskey        : 'accessKey',\r
20                 'accept-charset' : 'acceptCharset',\r
21                 bgcolor          : 'bgColor',\r
22                 cellpadding      : 'cellPadding',\r
23                 cellspacing      : 'cellSpacing',\r
24                 'char'           : 'ch',\r
25                 charoff          : 'chOff',\r
26                 codebase         : 'codeBase',\r
27                 codetype         : 'codeType',\r
28                 colspan          : 'colSpan',\r
29                 datetime         : 'dateTime',\r
30                 'for'            : 'htmlFor',\r
31                 frameborder      : 'frameBorder',\r
32                 'http-equiv'     : 'httpEquiv',\r
33                 ismap            : 'isMap',\r
34                 longdesc         : 'longDesc',\r
35                 maxlength        : 'maxLength',\r
36                 nohref           : 'noHref',\r
37                 readonly         : 'readOnly',\r
38                 rowspan          : 'rowSpan',\r
39                 tabindex         : 'tabIndex',\r
40                 usemap           : 'useMap',\r
41                 valuetype        : 'valueType',\r
42                 checked          : 'defaultChecked'\r
43         },\r
44         \r
45         HAS_VALUE : {\r
46                 INPUT    : true,\r
47                 TEXTAREA : true,\r
48                 SELECT   : true\r
49         },\r
50         \r
51         renameForTag : {},\r
52         // http://nanto.asablo.jp/blog/2005/10/29/123294\r
53         // checked -> defaultChecked\r
54         // 動的に生成した input 要素を文書ツリーに挿入する前に設定した checked 属性は反映されず、defaultChecked だと反映される\r
55         // 先頭にスペース\r
56         objToAttrText : function( obj ){\r
57                 var noValue = X.Dom.Attr.noValue,\r
58                         attrs = [ '' ], n = 0, p, v;\r
59                 if( !obj ) return ''; // Opera7\r
60                 for( p in obj ){\r
61                         v = obj[ p ];\r
62                         if( p === 'value' ){\r
63                                 v = v.split( '"' ).join( '&quot;' ).split( '>' ).join( '&gt;' ).split( '<' ).join( '&lt;' );\r
64                         };\r
65                         attrs[ ++n ] = noValue[ p ] ? p : [ p, '="', v, '"' ].join( '' );\r
66                 };\r
67                 return 0 < n ? attrs.join( ' ' ) : '';\r
68         }\r
69 };\r
70 \r
71 (function( renameForDOM, renameForTag ){\r
72         var name, i;\r
73         for( name in renameForDOM ){\r
74                 renameForTag[ renameForDOM[ name ] ] = name;\r
75         };\r
76 })( X.Dom.Attr.renameForDOM, X.Dom.Attr.renameForTag );\r
77 \r
78 \r
79 \r
80 /* --------------------------------------\r
81  *  attribute\r
82  *  X.Dom.Attr.toIndex に定義されている 属性の場合\r
83  * \r
84  * http://nanto.asablo.jp/blog/2005/10/29/123294\r
85  * className, onclick等 はここで設定しない\r
86  * \r
87  */\r
88 X.Dom.Node.prototype.attr = function( nameOrObj /* v */ ){\r
89         var attrs = this._attrs, newAttrs, f, p, elm;\r
90         \r
91         if( this._xnodeType !== 1 ) return this;\r
92         \r
93         if( nameOrObj && X.Type.isObject( nameOrObj ) ){\r
94                 attrs || ( attrs = this._attrs = {} );\r
95                 newAttrs = this._newAttrs || ( this._newAttrs = {} );\r
96                 \r
97                 for( p in nameOrObj ){\r
98                         if( this._setAttr( attrs, newAttrs, p, nameOrObj[ p ] ) === true ) f = true;\r
99                 };\r
100                 if( f ){\r
101                         this._attrText = false;\r
102                         this._dirty |= X.Dom.Dirty.ATTR;\r
103                         this._root && this._reserveUpdate();                    \r
104                 };\r
105                 return this;\r
106         } else\r
107         if( 1 < arguments.length ){\r
108                 // setter\r
109                 if( this._setAttr( attrs || ( this._attrs = {} ), this._newAttrs || ( this._newAttrs = {} ), nameOrObj, arguments[ 1 ] ) === true ){\r
110                         this._attrText = false;\r
111                         this._dirty |= X.Dom.Dirty.ATTR;\r
112                         this._root && this._reserveUpdate();\r
113                 };\r
114                 return this;\r
115         } else\r
116         if( nameOrObj === 'value' && X.Dom.Attr.HAS_VALUE[ this._tag.toUpperCase() ] ){\r
117                 if( this._newAttrs && this._newAttrs.value ) return this._newAttrs.value;\r
118                 if( elm = X.Dom.DOM_IE4 ? this._rawNode || this._ie4getRawNode() : this._rawNode ){\r
119                         attrs.value = elm.value;\r
120                 };\r
121                 return attrs.value;\r
122         } else\r
123         if( typeof nameOrObj === 'string' && attrs ){\r
124                 // getter\r
125                 switch( nameOrObj ){\r
126                         case 'id' :\r
127                                 return this._tag;\r
128                         case 'class' :\r
129                         case 'className' :\r
130                                 return this._className;\r
131                         case 'tag' :\r
132                         case 'tagName' :\r
133                                 return this._tag;\r
134                         case 'style' :\r
135                         case 'cssText' :\r
136                                 return this.cssText();\r
137                 };\r
138                 return attrs[ X.Dom.Attr.renameForTag[ nameOrObj ] || nameOrObj ];\r
139         };\r
140 };\r
141 X.Dom.Node.prototype._setAttr = function( attrs, newAttrs, name, v ){\r
142         if( name === 'UID' ) return;\r
143         if( name === 'id' ){\r
144                 v = ( v !== 'ie4uid' + this._uid ) ? v : undefined;\r
145                 if( v !== this._id ){\r
146                         this._id = v;\r
147                         this._dirty |= X.Dom.Dirty.ID;\r
148                         this._root && this._reserveUpdate();\r
149                 };\r
150                 return;\r
151         };      \r
152         if( name === 'class' ) return this.className( v );      \r
153         if( name === 'style' ) return this.cssText( v );\r
154         \r
155         if( name.indexOf( 'on' ) === 0 ){\r
156                 X.Notification.warn( 'xnode.attr("' + name + '") is wrong, xnode.listen() & xnode.unlisten().' );\r
157                 return;\r
158         };\r
159         \r
160         name = X.Dom.Attr.renameForTag[ name ] || name;\r
161         if( attrs[ name ] === v ) return;\r
162         \r
163         if( v == null ){\r
164                 newAttrs[ name ] = undefined;\r
165                 if( attrs.hasOwnProperty( name ) ) delete attrs[ name ];\r
166         } else {\r
167                 newAttrs[ name ] = attrs[ name ] = v;\r
168         };\r
169         return true;\r
170 };\r
171 \r