Re-worked the closest no-duplicate-selector code again to be more efficient.

This commit is contained in:
jeresig 2009-12-03 11:14:10 -05:00
parent 525bb27bc0
commit 24e96ba22c

View file

@ -56,29 +56,26 @@ jQuery.fn.extend({
closest: function( selectors, context ) { closest: function( selectors, context ) {
if ( jQuery.isArray( selectors ) ) { if ( jQuery.isArray( selectors ) ) {
var ret = [], cur = this[0], match, selector, done; var ret = [], cur = this[0], match, matches = {}, selector;
if ( cur && selectors.length ) { if ( cur && selectors.length ) {
for ( var i = 0, l = selectors.length; i < l; i++ ) { for ( var i = 0, l = selectors.length; i < l; i++ ) {
selectors[i] = jQuery.expr.match.POS.test( selector ) ? selector = selectors[i];
if ( !matches[selector] ) {
matches[selector] = jQuery.expr.match.POS.test( selector ) ?
jQuery( selector, context || this.context ) : jQuery( selector, context || this.context ) :
selectors[i]; selector;
}
} }
while ( cur && cur.ownerDocument && cur !== context ) { while ( cur && cur.ownerDocument && cur !== context ) {
for ( var i = 0; i < selectors.length; i++ ) { for ( selector in matches ) {
match = selectors[i]; match = matches[selector];
selector = match.selector || match;
// Get rid of duplicate selectors if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
if ( selector === done ) {
selectors.splice(i--, 1);
// See if we have a match
} else if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
ret.push({ selector: selector, elem: cur }); ret.push({ selector: selector, elem: cur });
selectors.splice(i--, 1); delete matches[selector];
done = selector;
} }
} }
cur = cur.parentNode; cur = cur.parentNode;