OSDN Git Service

Version 0.6.31, async parser, add X.Dom.Builder.js.
[pettanr/clientJs.git] / 0.6.x / js / dom / 10_XDom.js
index d51ae76..bd22892 100644 (file)
@@ -1,35 +1,57 @@
 (function( window, document ){\r
        var lock = 0, w = 0, h = 0,\r
-               resize, delayResize;\r
+               resize, fontSize;\r
 \r
 /* -----------------------------------------------\r
  * Resize\r
- *  uupaa.js\r
+ *  original : uupaa.js\r
  */\r
-       function unlock(){ lock = 0; };\r
-       \r
-       if( X.UA.IE && X.UA.IE < 9 ){\r
-               resize = function(){\r
-                       var size;\r
-                       if( !lock++ ){\r
-                               size = X.Dom.getSize();\r
-                               ( w !== size[ 0 ] || h !== size[ 1 ] ) &&\r
-                                       X.Dom.dispatch( { type : X.Dom.Event.VIEW_RESIZED, w : w = size[ 0 ], h : h = size[ 1 ] } );\r
-                               X.Timer.once( 1, unlock );\r
-                       };\r
-               };\r
-       } else {\r
-               resize = function( e ){\r
-                       !lock++ && X.Timer.once( 40, delayResize );\r
-                       return X.Callback.PREVENT_DEFAULT | X.Callback.STOP_PROPAGATION;\r
-               };\r
-               delayResize = function(){\r
-                       var size = X.Dom.getSize();\r
-                       ( w !== size[ 0 ] || h !== size[ 1 ] ) &&\r
-                               X.Dom.dispatch( { type : X.Dom.Event.VIEW_RESIZED, w : w = size[ 0 ], h : h = size[ 1 ] } );\r
-                       X.Timer.once( 1, unlock );\r
+       resize =\r
+               X.UA.IE && X.UA.IE < 9 ?\r
+                       (function(){\r
+                               var size;\r
+                               if( !lock ){\r
+                                       size = X.Dom.getSize();\r
+                                       if( w !== size[ 0 ] || h !== size[ 1 ] ){\r
+                                               w = size[ 0 ];\r
+                                               h = size[ 1 ];\r
+                                               X.Timer.once( 100, detectFinishResizing );\r
+                                               lock = true;\r
+                                       };\r
+                               };\r
+                               \r
+                               size = Node._fontSizeNode._rawNode.offsetHeight;\r
+                               if( fontSize !== size ){\r
+                                       fontSize && X.Dom.asyncDispatch( 0, { type : X.Dom.Event.BASE_FONT_RESIZED, size : size } );\r
+                                       fontSize = size;\r
+                               };\r
+                               \r
+                       }) :\r
+                       (function( e ){\r
+                               !lock && ( lock = true ) && X.Timer.once( 100, detectFinishResizing );\r
+                               return X.Callback.PREVENT_DEFAULT | X.Callback.STOP_PROPAGATION;\r
+                       });\r
+\r
+       detectFontSize = ( !X.UA.IE || 9 <= X.UA.IE ) && function(){\r
+               var size = Node._fontSizeNode._rawNode.offsetHeight;\r
+               if( fontSize !== size ){\r
+                       fontSize && X.Dom.asyncDispatch( 0, { type : X.Dom.Event.BASE_FONT_RESIZED, size : size } );\r
+                       fontSize = size;\r
                };\r
        };\r
+\r
+       function detectFinishResizing(){\r
+               var size = X.Dom.getSize();\r
+               if( w !== size[ 0 ] || h !== size[ 1 ] ){\r
+                       w = size[ 0 ];\r
+                       h = size[ 1 ];\r
+                       X.Timer.once( 100, detectFinishResizing );\r
+               } else {\r
+                       X.Dom.asyncDispatch( 0, { type : X.Dom.Event.VIEW_RESIZED, w : w, h : h } );\r
+                       lock = false;\r
+               };\r
+       };      \r
+       \r
        \r
        X.Dom = X.Class._override(\r
                new X.EventDispatcher(),\r
@@ -56,7 +78,7 @@
                                \r
                        },\r
                        _init : function(){\r
-                               var s, size, b, x;\r
+                               var s, size, h, r;\r
                                if( X.Dom.Event.DOM_PRE_INIT <= X.Dom.readyState ) return X.Callback.UN_LISTEN;\r
                                if( s = X.Dom._script ){\r
                                        s.parentNode.removeChild( s );\r
                                delete X.Dom._init;\r
                                X.Dom.readyState = X.Dom.Event.DOM_PRE_INIT;\r
                                \r
-                               /* if( X.UA.IE ) */ X.Dom._root = ( document.compatMode !== 'CSS1Compat' ? document.body : document.documentElement );\r
-                               size = X.Dom.getSize();\r
+                               /* if( X.UA.IE ) */\r
+                               X.Dom._root = ( document.compatMode !== 'CSS1Compat' ? document.body : document.documentElement );\r
+\r
+                               h = Node._html = document.documentElement ?\r
+                                               new Node( document.documentElement ) :\r
+                                       document.getElementsByTagName ?\r
+                                               new Node( document.getElementsByTagName( 'html' )[ 0 ] ) :\r
+                                       document.all ?\r
+                                               new Node( document.all.tags( 'html' )[ 0 ] ) :\r
+                                               null;\r
+                       \r
+                               r = Node.root = new Node( document.body );\r
+                               h.appendTo = h.appendToRoot = h.before = h.after = h.clone = h.remove = h.destroy = h.prevNode = h.nextNode = h.createText = h.append = h.appendAt = h.empty = h.html = h.text =\r
+                               r.appendTo = r.appendToRoot = r.before = r.after = r.clone = r.remove = r.destroy = r.prevNode = r.nextNode = new Function( 'return this' );\r
                                \r
-                               X.Dom.asyncDispatch( 0, { type : X.Dom.Event.DOM_PRE_INIT, w : size[ 0 ], h : size[ 1 ] } );\r
+                               r._root  = h._root = r;\r
+                               r.parent = h;\r
+                               h._xnodes = [ r ];\r
 \r
                                X.Dom.listenOnce( X.Dom.Event.DOM_PRE_INIT, function(){\r
-                                       var size = X.Dom.getSize();\r
-                                       X.Dom.readyState = X.Dom.Event.DOM_INIT;\r
-                                       X.Dom.asyncDispatch( 0, { type : X.Dom.Event.DOM_INIT, w : size[ 0 ], h : size[ 1 ] } );\r
+                                       X.Dom.readyState = X.Dom.Event.DOM_BUILDER_COMPLETE;\r
+                                       !X.Dom._useBuilder && X.Dom.asyncDispatch( 0, { type : X.Dom.Event.DOM_BUILDER_COMPLETE } );\r
                                } );\r
                                \r
+                               X.Dom.listenOnce( X.Dom.Event.DOM_BUILDER_COMPLETE, function(){\r
+                                       Node.root.appendAt( 0,\r
+                                               Node._systemNode = Node.create( 'div', { 'class' : 'hidden-system-node' } ),\r
+                                               Node._fontSizeNode = Node.create( 'div', { 'class' : 'hidden-system-node' } ).cssText( 'line-height:1;height:1em;' ).text( 'X' )\r
+                                       )._startUpdate();\r
+                                       \r
+                                       X.Dom.readyState = X.Dom.Event.DOM_INIT;\r
+                                       \r
+                                       X.Dom.asyncDispatch( 0, { type : X.Dom.Event.DOM_INIT } );\r
+                               } );\r
+\r
                                X.Dom.listenOnce( X.Dom.Event.DOM_INIT, function(){\r
                                        var size = X.Dom.getSize();\r
+\r
+                                       if( !X.UA.IE || 9 <= X.UA.IE ){\r
+                                               X.Dom.Node._window.listen( 'resize', resize );\r
+                                               X.Timer.add( 333, detectFontSize );\r
+                                       } else {\r
+                                               X.Timer.add( 333, resize );\r
+                                       };\r
+                                       \r
+                                       fontSize = Node._fontSizeNode._rawNode.offsetHeight;\r
                                        \r
-                                       X.UA.IE && X.UA.IE < 9 ?\r
-                                               X.Timer.add( 100, resize ) :\r
-                                               X.Dom.Node._window.listen( 'resize', resize );  \r
                                        X.Dom.readyState = X.Dom.Event.XDOM_READY;\r
-                                       X.Dom.asyncDispatch( 0, { type : X.Dom.Event.XDOM_READY, w : size[ 0 ], h : size[ 1 ] } );\r
+                                       X.Dom.asyncDispatch( 0, { type : X.Dom.Event.XDOM_READY, w : w = size[ 0 ], h : h = size[ 1 ] } );\r
                                } );\r
 \r
+                               X.Dom.asyncDispatch( 0, { type : X.Dom.Event.DOM_PRE_INIT } );  \r
+\r
                                return X.Callback.UN_LISTEN;\r
                        },\r
 \r
                                X.UA.IE ?\r
                                        new Function( 'return[X.Dom._root.clientWidth,X.Dom._root.clientHeight]' ) :\r
                                        new Function( 'return[window.innerWidth,window.innerHeight]' ),\r
+       //https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect\r
+       //use window.pageXOffset and window.pageYOffset instead of window.scrollX and window.scrollY\r
+       //(((t = document.documentElement) || (t = document.body.parentNode)) && typeof t.ScrollLeft == 'number' ? t : document.body).ScrollLeft;\r
+       //(((t = document.documentElement) || (t = document.body.parentNode)) && typeof t.ScrollTop == 'number' ? t : document.body).ScrollTop\r
+                       \r
                        getScrollPosition :\r
                                window.pageXOffset !== undefined ?\r
                                        new Function( 'return[window.pageXOffset,window.pageYOffset]' ) :\r
                        getDocumentSize : function(){\r
                                // Opera は互換モードでは document.body.scrollHeight、標準モードでは document.documentElement.scrollHeight でページの高さが取れる。と思ってたんだけど、例外があった。\r
                                // http://orera.g.hatena.ne.jp/edvakf/20100515/1273908051\r
+                       //http://onozaty.hatenablog.com/entry/20060803/p1\r
+                       // Safari2.0.4では標準・互換どちらも document.body           \r
                                return [\r
                                        X.Dom._root.scrollWidth  || X.Dom._root.offsetWidth,\r
                                        X.Dom._root.scrollHeight || X.Dom._root.offsetHeight\r
                                ];\r
+                       },\r
+                       // todo\r
+                       getScrollbarSize : function(){\r
+                               return [];      \r
                        }\r
                }\r
        );\r
 \r
 })( window, document );\r
 \r
+X.Dom.cleanupTagNames     = 'noscript,noframes,comment,!,noembed,nolayer'.split( ',' );\r
 X.Dom.skipCleanupTagNames = 'pre,textarea,code,kbd,samp,xmp,plaintext,listing'.split( ',' );\r
                \r
 X.Dom.cleanupWhiteSpace = function( text ){\r
        var _ = ' ', __ = '  ';\r
-       text.indexOf( '\r\n' ) !== -1 && ( text = text.split( '\r\n' ).join( _ ) );\r
        text.indexOf( '\n\r' ) !== -1 && ( text = text.split( '\n\r' ).join( _ ) );\r
        text.indexOf( '\t' )   !== -1 && ( text = text.split( '\t' ).join( _ ) );\r
        text.indexOf( '\r' )   !== -1 && ( text = text.split( '\r' ).join( _ ) );\r
@@ -131,6 +196,29 @@ X.Dom.cleanupWhiteSpace = function( text ){
        return text;\r
 };\r
 \r
+X.Dom.whiteSpaceToTag = function( text ){\r
+    if( text == null ) return '';\r
+    return text.toString()\r
+       .split( '\r\n\r\n' ).join( '<br>' )\r
+       .split( '\n\r\n\r' ).join( '<br>' )\r
+       .split( '\r\n' ).join( '<br>' )\r
+       .split( '\n\r' ).join( '<br>' )\r
+       .split( '\r' ).join( '<br>' )\r
+       .split( '\n' ).join( '<br>' )\r
+       .split( '\t' ).join( '' )\r
+       .split( '\f' ).join( '' )\r
+       .split( '\b' ).join( '' );\r
+};\r
+\r
+X.Dom.chrReferanceTo = function( str ){\r
+    if( str == null ) return '';\r
+    return str.toString()\r
+       .split( '&amp;' ).join( '&' )\r
+       .split( '&lt;' ).join( '<' )\r
+       .split( '&gt;' ).join( '>' )\r
+       .split( '&nbsp;' ).join( ' ' );\r
+};\r
+\r
 /*\r
  * original\r
  * AS3で相対パスを絶対パスに変換する\r
@@ -170,12 +258,3 @@ X.Dom.getAbsolutePath = function( path ){
        return [ _ary[ 0 ], ss, ary.join( s ), s, path ].join( '' );\r
 };\r
 \r
-\r
-X.Dom.Dirty = {\r
-       CLEAN     :  0,\r
-       TREE      :  1, // width, height, x, y\r
-       CONTENT   :  2,  // width, height, x, y textNode の内容\r
-       CLASSNAME :  4, // _getCharSize, width, height, x, y\r
-       CSS       :  8, // _getCharSize, width, height, x, y\r
-       ATTR      : 16  // _getCharSize, width, height, x, y\r
-};
\ No newline at end of file