OSDN Git Service

0ba8b5160e2268077ad0afa5b6f4d4b7c60ab5b3
[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         // http://nanto.asablo.jp/blog/2005/10/29/123294\r
176         // checked -> defaultChecked\r
177         // 動的に生成した input 要素を文書ツリーに挿入する前に設定した checked 属性は反映されず、defaultChecked だと反映される\r
178         // 先頭にスペース\r
179         objToAttrText : function( obj ){\r
180                 var noValue = X.Dom.Attr.noValue,\r
181                         attrs = [ '' ], n = 0, p;\r
182                 for( p in obj ){\r
183                         attrs[ ++n ] = noValue[ p ] ? p : [ p, '="', obj[ p ], '"' ].join( '' );\r
184                 };\r
185                 return 0 < n ? attrs.join( ' ' ) : '';\r
186         }\r
187 };\r
188 \r
189 (function( toIndex, toName, renameForDOM, renameForTag ){\r
190         var name, i;\r
191         for( name in toIndex ){\r
192                 if( typeof ( i = toIndex[ name ] ) === 'number' ){\r
193                         toName[ i ] = name;\r
194                 };\r
195         };\r
196         for( name in renameForDOM ){\r
197                 renameForTag[ renameForDOM[ name ] ] = name;\r
198         };\r
199 })( X.Dom.Attr.toIndex, X.Dom.Attr.toName, X.Dom.Attr.renameForDOM, X.Dom.Attr.renameForTag );\r
200 \r
201 \r
202 \r
203 /* --------------------------------------\r
204  *  attribute\r
205  *  X.Dom.Attr.toIndex に定義されている 属性の場合\r
206  * \r
207  * http://nanto.asablo.jp/blog/2005/10/29/123294\r
208  * className, onclick等 はここで設定しない\r
209  * \r
210  */\r
211 X.Dom.Node.prototype.attr = function( nameOrObj /* v */ ){\r
212         var attrs = this._attrs, newAttrs, f;\r
213         \r
214         if( this._xnodeType !== 1 ) return this;\r
215         \r
216         if( nameOrObj && X.Type.isObject( nameOrObj ) ){\r
217                 attrs || ( attrs = this._attrs = {} );\r
218                 newAttrs = this._newAttrs || ( this._newAttrs = {} );\r
219                 \r
220                 for( p in nameOrObj ){\r
221                         if( this._setAttr( attrs, newAttrs, p, nameOrObj[ p ] ) === true ) f = true;\r
222                 };\r
223                 if( f ){\r
224                         delete this._attrText;\r
225                         this._dirty |= X.Dom.Dirty.ATTR;\r
226                         this._root && this._reserveUpdate();                    \r
227                 };\r
228                 return this;\r
229         } else\r
230         if( 1 < arguments.length ){\r
231                 // setter\r
232                 if( this._setAttr( attrs || ( this._attrs = {} ), this._newAttrs || ( this._newAttrs = {} ), nameOrObj, arguments[ 1 ] ) === true ){\r
233                         delete this._attrText;\r
234                         this._dirty |= X.Dom.Dirty.ATTR;\r
235                         this._root && this._reserveUpdate();\r
236                 };\r
237                 return this;\r
238         } else\r
239         if( typeof nameOrObj === 'string' && attrs ){\r
240                 // getter\r
241                 return attrs[ nameOrObj ];\r
242         };\r
243 };\r
244 X.Dom.Node.prototype._setAttr = function( attrs, newAttrs, name, v ){\r
245         if( name === 'UID' ) return;\r
246         if( name === 'id' ){\r
247                 v = ( v !== 'ie4uid' + this._uid ) ? v : undefined;\r
248                 if( v !== this._id ){\r
249                         this._id = v;\r
250                         this._dirty |= X.Dom.Dirty.ID;\r
251                         this._root && this._reserveUpdate();\r
252                 };\r
253                 return;\r
254         };      \r
255         if( name === 'class' ) return this.className( v );      \r
256         if( name === 'style' ) return this.cssText( v );\r
257         \r
258         if( name.indexOf( 'on' ) === 0 ){\r
259                 X.Notification.warn( 'xnode.attr("' + name + '") is wrong, xnode.listen() & xnode.unlisten().' );\r
260                 return;\r
261         };\r
262         \r
263         name = X.Dom.Attr.renameForTag[ name ] || name;\r
264         if( attrs[ name ] === v ) return;\r
265         \r
266         if( v == null ){\r
267                 newAttrs[ name ] = undefined;\r
268                 if( attrs.hasOwnProperty( name ) ) delete attrs[ name ];\r
269         } else {\r
270                 newAttrs[ name ] = attrs[ name ] = v;\r
271         };\r
272         return true;\r
273 };\r
274 \r