OSDN Git Service

Version 0.6.52, fix X.UI.
[pettanr/clientJs.git] / 0.6.x / js / dom / 18_XDomQuery.js
index 3d9cdb2..7dc8d9c 100644 (file)
@@ -205,18 +205,19 @@ X.Dom.Query._parse = function( query, last ){
 };\r
 \r
        // セレクター\r
-       X.Dom.find = X._shortcut = Node.prototype.find = function( queryString ){\r
-               var scope     = this.cnstructor === X.Dom.NodeList && this.length ? this : [ this.cnstructor === Node ? this : Node.root ],\r
-                       parents   = scope, // 探索元の親要素\r
-                       noLower   = 'title id name class for href src',\r
+       X.Dom.find = X._shortcut = Node.prototype.find = X.Dom.NodeList.prototype.find = function( queryString ){\r
+               var HTML      = Node._html,\r
+                       scope     = this.constructor === X.Dom.NodeList && this.length ? this : [ this.constructor === Node ? this : Node.root ],\r
+                       parents   = scope, // 探索元の親要素 XNodeList の場合あり\r
+                       noLower   = 'title id name class for action archive background cite classid codebase data href longdesc profile src usemap',// + X.Dom.DTD.ATTR_VAL_IS_URI.join( ' ' ),\r
                        ARY_PUSH  = Array.prototype.push,\r
                        ret       = [], // 結果要素\r
                        root      = X.Dom.Node.getRoot( scope[ 0 ] ),\r
                        isXML     = !!X.Dom.Node.isXmlDocument( root ),\r
-                       isMulti   = 1 < scope.length,\r
-                       isStart   = true,// 要素をマージする必要がある\r
+                       isMulti   = 1 < scope.length,// 要素をマージする必要がある\r
+                       isStart   = true,\r
                        _         = ' ',\r
-                       isAll, isNot,\r
+                       isAll, isNot, hasRoot,\r
                        l, i, n, parsed,\r
                        xnodes, // 一時保存用\r
                        merge, // 要素がコメントノードで汚染されている場合使う\r
@@ -224,16 +225,21 @@ X.Dom.Query._parse = function( query, last ){
                        uid, tmp, xnode, filter, key, op, val, toLower, useName,\r
             links, className, attr, flag;\r
 \r
+               /*@+debug[*/\r
+               if( X.Dom.readyState < X.Dom.Event.XDOM_READY ){\r
+                       alert( 'not ready! use X.Dom.listenOnce( X.Dom.Event.XDOM_READY, callback )' );\r
+                       return;\r
+               };\r
+               /*]@+debug*/\r
+\r
                // 文字列以外は空で返す\r
                if( typeof queryString !== 'string' ) return ret;\r
                \r
-               \r
-               \r
                xnodes = [];\r
                \r
                // 以下、パースと探索\r
                for( ; queryString.length; ){\r
-                       console.log( 'queryString[' + queryString + ']' );\r
+                       //console.log( 'queryString[' + queryString + ']' );\r
                        \r
                        // 初期化処理\r
                        if( !parsed ){\r
@@ -247,14 +253,14 @@ X.Dom.Query._parse = function( query, last ){
                                queryString = queryString.substr( parsed[ 0 ] );\r
                                parsed      = parsed[ 1 ];\r
                                \r
-                               console.log( 'X.Dom.Query._parse ' + parsed );\r
+                               //console.log( 'X.Dom.Query._parse ' + parsed );\r
                                \r
                                if( parsed === 5 ){\r
                                        isMulti = true;\r
                                        parents = scope;\r
                                        xnodes && xnodes.length && ARY_PUSH.apply( ret, xnodes );\r
                                        parsed  = null;\r
-                                       xnodes  = null;\r
+                                       xnodes  = [];\r
                                        isStart = true;\r
                                        continue;\r
                                };\r
@@ -274,7 +280,7 @@ X.Dom.Query._parse = function( query, last ){
                                if( combinator !== 0 ){\r
                                        parents = xnodes;\r
                                        xnodes  = [];\r
-                                       console.log( 'cobinator !== 0 ' + parents.length + ' : ' + xnodes.length );\r
+                                       //console.log( 'cobinator !== 0 ' + parents.length + ' : ' + xnodes.length );\r
                                };\r
                        };\r
                        \r
@@ -325,12 +331,12 @@ X.Dom.Query._parse = function( query, last ){
                                        \r
                                default :\r
                                        if( combinator === 1 || ( isStart && selector < 7 ) ){\r
-                                               console.log( l + ' > ' + xnodes.length + ' tag:' + tagName );\r
+                                               //console.log( l + ' > ' + xnodes.length + ' tag:' + tagName );\r
                                                for( ; i < l; ++i ){\r
                                                        xnode = parents[ i ];\r
                                                        xnode._xnodes && xnode._xnodes.length && X.Dom.Query._fetchElements( xnodes, xnode, isAll ? null : tagName );\r
                                                };\r
-                                               console.log( l + ' >> ' + xnodes.length + ' tag:' + tagName );\r
+                                               //console.log( l + ' >> ' + xnodes.length + ' tag:' + tagName );\r
                                        };\r
                        };\r
                        \r
@@ -364,7 +370,8 @@ X.Dom.Query._parse = function( query, last ){
                                        xnodes = scope; break;\r
                                // root\r
                                case 8 :\r
-                                       xnodes = [ Node._html ]; break;\r
+                                       hasRoot = true;\r
+                                       xnodes = [ HTML ]; break;\r
                                // link\r
                                case 9 :\r
                                        if( links = document.links ){\r
@@ -470,31 +477,57 @@ X.Dom.Query._parse = function( query, last ){
                        isNot   = false;\r
                        parsed  = null;\r
                        \r
-                       console.log( '//end :' + ( xnodes && xnodes.length ) );\r
+                       //console.log( '//end :' + ( xnodes && xnodes.length ) );\r
                };\r
-               console.log( 'multi:' + ( xnodes && xnodes.length ) );\r
+               //console.log( 'multi:' + ( xnodes && xnodes.length ) );\r
                \r
+               // tree 順に並び替え、同一要素の排除\r
                if( isMulti ){\r
                        xnodes && xnodes.length && ARY_PUSH.apply( ret, xnodes );\r
-                       //for( i = 0, l = xnodes.length, n = ret.length - 1; i < l; ++i ){\r
-                       //      ret[ ++n ] = xnodes[ i ];\r
-                       //};\r
+                       l = ret.length;\r
+                       if( l < 2 ) return ret[ 0 ] || Node.none;\r
+                       \r
                        xnodes = [];\r
                        merge  = {};\r
-                       for( i = 0, n = -1, l = ret.length; i < l; ++i ){\r
+                       for( i = 0, n = -1; i < l; ++i ){\r
                                //alert( 'multi:' + i )\r
                                xnode = ret[ i ];\r
-                               uid   = xnode._uid;\r
-                               if( !merge[ uid ] ){\r
+                               if( !merge[ uid = xnode._uid ] ){\r
                                        merge[ uid ] = true;\r
                                        xnodes[ ++n ] = xnode;\r
                                };\r
                        };\r
+                       X.Dom.Query._sortElementOrder( ret = [], xnodes, hasRoot ? [ HTML ] : HTML._xnodes );\r
+                       xnodes = ret;\r
                };\r
 \r
                return xnodes.length === 1 ? xnodes[ 0 ] : new X.Dom.NodeList( xnodes );\r
        };\r
        \r
+       X.Dom.Query._sortElementOrder = function( newList, list, xnodes ){\r
+               var l = xnodes.length,\r
+                       i = 0,\r
+                       j, child, _xnodes;\r
+               for( ; i < l; ++i ){\r
+                       child = xnodes[ i ];\r
+                       if( child._xnodeType !== 1 ) continue;\r
+                       //console.log( child._tag );\r
+                       if( ( j = list.indexOf( child ) ) !== -1 ){\r
+                               newList[ newList.length ] = child;\r
+                               list.splice( j, 1 );\r
+                               if( list.length === 1 ){\r
+                                       newList[ newList.length ] = list[ 0 ];\r
+                                       list.length = 0;\r
+                                       return true;\r
+                               };\r
+                               if( list.length === 0 ) return true;\r
+                       };\r
+                       if( ( _xnodes = child._xnodes ) && X.Dom.Query._sortElementOrder( newList, list, _xnodes ) ){\r
+                               return true;\r
+                       };\r
+               };\r
+       };\r
+       \r
        X.Dom.Query._fetchElements = function( list, parent, tag ){\r
                var xnodes = parent._xnodes,\r
                        l      = xnodes.length,\r
@@ -693,3 +726,5 @@ X.Dom.Query._filter = {
        }\r
 };\r
 \r
+\r
+\r