diff options
author | John Resig <jeresig@gmail.com> | 2009-02-14 16:59:10 +0000 |
---|---|---|
committer | John Resig <jeresig@gmail.com> | 2009-02-14 16:59:10 +0000 |
commit | e16c7fe0f8e2998d2e3ca1bc8f0794c43b29526f (patch) | |
tree | 5d9196b6e3a829d71bb956c0d057285ae63ad350 /src/selector.js | |
parent | 848c45ea17cc03bcabd7ab882359e1c62f9485f5 (diff) | |
download | jquery-e16c7fe0f8e2998d2e3ca1bc8f0794c43b29526f.tar.gz jquery-e16c7fe0f8e2998d2e3ca1bc8f0794c43b29526f.zip |
Make sure that elements are returned in document order - and that the results are unique.
Diffstat (limited to 'src/selector.js')
-rw-r--r-- | src/selector.js | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/selector.js b/src/selector.js index 331ad3c07..bc898e143 100644 --- a/src/selector.js +++ b/src/selector.js @@ -111,6 +111,19 @@ var Sizzle = function(selector, context, results, seed) { if ( extra ) { Sizzle( extra, context, results, seed ); + + 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); + } + } + } + } } return results; @@ -648,6 +661,26 @@ try { }; } +var sortOrder; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( document.documentElement.sourceIndex === 0 ) { + sortOrder = function( a, b ) { + var ret = a.sourceIndex - b.sourceIndex; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} + // Check to see if the browser returns elements by name when // querying by getElementById (and provide a workaround) (function(){ |