OSDN Git Service

Version 0.6.159, fix X.Class & X.XHR.Gadget.
[pettanr/clientJs.git] / 0.6.x / js / 02_dom / 08_XNodeSelector.js
index 578d9b2..727ac95 100644 (file)
@@ -1,4 +1,4 @@
-/**\r
+/*\r
  * Original code by ofk ( kQuery, ksk )\r
  * http://d.hatena.ne.jp/ofk/comment/20090106/1231258010\r
  * http://d.hatena.ne.jp/ofk/20090111/1231668170 \r
@@ -56,9 +56,6 @@ var
        // TODO { a : 1, A : 2, _ : 3,,, }\r
        X_Node_Selector__ALPHABET  = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-0123456789\\',\r
        X_Node_Selector__NUMBER    = '+-0123456789';\r
-\r
-// XMLWrapper のために今だけ外部に公開\r
-X_NodeSelector_parse = X_Node_Selector__parse;\r
                \r
 /*\r
  * セレクタ文字列の解析、但し一挙に行わず、ひと塊づつ\r
@@ -81,10 +78,11 @@ function X_Node_Selector__parse( query, last ){
                chr, chrCode, nameChr, name1st,\r
                tmp, escape, quot, start,\r
                name, key, value, operator, a, b, not;\r
+\r
        query += ' ';\r
        while( i < l ){\r
                chr     = query.charAt( ++i );\r
-               chrCode = ALPHABET.indexOf( chr );\r
+               chrCode = ALPHABET.indexOf( chr ); // TODO この関数無くす!\r
                nameChr = chrCode !== -1;\r
                name1st = nameChr && chrCode < 52;\r
                switch( phase ){\r
@@ -228,8 +226,32 @@ function X_Node_Selector__parse( query, last ){
        return not ? [ i + tmp + 1, [ combinator, 6, result ] ] : [ i, result ];\r
 };\r
 \r
-       // セレクター\r
-       X[ 'Doc' ][ 'find' ] = X_shortcutFunction = Node.prototype[ 'find' ] = X_NodeList.prototype[ 'find' ] = function ( queryString ){\r
+       /**\r
+        * selector を使って Node, NodeList を取得する\r
+        * @alias X.Doc.find\r
+        * @function\r
+        * @param {string} セレクター文字列\r
+        * @return {Node|NodeList}\r
+        */\r
+       X[ 'Doc' ][ 'find' ] = X_shortcutFunction =\r
+\r
+       /**\r
+        * selector を使って Node, NodeList を取得する\r
+        * @alias NodeList.prototype.find\r
+        * @function\r
+        * @param {string} セレクター文字列\r
+        * @return {Node|NodeList}\r
+        */\r
+       X_NodeList.prototype[ 'find' ] = X_Node_find;\r
+       \r
+       /**\r
+        * selector を使って Node, NodeList を取得する\r
+        * @alias Node.prototype.find\r
+        * @function\r
+        * @param {string} セレクター文字列\r
+        * @return {Node|NodeList}\r
+        */     \r
+       function X_Node_find( queryString ){\r
                var HTML      = X_Node_html,\r
                        scope     = this.constructor === X_NodeList && this.length ? this : [ this.constructor === Node ? this : X_Node_body ],\r
                        parents   = scope, // 探索元の親要素 XNodeList の場合あり\r
@@ -396,10 +418,7 @@ function X_Node_Selector__parse( query, last ){
                                                };\r
                                                //console.log( l + ' > ' + xnodes.length + ' tag:' + tagName );\r
                                                merge = {};\r
-                                               for( ; i < l; ++i ){\r
-                                                       xnode = parents[ i ];\r
-                                                       xnode[ '_xnodes' ] && xnode[ '_xnodes' ].length && X_Node_Selector__fetchElements( xnodes, xnode, isAll ? '' : tagName, merge );\r
-                                               };\r
+                                               X_Node_Selector__fetchElements( xnodes, parents, isAll ? '' : tagName, merge );\r
                                                //console.log( l + ' >> ' + xnodes.length + ' tag:' + tagName );\r
                                        };\r
                        };\r
