OSDN Git Service

Version 0.6.21, fix performance.
[pettanr/clientJs.git] / 0.6.x / js / dom / 14_XDomAttr.js
1 X.Dom.Attr = {\r
2         toName  : [],\r
3         toIndex : {\r
4                 id           : 0,\r
5                 className    : 1,\r
6                 'class'      : 1, //\r
7                 name         : 2,\r
8                 title        : 3,\r
9                 accessKey    : 4,\r
10                 accesskey    : 4, //\r
11                 tabIndex     : 5,\r
12                 tabindex     : 5, //\r
13                 dir          : 6,\r
14                 lang         : 7,\r
15                 'xml:lang'   : 8,\r
16                 'xml:space'  : 9,\r
17                 abbr         : 10,\r
18                 accept       : 11,\r
19                 acceptCharset : 12,\r
20                 'accept-charset' : 12,\r
21                 action       : 13,\r
22                 align        : 14,\r
23                 alink        : 15,\r
24                 alt          : 16,\r
25                 archive      : 17,\r
26                 axis         : 18,\r
27                 background   : 19,\r
28                 bgColor      : 20,\r
29                 bgcolor      : 20, //\r
30                 border       : 21,\r
31                 cellPadding  : 22,\r
32                 cellpadding  : 22, //\r
33                 cellSpacing  : 23,\r
34                 cellspacing  : 23, //\r
35                 ch           : 24,\r
36                 'char'       : 24, //\r
37                 chOff        : 25,\r
38                 charoff      : 25, //\r
39                 charset      : 26,\r
40                 checked      : 27,\r
41                 cite         : 28,\r
42                 classid      : 29,\r
43                 clear        : 30,\r
44                 code         : 31,\r
45                 codeBase     : 32,\r
46                 codebase     : 32, //\r
47                 codeType     : 33,\r
48                 codetype     : 33, //\r
49                 color        : 34,\r
50                 cols         : 35,\r
51                 colspan      : 36,\r
52                 colSpan      : 36,\r
53                 compact      : 37,\r
54                 content      : 38,\r
55                 coords       : 39,\r
56                 data         : 40,\r
57                 dateTime     : 41,\r
58                 datetime     : 41, //\r
59                 declare      : 42,\r
60                 defer        : 43,\r
61                 disabled     : 44,\r
62                 enctype      : 45,\r
63                 face         : 46,\r
64                 htmlFor      : 47,\r
65                 'for'        : 47, //\r
66                 frame        : 48,\r
67                 frameBorder  : 49,\r
68                 frameborder  : 49, //\r
69                 headers      : 50,\r
70                 height       : 51,\r
71                 href         : 52,\r
72                 hreflang     : 53,\r
73                 hspace       : 54,\r
74                 httpEquiv    : 55,\r
75                 'http-equiv' : 55, //\r
76                 ismap        : 56,\r
77                 isMap        : 56,\r
78                 label        : 57,\r
79                 language     : 58,\r
80                 longDesc     : 59,\r
81                 longdesc     : 59, //\r
82                 marginheight : 60,\r
83                 marginwidth  : 61,\r
84                 maxLength    : 62,\r
85                 maxlength    : 62, //\r
86                 media        : 63,\r
87                 method       : 64,\r
88                 multiple     : 65,\r
89                 noHref       : 66,\r
90                 nohref       : 66,\r
91                 noresize     : 67,\r
92                 noshade      : 68,\r
93                 nowrap       : 69,\r
94                 object       : 71,\r
95                 profile      : 72,\r
96                 prompt       : 73,\r
97                 readOnly     : 74,\r
98                 readonly     : 74,\r
99                 rel          : 75,\r
100                 rev          : 76,\r
101                 rows         : 77,\r
102                 rowspan      : 78,\r
103                 rowSpan      : 78,\r
104                 rules        : 79,\r
105                 scheme       : 80,\r
106                 scope        : 81,\r
107                 scrolling    : 82,\r
108                 selected     : 83,\r
109                 shape        : 84,\r
110                 size         : 85,\r
111                 span         : 86,\r
112                 src          : 87,\r
113                 standby      : 88,\r
114                 start        : 89,\r
115                 summary      : 90,\r
116                 target       : 91,\r
117                 text         : 92,\r
118                 type         : 93,\r
119                 useMap       : 94,\r
120                 usemap       : 94,\r
121                 valign       : 95,\r
122                 value        : 96,\r
123                 valueType    : 97,\r
124                 valuetype    : 97,\r
125                 version      : 98,\r
126                 vlink        : 99,\r
127                 vspace       : 100,\r
128                 width        : 101,\r
129                 wrap         : 102,\r
130                 xmlns        : 103\r
131         },\r
132         noValue : {\r
133                 checked  : 1,\r
134                 compact  : 1,\r
135                 declare  : 1,\r
136                 defer    : 1,\r
137                 disabled : 1,\r
138                 ismap    : 1,\r
139                 multiple : 1,\r
140                 nohref   : 1,\r
141                 noresize : 1,\r
142                 noshade  : 1,\r
143                 nowrap   : 1,\r
144                 readonly : 1,\r
145                 selected : 1\r
146         },\r
147         renameForDOM : {\r
148                 'class'          : 'className',\r
149                 accesskey        : 'accessKey',\r
150                 'accept-charset' : 'acceptCharset',\r
151                 bgcolor          : 'bgColor',\r
152                 cellpadding      : 'cellPadding',\r
153                 cellspacing      : 'cellSpacing',\r
154                 'char'           : 'ch',\r
155                 charoff          : 'chOff',\r
156                 codebase         : 'codeBase',\r
157                 codetype         : 'codeType',\r
158                 colspan          : 'colSpan',\r
159                 datetime         : 'dateTime',\r
160                 'for'            : 'htmlFor',\r
161                 frameborder      : 'frameBorder',\r
162                 'http-equiv'     : 'httpEquiv',\r
163                 ismap            : 'isMap',\r
164                 longdesc         : 'longDesc',\r
165                 maxlength        : 'maxLength',\r
166                 nohref           : 'noHref',\r
167                 readonly         : 'readOnly',\r
168                 rowspan          : 'rowSpan',\r
169                 tabindex         : 'tabIndex',\r
170                 usemap           : 'useMap',\r
171                 valuetype        : 'valueType',\r
172                 checked          : 'defaultChecked'\r
173         },\r
174         renameForTag : {},\r
175         objToAttrText : function( obj ){\r
176                 var noValue = X.Dom.Attr.noValue, attrs = [], n = -1, p;\r
177                 for( p in obj ){\r
178                         attrs[ ++n ] = noValue[ p ] ? p : [ p, '="', obj[ p ], '"' ].join( '' );\r
179                 };\r
180                 return attrs.join( ' ' );\r
181         }\r
182 };\r
183 \r
184 (function( toIndex, toName, renameForDOM, renameForTag ){\r
185         var name, i;\r
186         for( name in toIndex ){\r
187                 if( typeof ( i = toIndex[ name ] ) === 'number' ){\r
188                         toName[ i ] = name;\r
189                 };\r
190         };\r
191         for( name in renameForDOM ){\r
192                 renameForTag[ renameForDOM[ name ] ] = name;\r
193         };\r
194 })( X.Dom.Attr.toIndex, X.Dom.Attr.toName, X.Dom.Attr.renameForDOM, X.Dom.Attr.renameForTag );\r
195 \r
196 \r
197 \r
198 /* --------------------------------------\r
199  *  attribute\r
200  *  X.Dom.Attr.toIndex に定義されている 属性の場合\r
201  * \r
202  * http://nanto.asablo.jp/blog/2005/10/29/123294\r
203  * className, onclick等 はここで設定しない\r
204  * \r
205  */\r
206 X.Dom.Node.prototype.attr = function( nameOrObj /* v */ ){\r
207         var attrs = this._attrs, newAttrs, f;\r
208         \r
209         if( this._xnodeType !== 1 ) return this;\r
210         \r
211         if( nameOrObj && X.Type.isObject( nameOrObj ) ){\r
212                 attrs || ( attrs = this._attrs = {} );\r
213                 newAttrs = this._newAttrs || ( this._newAttrs = {} );\r
214                 \r
215                 for( p in nameOrObj ){\r
216                         if( this._setAttr( attrs, newAttrs, p, nameOrObj[ p ] ) === true ) f = true;\r
217                 };\r
218                 if( f ){\r
219                         delete this._attrText;\r
220                         this._dirty |= X.Dom.Dirty.ATTR;\r
221                         this._root && this._reserveUpdate();                    \r
222                 };\r
223                 return this;\r
224         } else\r
225         if( 1 < arguments.length ){\r
226                 // setter\r
227                 if( this._setAttr( attrs || ( this._attrs = {} ), this._newAttrs || ( this._newAttrs = {} ), nameOrObj, arguments[ 1 ] ) === true ){\r
228                         delete this._attrText;\r
229                         this._dirty |= X.Dom.Dirty.ATTR;\r
230                         this._root && this._reserveUpdate();\r
231                 };\r
232                 return this;\r
233         } else\r
234         if( typeof nameOrObj === 'string' && attrs ){\r
235                 // getter\r
236                 return attrs[ nameOrObj ];\r
237         };\r
238 };\r
239 X.Dom.Node.prototype._setAttr = function( attrs, newAttrs, name, v ){\r
240         if( name === 'UID' ) return;\r
241         if( name === 'id' ){\r
242                 v = v !== 'ie4uid' + this._uid ? v : undefined;\r
243                 if( v !== this._id ){\r
244                         this._id = v;\r
245                         this._dirty |= X.Dom.Dirty.ID;\r
246                         this._root && this._reserveUpdate();\r
247                 };\r
248                 return;\r
249         };      \r
250         if( name === 'class' ) return this.className( v );      \r
251         if( name === 'style' ) return this.cssText( v );\r
252         \r
253         if( name.indexOf( 'on' ) === 0 ){\r
254                 X.Notification.warn( 'xnode.attr("' + name + '") is wrong, xnode.listen() & xnode.unlisten().' );\r
255                 return;\r
256         };\r
257         \r
258         name = X.Dom.Attr.renameForTag[ name ] || name;\r
259         if( attrs[ name ] === v ) return;\r
260         \r
261         if( v == null ){\r
262                 newAttrs[ name ] = undefined;\r
263                 if( attrs.hasOwnProperty( name ) ) delete attrs[ name ];\r
264         } else {\r
265                 newAttrs[ name ] = attrs[ name ] = v;\r
266         };\r
267         return true;\r
268 };\r
269 \r