OSDN Git Service

Version 0.6.133, fix for closure compiler - ADVANCED_OPTIMIZATIONS
[pettanr/clientJs.git] / 0.6.x / js / 02_dom / 05_XNodeAttr.js
index a4669c8..e56b9df 100644 (file)
@@ -61,24 +61,82 @@ X_Node_Attr_STATIC_VALUE_TYPES = {
        checkbox : true\r
 },\r
 \r
+// 自由な内容が入るため、参照文字への変換が必要\r
+X_Node_Attr_toChrReferance = {\r
+       value : true,\r
+       title : true,\r
+       alt   : true\r
+},\r
+\r
 X_Node_Attr_renameForTag = {};\r
        // http://nanto.asablo.jp/blog/2005/10/29/123294\r
        // checked -> defaultChecked\r
        // 動的に生成した input 要素を文書ツリーに挿入する前に設定した checked 属性は反映されず、defaultChecked だと反映される\r
-       // 先頭にスペース\r
-function X_Node_Attr_objToAttrText( obj ){\r
-               var noValue = X_Node_Attr_noValue,\r
-                       attrs = [ '' ], n = 0, k, v;\r
-               if( !obj ) return ''; // Opera7\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
+       //  -> src (img, iframe, ), link の href, <param name="movie" src=>\r
+       // \r
+function X_Node_Attr_objToAttrText( that, skipNetworkForElmCreation ){\r
+       var obj     = that._attrs,\r
+               noValue = X_Node_Attr_noValue,\r
+               attrs   = [ '' ], // 先頭にスペース\r
+               plain   = X_EMPTY_OBJECT,\r
+               n = 0, k, check;\r
+\r
+       if( skipNetworkForElmCreation ){\r
+               delete that._newAttrs;\r
+               // このあとで _newAttr にネットワーク系の属性を控える, attrText には加えない\r
+       } else {\r
+               that._flags &= ~X_Node_State.OLD_ATTRTEXT;\r
+               // 完全な attrText\r
+       };\r
+       \r
+       if( !obj ){ // Opera7\r
+               delete that._attrText;\r
+               return '';\r
+       };\r
+       \r
+       for( k in obj ){\r
+               if( plain[ k ] ) continue;\r
+               \r
+               if( skipNetworkForElmCreation ){\r
+                       check = false;\r
+                       switch( that._tag + k ){\r
+                               case 'PARAMvalue' :\r
+                                       check = obj[ 'name' ] !== 'movie';\r
+                               case 'INPUTsrc'  :\r
+                                       check = check || ( obj[ 'type' ] !== 'image' );\r
+                               case 'LINKhref' :\r
+                                       check = check || ( obj[ 'rel' ] !== 'stylesheet' );\r
+                                       \r
+                                       if( !check ) break;\r
+\r
+                               case 'IMGsrc'     :\r
+                               case 'IFRAMEsrc'  :\r
+                               case 'FRAMEsrc'   :\r
+                               case 'SCRIPTsrc'  :\r
+                               case 'EMBEDsrc'   :\r
+                               case 'OBJECTdata' :\r
+                               case 'BGSOUNDsrc' :\r
+                               case 'APPLETcode' :\r
+                               //case 'AUDIOsrc' :\r
+                               //case 'VIDEOsrc' :\r
+                                       if( !that._newAttrs ) that._newAttrs = {};\r
+                                       that._newAttrs[ k ] = obj[ k ];\r
+                                       continue;\r
                        };\r
-                       attrs[ ++n ] = noValue[ k ] ? k : [ k, '="', v, '"' ].join( '' );\r
                };\r
-               return 0 < n ? attrs.join( ' ' ) : '';\r
+\r
+               attrs[ ++n ] = noValue[ k ] ? k : [\r
+                       k, '="',\r
+                       X_Node_Attr_toChrReferance[ k ] ? X_String_toChrReferance( obj[ k ] ) : obj[ k ],\r
+                       '"' ].join( '' );\r
+       };\r
+       \r
+       if( 0 < n ){\r
+               return that._attrText = attrs.join( ' ' );\r
+       };\r
+       delete that._attrText;\r
+       return '';\r
 };\r
 \r
 (function( renameForDOM, renameForTag ){\r
@@ -101,9 +159,9 @@ function X_Node_Attr_objToAttrText( obj ){
 Node.prototype.attr = function( nameOrObj /* 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
+       if( nameOrObj && X_Type_isObject( nameOrObj ) ){\r
                attrs || ( attrs = this._attrs = {} );\r
                newAttrs = this._newAttrs || ( this._newAttrs = {} );\r
                \r
@@ -112,18 +170,18 @@ Node.prototype.attr = function( nameOrObj /* v */ ){
                        if( X_Node_Attr_setAttr( this, attrs, newAttrs, k, nameOrObj[ k ] ) === true ) f = true;\r
                };\r
                if( f ){\r
-                       this._attrText = false;\r
-                       this._flags |= X_Node_State.DIRTY_ATTR;\r
-                       this._root && X_Node_reserveUpdate();\r
+                       delete this._attrText;\r
+                       this._flags |= X_Node_State.DIRTY_ATTR | X_Node_State.OLD_ATTRTEXT;\r
+                       this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();\r
                };\r
                return this;\r
        } else\r
        if( 1 < arguments.length ){\r
                // 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._flags |= X_Node_State.DIRTY_ATTR;\r
-                       this._root && X_Node_reserveUpdate();\r
+                       delete this._attrText;\r
+                       this._flags |= X_Node_State.DIRTY_ATTR | X_Node_State.OLD_ATTRTEXT;\r
+                       this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();\r
                };\r
                return this;\r
        } else\r
@@ -138,27 +196,24 @@ Node.prototype.attr = function( nameOrObj /* v */ ){
                        case 'tag' :\r
                        case 'tagName' :\r
                                return this._tag;\r
-                       case 'nodeType' :\r
-                               return this._tag ? 1 : 3;\r
                        case 'style' :\r
                        case 'cssText' :\r
                                return this.cssText();\r
-                       case 'text' :\r
-                               return this.text();\r
-                       case 'html' :\r
-                       case 'innerHTML' :\r
-                               return this.html();\r
-                       case 'outerHTML' :\r
-                               X_Node_outerXNode = this;\r
-                               v = this.html();\r
-                               X_Node_outerXNode = null;\r
-                               return v;\r
 \r
+                       case 'src' : // src は遷移して変化する, name も?\r
+                               if( this._tag !== 'IFRAME' ) break;\r
+                               if( this._newAttrs && X_Object_inObject( nameOrObj, this._newAttrs ) ) return this._newAttrs[ nameOrObj ];\r
+                               if( elm = X_UA_DOM.IE4 ? this._rawObject || X_Node__ie4getRawNode( this ) : this._rawObject ){\r
+                                       if( !attrs ) attrs = this._attrs = {};\r
+                                       return attrs[ nameOrObj ] = elm[ nameOrObj ]; // getAttribute( nameOrObj )?\r
+                               };\r
+                               break;\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 && 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
@@ -189,7 +244,7 @@ function X_Node_Attr_setAttr( that, attrs, newAttrs, name, v ){
                        if( v !== that._id ){\r
                                that._id = v;\r
                                that._flags |= X_Node_State.DIRTY_ID;\r
-                               that._root && X_Node_reserveUpdate();\r
+                               that._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();\r
                        };\r
                        return; \r
                case 'class' :\r
@@ -214,7 +269,7 @@ function X_Node_Attr_setAttr( that, attrs, newAttrs, name, v ){
        \r
        if( v == null ){\r
                newAttrs[ name ] = undefined;\r
-               if( attrs.hasOwnProperty( name ) ) delete attrs[ name ];\r
+               if( X_Object_inObject( name, attrs ) ) delete attrs[ name ];\r
        } else {\r
                newAttrs[ name ] = attrs[ name ] = v;\r
        };\r