From 24e96ba22ca86e54f2442b88ffd2b7ea3f60f0bf Mon Sep 17 00:00:00 2001 From: jeresig Date: Thu, 3 Dec 2009 11:14:10 -0500 Subject: [PATCH] Re-worked the closest no-duplicate-selector code again to be more efficient. --- src/traversing.js | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/traversing.js b/src/traversing.js index 609e2eb..5836ab5 100644 --- a/src/traversing.js +++ b/src/traversing.js @@ -56,29 +56,26 @@ jQuery.fn.extend({ closest: function( selectors, context ) { if ( jQuery.isArray( selectors ) ) { - var ret = [], cur = this[0], match, selector, done; + var ret = [], cur = this[0], match, matches = {}, selector; if ( cur && selectors.length ) { for ( var i = 0, l = selectors.length; i < l; i++ ) { - selectors[i] = jQuery.expr.match.POS.test( selector ) ? - jQuery( selector, context || this.context ) : - selectors[i]; + selector = selectors[i]; + + if ( !matches[selector] ) { + matches[selector] = jQuery.expr.match.POS.test( selector ) ? + jQuery( selector, context || this.context ) : + selector; + } } while ( cur && cur.ownerDocument && cur !== context ) { - for ( var i = 0; i < selectors.length; i++ ) { - match = selectors[i]; - selector = match.selector || match; - - // Get rid of duplicate selectors - if ( selector === done ) { - selectors.splice(i--, 1); + for ( selector in matches ) { + match = matches[selector]; - // See if we have a match - } else if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { + if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { ret.push({ selector: selector, elem: cur }); - selectors.splice(i--, 1); - done = selector; + delete matches[selector]; } } cur = cur.parentNode; -- 1.7.10.4