};\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
- 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
- parents = scope, // 探索元の親要素\r
+ isStart = true,\r
+ _ = ' ',\r
+ isAll, isNot, hasRoot,\r
l, i, n, parsed,\r
xnodes, // 一時保存用\r
merge, // 要素がコメントノードで汚染されている場合使う\r
- combinator, selector, name, tagName, \r
- isAll, isStart = true, isNot,\r
+ combinator, selector, name, tagName,\r
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! X.Dom.listen( 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 + ']' + queryString.length );\r
+ console.log( 'queryString[' + queryString + ']' );\r
\r
// 初期化処理\r
if( !parsed ){\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
};\r
\r
-\r
- \r
combinator = parsed[ 0 ];\r
selector = parsed[ 1 ];\r
name = parsed[ 2 ];\r
break;\r
\r
default :\r
- if( combinator === 1 || isStart ){\r
+ if( combinator === 1 || ( isStart && selector < 7 ) ){\r
console.log( l + ' > ' + xnodes.length + ' tag:' + tagName );\r
for( ; i < l; ++i ){\r
xnode = parents[ i ];\r
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 = root._rawNode.links ){\r
+ if( links = document.links ){\r
for( xnodes = [], i = links.length; i; ){\r
xnodes[ --i ] = new Node( links[ i ] );\r
};\r
- };\r
+ } else {\r
+ // area[href],a[href]\r
+ }\r
};\r
\r
if( filter && xnodes.length ){\r
tmp = [];\r
key = filter[ 0 ];\r
op = filter[ 1 ];\r
- val = filter[ 2 ]; \r
+ val = filter[ 2 ];\r
+ \r
+ key = X.Dom.Attr.renameForTag[ key ] || key;\r
+ \r
// [class~='val']\r
if( !isXML && key === 'class' && op === 3 ){\r
- val = ' ' + val + ' ';\r
+ val = _ + val + _;\r
for( i = 0, n = -1; xnode = xnodes[ i ]; ++i ){\r
className = xnode._className;\r
- if( !!( className && ( ' ' + className + ' ' ).indexOf( val ) > -1 ) ^ isNot ) tmp[ ++n ] = xnode;\r
+ if( !!( className && ( _ + className + _ ).indexOf( val ) > -1 ) ^ isNot ) tmp[ ++n ] = xnode;\r
};\r
} else {\r
// 通常\r
useName = X.UA.IE && key !== 'href' && key !== 'src';\r
toLower = !!val && !isXML && noLower.indexOf( key ) === -1; //!noLower.test(key);\r
if( toLower ) val = val.toLowerCase();\r
- if( op === 3 ) val = ' ' + val + ' ';\r
+ if( op === 3 ) val = _ + val + _;\r
\r
for( i = 0, n = -1, l = xnodes.length; i < l; ++i ){\r
xnode = xnodes[ i ];\r
//useName ?\r
// elem[ X.Dom.Attr.renameForDOM[ key ] || key ] :\r
// elem.getAttribute( key, 2 );\r
- flag = attr != null && ( !useName || attr !== '' );\r
+ flag = attr != null;// && ( !useName || attr !== '' );\r
if( flag && op ){\r
if( toLower ) attr = attr.toLowerCase();\r
\r
flag = attr !== val;\r
break;\r
case 3: // ~=\r
- flag = ( ' ' + attr + ' ' ).indexOf( val ) !== -1;\r
+ flag = ( _ + attr + _ ).indexOf( val ) !== -1;\r
break;\r
case 4: // ^=\r
flag = attr.indexOf( val ) === 0;\r
};\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
}\r
};\r
\r
+\r
+\r