OSDN Git Service

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