X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=src%2Fselector.js;h=e58b2571cbc598f028e7fb97f931402760ad1661;hb=410e13b40097fa6b26ce9a27f865ff258efa23b4;hp=2e6d8e1abde5deda788f3989b8ae976ef25bdb84;hpb=9c0ddfa2ad14388ba8ff138b96966e993308f6cf;p=jquery.git diff --git a/src/selector.js b/src/selector.js index 2e6d8e1..e58b257 100644 --- a/src/selector.js +++ b/src/selector.js @@ -8,7 +8,10 @@ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g, done = 0, - toString = Object.prototype.toString; + toString = Object.prototype.toString, + arraySplice = Array.prototype.splice, + arrayPush = Array.prototype.push, + arraySort = Array.prototype.sort; var Sizzle = function(selector, context, results, seed) { results = results || []; @@ -65,7 +68,7 @@ var Sizzle = function(selector, context, results, seed) { if ( context ) { var ret = seed ? { expr: parts.pop(), set: makeArray(seed) } : - Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, contextXML ); + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; if ( parts.length > 0 ) { @@ -104,17 +107,17 @@ var Sizzle = function(selector, context, results, seed) { if ( toString.call(checkSet) === "[object Array]" ) { if ( !prune ) { - results.push.apply( results, checkSet ); + arrayPush.apply( results, checkSet ); } else if ( context && context.nodeType === 1 ) { for ( var i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { - results.push( set[i] ); + arrayPush.call( results, set[i] ); } } } else { for ( var i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && checkSet[i].nodeType === 1 ) { - results.push( set[i] ); + arrayPush.call( results, set[i] ); } } } @@ -124,22 +127,25 @@ var Sizzle = function(selector, context, results, seed) { if ( extra ) { Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } - if ( sortOrder ) { - hasDuplicate = false; - results.sort(sortOrder); + return results; +}; - if ( hasDuplicate ) { - for ( var i = 1; i < results.length; i++ ) { - if ( results[i] === results[i-1] ) { - results.splice(i--, 1); - } +Sizzle.uniqueSort = function(results){ + if ( sortOrder ) { + hasDuplicate = false; + arraySort.call(results, sortOrder); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[i-1] ) { + arraySplice.call(results, i--, 1); } } } } - - return results; }; Sizzle.matches = function(expr, set){ @@ -660,7 +666,7 @@ var makeArray = function(array, results) { array = Array.prototype.slice.call( array ); if ( results ) { - results.push.apply( results, array ); + arrayPush.apply( results, array ); return results; } @@ -938,7 +944,7 @@ var contains = document.compareDocumentPosition ? function(a, b){ var isXML = function(elem){ return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || - !!elem.ownerDocument && isXML( elem.ownerDocument ); + !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML"; }; var posProcess = function(selector, context){