OSDN Git Service

Version 0.6.123, remove xnode._nodeType.
[pettanr/clientJs.git] / 0.6.x / js / 02_dom / 05_XNodeAttr.js
index 6c23b0b..cd96a45 100644 (file)
@@ -45,7 +45,20 @@ X_Node_Attr_HAS_VALUE = {
                INPUT    : true,\r
                TEXTAREA : true,\r
                SELECT   : true,\r
-               BUTTON   : true\r
+               BUTTON   : true,\r
+               OBJECT   : true,\r
+               PARAM    : true // FlashVars が flash 側から書き換えられるケースがある??\r
+},\r
+\r
+// <input type=button,hidden,submit,reset,radio,checkbox> の場合、value の値はユーザーで変えることはない\r
+// <input type=text,password,file> はユーザーによって常に変更される HTML5 ではこれにさらにいろいろ加わる\r
+X_Node_Attr_STATIC_VALUE_TYPES = {\r
+       button   : true,\r
+       hidden   : true,\r
+       submit   : true,\r
+       reset    : true,\r
+       radio    : true,\r
+       checkbox : true\r
 },\r
 \r
 X_Node_Attr_renameForTag = {};\r
@@ -55,22 +68,24 @@ X_Node_Attr_renameForTag = {};
        // 先頭にスペース\r
 function X_Node_Attr_objToAttrText( obj ){\r
                var noValue = X_Node_Attr_noValue,\r
-                       attrs = [ '' ], n = 0, p, v;\r
+                       attrs = [ '' ], n = 0, k, v;\r
                if( !obj ) return ''; // Opera7\r
-               for( p in obj ){\r
-                       v = obj[ p ];\r
-                       if( p === 'value' ){\r
+               for( k in obj ){\r
+                       //if( X_EMPTY_OBJECT[ k ] ) continue;\r
+                       v = obj[ k ];\r
+                       if( k === 'value' ){\r
                                v = v.split( '"' ).join( '&quot;' ).split( '>' ).join( '&gt;' ).split( '<' ).join( '&lt;' );\r
                        };\r
-                       attrs[ ++n ] = noValue[ p ] ? p : [ p, '="', v, '"' ].join( '' );\r
+                       attrs[ ++n ] = noValue[ k ] ? k : [ k, '="', v, '"' ].join( '' );\r
                };\r
                return 0 < n ? attrs.join( ' ' ) : '';\r
 };\r
 \r
 (function( renameForDOM, renameForTag ){\r
-       var name, i;\r
-       for( name in renameForDOM ){\r
-               renameForTag[ renameForDOM[ name ] ] = name;\r
+       var k, i;\r
+       for( k in renameForDOM ){\r
+               //if( X_EMPTY_OBJECT[ k ] ) continue;\r
+               renameForTag[ renameForDOM[ k ] ] = k;\r
        };\r
 })( X_Node_Attr_renameForDOM, X_Node_Attr_renameForTag );\r
 \r
@@ -78,28 +93,28 @@ function X_Node_Attr_objToAttrText( obj ){
 \r
 /* --------------------------------------\r
  *  attribute\r
- *  X_Node_Attr_toIndex に定義されている 属性の場合\r
  * \r
  * http://nanto.asablo.jp/blog/2005/10/29/123294\r
  * className, onclick等 はここで設定しない\r
  * \r
  */\r
 Node.prototype.attr = function( nameOrObj /* v */ ){\r
-       var attrs = this._attrs, newAttrs, f, p, elm, v;\r
+       var attrs = this._attrs, newAttrs, f, k, elm, v;\r
        \r
-       if( this._xnodeType !== 1 ) return this;\r
+       if( !this._tag ) 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( X_Node_Attr_setAttr( this, attrs, newAttrs, p, nameOrObj[ p ] ) === true ) f = true;\r
+               for( k in nameOrObj ){\r
+                       //if( X_EMPTY_OBJECT[ k ] ) continue;\r
+                       if( X_Node_Attr_setAttr( this, attrs, newAttrs, k, nameOrObj[ k ] ) === true ) f = true;\r
                };\r
                if( f ){\r
                        this._attrText = false;\r
-                       this._dirty |= X_Node_Dirty.ATTR;\r
-                       this._root && X_Node_reserveUpdate();                   \r
+                       this._flags |= X_Node_State.DIRTY_ATTR;\r
+                       this._root && X_Node_reserveUpdate();\r
                };\r
                return this;\r
        } else\r
@@ -107,7 +122,7 @@ Node.prototype.attr = function( nameOrObj /* v */ ){
                // setter\r
                if( X_Node_Attr_setAttr( this, attrs || ( this._attrs = {} ), this._newAttrs || ( this._newAttrs = {} ), nameOrObj, arguments[ 1 ] ) === true ){\r
                        this._attrText = false;\r
-                       this._dirty |= X_Node_Dirty.ATTR;\r
+                       this._flags |= X_Node_State.DIRTY_ATTR;\r
                        this._root && X_Node_reserveUpdate();\r
                };\r
                return this;\r
@@ -126,16 +141,14 @@ Node.prototype.attr = function( nameOrObj /* v */ ){
                        case 'style' :\r
                        case 'cssText' :\r
                                return this.cssText();\r
-                       case 'text' :\r
-                               return this.text();\r
-                       case 'html' :\r
-                               return this.html();\r
+\r
                        case 'selected' :\r
                                // kquery.js : safariのバグ対策\r
                                // if ($.browser.safari && key === "selected" && tmp) tmp.selectedIndex;\r
                                // 親ノードの selectedIndex の getter を呼んでおくと値が正しくなる、ということ?( by itozyun )\r
-                               if( X_UA.WebKit ) this._rawObject.parentNode.selectedIndex;\r
+                               if( X_UA.WebKit ) this._rawObject.parentNode && this._rawObject.parentNode.selectedIndex;\r
                        case 'value' :\r
+                               if( this._tag === 'INPUT' && X_Node_Attr_STATIC_VALUE_TYPES[ attrs[ 'type' ] ] ) break;\r
                        case 'checked' :\r
                        case 'disabled' :                       \r
                        case 'selectedIndex' :\r
@@ -160,9 +173,10 @@ function X_Node_Attr_setAttr( that, attrs, newAttrs, name, v ){
                        return;\r
                case 'id' :\r
                        v = ( v !== 'ie4uid' + that._uid ) ? v : undefined;\r
+                       // TODO unique の check\r
                        if( v !== that._id ){\r
                                that._id = v;\r
-                               that._dirty |= X_Node_Dirty.ID;\r
+                               that._flags |= X_Node_State.DIRTY_ID;\r
                                that._root && X_Node_reserveUpdate();\r
                        };\r
                        return; \r