X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=src%2Ftraversing.js;h=5836ab578ce1334140cb470192f1c67810317ad6;hb=9d6c4d8413e678203a905ab3bc3a87415a6a70ce;hp=737efa429b37199ff6827842a826654f31358545;hpb=e534a310c7e99c44d93855ad5865ad5e985039ba;p=jquery.git diff --git a/src/traversing.js b/src/traversing.js index 737efa4..5836ab5 100644 --- a/src/traversing.js +++ b/src/traversing.js @@ -56,22 +56,26 @@ jQuery.fn.extend({ closest: function( selectors, context ) { if ( jQuery.isArray( selectors ) ) { - var ret = [], cur = this[0], selector; + var ret = [], cur = this[0], match, matches = {}, selector; - if ( cur ) { + 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++ ) { - selector = selectors[i]; - if ( selector.jquery ? selector.index(cur) > -1 : jQuery(cur).is(selector) ) { - selector = selector.selector || selector; + for ( selector in matches ) { + match = matches[selector]; + + if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { ret.push({ selector: selector, elem: cur }); - selectors.splice(i--, 1); + delete matches[selector]; } } cur = cur.parentNode;