X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fselector.js;h=b404064a98e2df010f95ed34e6b3976256646b65;hb=e10e625bf4865cb8e9927e94d15afa37f6537a03;hp=2e6d8e1abde5deda788f3989b8ae976ef25bdb84;hpb=9c0ddfa2ad14388ba8ff138b96966e993308f6cf;p=jquery.git diff --git a/src/selector.js b/src/selector.js index 2e6d8e1..b404064 100644 --- a/src/selector.js +++ b/src/selector.js @@ -8,7 +8,8 @@ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g, done = 0, - toString = Object.prototype.toString; + toString = Object.prototype.toString, + hasDuplicate = false; var Sizzle = function(selector, context, results, seed) { results = results || []; @@ -65,7 +66,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 ) { @@ -124,22 +125,25 @@ var Sizzle = function(selector, context, results, seed) { if ( extra ) { Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; - if ( sortOrder ) { - hasDuplicate = false; - results.sort(sortOrder); +Sizzle.uniqueSort = function(results){ + if ( sortOrder ) { + hasDuplicate = false; + results.sort(sortOrder); - if ( hasDuplicate ) { - for ( var i = 1; i < results.length; i++ ) { - if ( results[i] === results[i-1] ) { - results.splice(i--, 1); - } + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[i-1] ) { + results.splice(i--, 1); } } } } - - return results; }; Sizzle.matches = function(expr, set){ @@ -653,7 +657,7 @@ var Expr = Sizzle.selectors = { var origPOS = Expr.match.POS; for ( var type in Expr.match ) { - Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); } var makeArray = function(array, results) { @@ -732,9 +736,9 @@ if ( document.documentElement.compareDocumentPosition ) { // querying by getElementById (and provide a workaround) (function(){ // We're going to inject a fake input element with a specified name - var form = document.createElement("form"), + var form = document.createElement("div"), id = "script" + (new Date).getTime(); - form.innerHTML = ""; + form.innerHTML = ""; // Inject it into the root element, check its status, and remove it quickly var root = document.documentElement; @@ -757,6 +761,7 @@ if ( document.documentElement.compareDocumentPosition ) { } root.removeChild( form ); + root = form = null; // release memory in IE })(); (function(){ @@ -797,6 +802,8 @@ if ( document.documentElement.compareDocumentPosition ) { return elem.getAttribute("href", 2); }; } + + div = null; // release memory in IE })(); if ( document.querySelectorAll ) (function(){ @@ -823,10 +830,11 @@ if ( document.querySelectorAll ) (function(){ return oldSizzle(query, context, extra, seed); }; - Sizzle.find = oldSizzle.find; - Sizzle.filter = oldSizzle.filter; - Sizzle.selectors = oldSizzle.selectors; - Sizzle.matches = oldSizzle.matches; + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + div = null; // release memory in IE })(); if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){ @@ -849,6 +857,8 @@ if ( document.getElementsByClassName && document.documentElement.getElementsByCl return context.getElementsByClassName(match[1]); } }; + + div = null; // release memory in IE })(); function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { @@ -938,7 +948,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){ @@ -967,7 +977,7 @@ jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.filters; Sizzle.selectors.filters.hidden = function(elem){ - return elem.offsetWidth === 0 || elem.offsetHeight === 0; + return elem.offsetWidth === 0 && elem.offsetHeight === 0; }; Sizzle.selectors.filters.visible = function(elem){