@@ -611,23 +630,69 @@ function X_Node_Selector__parse( query, last ){
                        };\r
                };\r
        };\r
-       \r
-       function X_Node_Selector__fetchElements( list, parent, tag, merge ){\r
-               var xnodes = parent[ '_xnodes' ],\r
-                       l      = xnodes.length,\r
+\r
+       function X_Node_Selector__fetchElements( list, xnodes, tag, merge ){\r
+               var l      = xnodes.length,\r
                        i      = 0,\r
-                       child, uid;\r
+                       child, uid, _tag, _xnodes;\r
                for( ; i < l; ++i ){\r
                        child = xnodes[ i ];\r
                        uid   = child[ '_uid' ];\r
-                       if( !merge[ uid ] && child[ '_tag' ] ){\r
+                       _tag  = child[ '_tag' ];\r
+                       if( !merge[ uid ] && _tag ){\r
                                merge[ uid ] = true;\r
-                               ( !tag || child[ '_tag' ] === tag ) && ( list[ list.length ] = child );\r
-                               child[ '_xnodes' ] && X_Node_Selector__fetchElements( list, child, tag, merge );\r
+                               ( !tag || tag === _tag ) && ( list[ list.length ] = child );\r
+                               if( ( _xnodes = child[ '_xnodes' ] ) && ( 1 < _xnodes.length || ( _xnodes[ 0 ] && _xnodes[ 0 ][ '_tag' ] ) ) ){\r
+                                       X_Node_Selector__fetchElements( list, _xnodes, tag, merge );\r
+                               };\r
                        };\r
                };\r
        };\r
-\r
+/*\r
+       function X_Node_Selector__fetchElements( list, parent, tag, merge ){\r
+               \r
+               var xnodes   = parent[ '_xnodes' ],\r
+                       memory   = {\r
+                               i      : 0,\r
+                               l      : xnodes.length,\r
+                               xnodes : xnodes\r
+                       },              \r
+                       memories = [ memory ],\r
+                       i, l, xnode,\r
+                       uid, _xnodes;\r
+               \r
+               while( memories.length ){\r
+                       memory = memories.pop();\r
+                       xnodes = memory.xnodes;\r
+                       i      = memory.i;\r
+                       l      = memory.l;\r
+                       for( ; i < l; ++i ){\r
+                               xnode = xnodes[ i ];\r
+                               uid   = xnode[ '_uid' ];\r
+                               if( !merge[ uid ] && xnode[ '_tag' ] ){\r
+                                       if( !tag || xnode[ '_tag' ] === tag ) list[ list.length ] = xnode;\r
+                                       \r
+                                       if( _xnodes = xnode[ '_xnodes' ] ){\r
+                                               if( 1 < _xnodes.length || ( _xnodes[ 0 ] && _xnodes[ 0 ][ '_tag' ] ) ){\r
+                                                       memory.i = i + 1;\r
+                                                       memory.l = l;\r
+                                                       memory.xnodes = xnodes;\r
+                                                       memories[ memories.length ] = memory;\r
+                                                       memories[ memories.length ] = {\r
+                                                               i      : 0,\r
+                                                               l      : _xnodes.length,\r
+                                                               xnodes : _xnodes\r
+                                                       };\r
+                                                       merge[ uid ] = true;\r
+                                                       break;\r
+                                               };\r
+                                       };\r
+                               };\r
+                               merge[ uid ] = true;\r
+                       };\r
+               };\r
+       };\r
+ */\r
        function X_Node_Selector__funcSelectorChild( type, flag_all, flags, xnodes ){\r
                var res      = [],\r
                        flag_not = flags.not,\r
@@ -658,8 +723,7 @@ function X_Node_Selector__parse( query, last ){
                return res;\r
        };\r
        function X_Node_Selector__funcSelectorNth( pointer, sibling, flag_all, flags, xnodes, a, b ){\r
-               var _data    = funcData,\r
-                       res      = [],\r
+               var res      = [],\r
                        checked  = {},\r
                        flag_not = flags.not,\r
                        i = 0, n = -1, uid,\r