OSDN Git Service

Version 0.6.104, fix X_shortcut & etc.
[pettanr/clientJs.git] / 0.6.x / js / 02_dom / 05_XNodeAttr.js
1 var X_Node_Attr_noValue = {\r
2                 checked  : 1,\r
3                 compact  : 1,\r
4                 declare  : 1,\r
5                 defer    : 1,\r
6                 disabled : 1,\r
7                 ismap    : 1,\r
8                 multiple : 1,\r
9                 nohref   : 1,\r
10                 noresize : 1,\r
11                 noshade  : 1,\r
12                 nowrap   : 1,\r
13                 readonly : 1,\r
14                 selected : 1\r
15 },\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
23                 'char'           : 'ch',\r
24                 charoff          : 'chOff',\r
25                 codebase         : 'codeBase',\r
26                 codetype         : 'codeType',\r
27                 colspan          : 'colSpan',\r
28                 datetime         : 'dateTime',\r
29                 'for'            : 'htmlFor',\r
30                 frameborder      : 'frameBorder',\r
31                 'http-equiv'     : 'httpEquiv',\r
32                 ismap            : 'isMap',\r
33                 longdesc         : 'longDesc',\r
34                 maxlength        : 'maxLength',\r
35                 nohref           : 'noHref',\r
36                 readonly         : 'readOnly',\r
37                 rowspan          : 'rowSpan',\r
38                 tabindex         : 'tabIndex',\r
39                 usemap           : 'useMap',\r
40                 valuetype        : 'valueType',\r
41                 checked          : 'defaultChecked'\r
42 },\r
43 \r
44 X_Node_Attr_HAS_VALUE = {\r
45                 INPUT    : true,\r
46                 TEXTAREA : true,\r
47                 SELECT   : true,\r
48                 BUTTON   : true\r
49 },\r
50 \r
51 X_Node_Attr_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 function X_Node_Attr_objToAttrText( obj ){\r
57                 var noValue = X_Node_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 (function( renameForDOM, renameForTag ){\r
71         var name, i;\r
72         for( name in renameForDOM ){\r
73                 renameForTag[ renameForDOM[ name ] ] = name;\r
74         };\r
75 })( X_Node_Attr_renameForDOM, X_Node_Attr_renameForTag );\r
76 \r
77 \r
78 \r
79 /* --------------------------------------\r
80  *  attribute\r
81  *  X_Node_Attr_toIndex に定義されている 属性の場合\r
82  * \r
83  * http://nanto.asablo.jp/blog/2005/10/29/123294\r
84  * className, onclick等 はここで設定しない\r
85  * \r
86  */\r
87 Node.prototype.attr = function( nameOrObj /* v */ ){\r
88         var attrs = this._attrs, newAttrs, f, p, elm, v;\r
89         \r
90         if( this._xnodeType !== 1 ) return this;\r
91         \r
92         if( nameOrObj && X.Type.isObject( nameOrObj ) ){\r
93                 attrs || ( attrs = this._attrs = {} );\r
94                 newAttrs = this._newAttrs || ( this._newAttrs = {} );\r
95                 \r
96                 for( p in nameOrObj ){\r
97                         if( X_Node_Attr_setAttr( this, attrs, newAttrs, p, nameOrObj[ p ] ) === true ) f = true;\r
98                 };\r
99                 if( f ){\r
100                         this._attrText = false;\r
101                         this._dirty |= X_Node_Dirty.ATTR;\r
102                         this._root && X_Node_reserveUpdate();                   \r
103                 };\r
104                 return this;\r
105         } else\r
106         if( 1 < arguments.length ){\r
107                 // setter\r
108                 if( X_Node_Attr_setAttr( this, attrs || ( this._attrs = {} ), this._newAttrs || ( this._newAttrs = {} ), nameOrObj, arguments[ 1 ] ) === true ){\r
109                         this._attrText = false;\r
110                         this._dirty |= X_Node_Dirty.ATTR;\r
111                         this._root && X_Node_reserveUpdate();\r
112                 };\r
113                 return this;\r
114         } else\r
115         if( typeof nameOrObj === 'string' ){\r
116                 // getter\r
117                 switch( nameOrObj ){\r
118                         case 'id' :\r
119                                 return this._id;\r
120                         case 'class' :\r
121                         case 'className' :\r
122                                 return this._className;\r
123                         case 'tag' :\r
124                         case 'tagName' :\r
125                                 return this._tag;\r
126                         case 'style' :\r
127                         case 'cssText' :\r
128                                 return this.cssText();\r
129                         case 'text' :\r
130                                 return this.text();\r
131                         case 'html' :\r
132                                 return this.html();\r
133                         case 'selected' :\r
134                                 // kquery.js : safariのバグ対策\r
135                                 // if ($.browser.safari && key === "selected" && tmp) tmp.selectedIndex;\r
136                                 // 親ノードの selectedIndex の getter を呼んでおくと値が正しくなる、ということ?( by itozyun )\r
137                                 if( X_UA.WebKit ) this._rawObject.parentNode.selectedIndex;\r
138                         case 'value' :\r
139                         case 'checked' :\r
140                         case 'disabled' :                       \r
141                         case 'selectedIndex' :\r
142                                 if( X_Node_Attr_HAS_VALUE[ this._tag ] ){\r
143                                         if( this._newAttrs && X_Object_inObject( nameOrObj, this._newAttrs ) ) return this._newAttrs[ nameOrObj ];\r
144                                         if( elm = X_UA_DOM.IE4 ? this._rawObject || X_Node__ie4getRawNode( this ) : this._rawObject ){\r
145                                                 if( !attrs ) attrs = this._attrs = {};\r
146                                                 return attrs[ nameOrObj ] = elm[ nameOrObj ]; // getAttribute( nameOrObj )?\r
147                                         };\r
148                                 };\r
149                                 break;\r
150                 };\r
151                 return attrs && attrs[ X_Node_Attr_renameForTag[ nameOrObj ] || nameOrObj ];\r
152         };\r
153 };\r
154 function X_Node_Attr_setAttr( that, attrs, newAttrs, name, v ){\r
155         switch( name ){\r
156                 // case 'type' : TODO IE は input, button, object に対して type の再設定が出来ない _state が要素生成済なら不可\r
157                 case 'UID' :\r
158                 case 'tag' :\r
159                 case 'tagName' :\r
160                         return;\r
161                 case 'id' :\r
162                         v = ( v !== 'ie4uid' + that._uid ) ? v : undefined;\r
163                         if( v !== that._id ){\r
164                                 that._id = v;\r
165                                 that._dirty |= X_Node_Dirty.ID;\r
166                                 that._root && X_Node_reserveUpdate();\r
167                         };\r
168                         return; \r
169                 case 'class' :\r
170                 case 'className' :\r
171                         return that.className( v );\r
172                 case 'style' :\r
173                 case 'cssText' :\r
174                         return that.cssText( v );\r
175                 case 'text' :\r
176                         return that.text( v );\r
177                 case 'html' :\r
178                         return that.html( v );\r
179         };\r
180         // debug\r
181         if( name.indexOf( 'on' ) === 0 ){\r
182                 X.Logger.warn( 'xnode.attr("' + name + '") is wrong, xnode.listen() & xnode.unlisten().' );\r
183                 return;\r
184         };\r
185         \r
186         name = X_Node_Attr_renameForTag[ name ] || name;\r
187         if( attrs[ name ] === v ) return;\r
188         \r
189         if( v == null ){\r
190                 newAttrs[ name ] = undefined;\r
191                 if( attrs.hasOwnProperty( name ) ) delete attrs[ name ];\r
192         } else {\r
193                 newAttrs[ name ] = attrs[ name ] = v;\r
194         };\r
195         return true;\r
196 };\r
197 \r