OSDN Git Service

Version 0.6.67, rename folders.
[pettanr/clientJs.git] / 0.6.x / js / 01_dom / 14_XDomAttr.js
diff --git a/0.6.x/js/01_dom/14_XDomAttr.js b/0.6.x/js/01_dom/14_XDomAttr.js
new file mode 100644 (file)
index 0000000..77d8600
--- /dev/null
@@ -0,0 +1,178 @@
+X.Dom.Attr = {\r
+       noValue : {\r
+               checked  : 1,\r
+               compact  : 1,\r
+               declare  : 1,\r
+               defer    : 1,\r
+               disabled : 1,\r
+               ismap    : 1,\r
+               multiple : 1,\r
+               nohref   : 1,\r
+               noresize : 1,\r
+               noshade  : 1,\r
+               nowrap   : 1,\r
+               readonly : 1,\r
+               selected : 1\r
+       },\r
+       renameForDOM : {\r
+               'class'          : 'className',\r
+               accesskey        : 'accessKey',\r
+               'accept-charset' : 'acceptCharset',\r
+               bgcolor          : 'bgColor',\r
+               cellpadding      : 'cellPadding',\r
+               cellspacing      : 'cellSpacing',\r
+               'char'           : 'ch',\r
+               charoff          : 'chOff',\r
+               codebase         : 'codeBase',\r
+               codetype         : 'codeType',\r
+               colspan          : 'colSpan',\r
+               datetime         : 'dateTime',\r
+               'for'            : 'htmlFor',\r
+               frameborder      : 'frameBorder',\r
+               'http-equiv'     : 'httpEquiv',\r
+               ismap            : 'isMap',\r
+               longdesc         : 'longDesc',\r
+               maxlength        : 'maxLength',\r
+               nohref           : 'noHref',\r
+               readonly         : 'readOnly',\r
+               rowspan          : 'rowSpan',\r
+               tabindex         : 'tabIndex',\r
+               usemap           : 'useMap',\r
+               valuetype        : 'valueType',\r
+               checked          : 'defaultChecked'\r
+       },\r
+       \r
+       HAS_VALUE : {\r
+               INPUT    : true,\r
+               TEXTAREA : true,\r
+               SELECT   : true,\r
+               BUTTON   : true\r
+       },\r
+       \r
+       renameForTag : {},\r
+       // http://nanto.asablo.jp/blog/2005/10/29/123294\r
+       // checked -> defaultChecked\r
+       // 動的に生成した input 要素を文書ツリーに挿入する前に設定した checked 属性は反映されず、defaultChecked だと反映される\r
+       // 先頭にスペース\r
+       objToAttrText : function( obj ){\r
+               var noValue = X.Dom.Attr.noValue,\r
+                       attrs = [ '' ], n = 0, p, v;\r
+               if( !obj ) return ''; // Opera7\r
+               for( p in obj ){\r
+                       v = obj[ p ];\r
+                       if( p === 'value' ){\r
+                               v = v.split( '"' ).join( '&quot;' ).split( '>' ).join( '&gt;' ).split( '<' ).join( '&lt;' );\r
+                       };\r
+                       attrs[ ++n ] = noValue[ p ] ? p : [ p, '="', v, '"' ].join( '' );\r
+               };\r
+               return 0 < n ? attrs.join( ' ' ) : '';\r
+       }\r
+};\r
+\r
+(function( renameForDOM, renameForTag ){\r
+       var name, i;\r
+       for( name in renameForDOM ){\r
+               renameForTag[ renameForDOM[ name ] ] = name;\r
+       };\r
+})( X.Dom.Attr.renameForDOM, X.Dom.Attr.renameForTag );\r
+\r
+\r
+\r
+/* --------------------------------------\r
+ *  attribute\r
+ *  X.Dom.Attr.toIndex に定義されている 属性の場合\r
+ * \r
+ * http://nanto.asablo.jp/blog/2005/10/29/123294\r
+ * className, onclick等 はここで設定しない\r
+ * \r
+ */\r
+X.Dom.Node.prototype.attr = function( nameOrObj /* v */ ){\r
+       var attrs = this._attrs, newAttrs, f, p, elm, v;\r
+       \r
+       if( this._xnodeType !== 1 ) return this;\r
+       \r
+       if( nameOrObj && X.Type.isObject( nameOrObj ) ){\r
+               attrs || ( attrs = this._attrs = {} );\r
+               newAttrs = this._newAttrs || ( this._newAttrs = {} );\r
+               \r
+               for( p in nameOrObj ){\r
+                       if( this._setAttr( attrs, newAttrs, p, nameOrObj[ p ] ) === true ) f = true;\r
+               };\r
+               if( f ){\r
+                       this._attrText = false;\r
+                       this._dirty |= X.Dom.Dirty.ATTR;\r
+                       this._root && this._reserveUpdate();                    \r
+               };\r
+               return this;\r
+       } else\r
+       if( 1 < arguments.length ){\r
+               // setter\r
+               if( this._setAttr( attrs || ( this._attrs = {} ), this._newAttrs || ( this._newAttrs = {} ), nameOrObj, arguments[ 1 ] ) === true ){\r
+                       this._attrText = false;\r
+                       this._dirty |= X.Dom.Dirty.ATTR;\r
+                       this._root && this._reserveUpdate();\r
+               };\r
+               return this;\r
+       } else\r
+       if( typeof nameOrObj === 'string' ){\r
+               // getter\r
+               switch( nameOrObj ){\r
+                       case 'id' :\r
+                               return this._tag;\r
+                       case 'class' :\r
+                       case 'className' :\r
+                               return this._className;\r
+                       case 'tag' :\r
+                       case 'tagName' :\r
+                               return this._tag;\r
+                       case 'style' :\r
+                       case 'cssText' :\r
+                               return this.cssText();\r
+                       case 'value' :\r
+                       case 'checked' :\r
+                       case 'selected' :\r
+                       case 'disabled' :                       \r
+                       case 'selectedIndex' :\r
+                               if( X.Dom.Attr.HAS_VALUE[ this._tag ] ){\r
+                                       if( this._newAttrs && X.inObject( nameOrObj, this._newAttrs ) ) return this._newAttrs[ nameOrObj ];\r
+                                       if( elm = X.Dom.DOM_IE4 ? this._rawNode || this._ie4getRawNode() : this._rawNode ){\r
+                                               attrs[ nameOrObj ] = elm[ nameOrObj ]; // getAttribute( nameOrObj )?\r
+                                       };\r
+                                       return attrs[ nameOrObj ];\r
+                               };\r
+                               break;\r
+               };\r
+               return attrs && attrs[ X.Dom.Attr.renameForTag[ nameOrObj ] || nameOrObj ];\r
+       };\r
+};\r
+X.Dom.Node.prototype._setAttr = function( attrs, newAttrs, name, v ){\r
+       if( name === 'UID' ) return;\r
+       if( name === 'id' ){\r
+               v = ( v !== 'ie4uid' + this._uid ) ? v : undefined;\r
+               if( v !== this._id ){\r
+                       this._id = v;\r
+                       this._dirty |= X.Dom.Dirty.ID;\r
+                       this._root && this._reserveUpdate();\r
+               };\r
+               return;\r
+       };      \r
+       if( name === 'class' ) return this.className( v );      \r
+       if( name === 'style' ) return this.cssText( v );\r
+       \r
+       if( name.indexOf( 'on' ) === 0 ){\r
+               X.Notification.warn( 'xnode.attr("' + name + '") is wrong, xnode.listen() & xnode.unlisten().' );\r
+               return;\r
+       };\r
+       \r
+       name = X.Dom.Attr.renameForTag[ name ] || name;\r
+       if( attrs[ name ] === v ) return;\r
+       \r
+       if( v == null ){\r
+               newAttrs[ name ] = undefined;\r
+               if( attrs.hasOwnProperty( name ) ) delete attrs[ name ];\r
+       } else {\r
+               newAttrs[ name ] = attrs[ name ] = v;\r
+       };\r
+       return true;\r
+};\r
+\r