Merge branch 'closestbug-6700' of http://github.com/ajpiano/jquery into ajpiano-close...
authorjeresig <jeresig@gmail.com>
Mon, 27 Sep 2010 19:45:02 +0000 (15:45 -0400)
committerjeresig <jeresig@gmail.com>
Mon, 27 Sep 2010 19:45:02 +0000 (15:45 -0400)
1  2 
src/traversing.js
test/unit/traversing.js

diff --combined src/traversing.js
@@@ -1,5 -1,3 +1,5 @@@
 +(function( jQuery ) {
 +
  var runtil = /Until$/,
        rparentsprev = /^(?:parents|prevUntil|prevAll)/,
        // Note: This RegExp should be improved, or likely pulled from Sizzle
@@@ -55,9 -53,10 +55,10 @@@ jQuery.fn.extend(
        },
  
        closest: function( selectors, context ) {
+               var ret;
                if ( jQuery.isArray( selectors ) ) {
-                       var ret = [], cur = this[0], match, matches = {}, selector, level = 1;
+                       var cur = this[0], match, matches = {}, selector, level = 1;
+                       ret = [];
                        if ( cur && selectors.length ) {
                                for ( var i = 0, l = selectors.length; i < l; i++ ) {
                                        selector = selectors[i];
                                }
                        }
  
-                       return ret;
+                       return ret.length > 1 ? jQuery.unique(ret) : ret;
                }
  
                var pos = jQuery.expr.match.POS.test( selectors ) ? 
                        jQuery( selectors, context || this.context ) : null;
-               return this.map(function( i, cur ) {
+               ret = jQuery.map(this.get(),function( cur,i ) {
                        while ( cur && cur.ownerDocument && cur !== context ) {
                                if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {
                                        return cur;
                        }
                        return null;
                });
+               
+               ret = ret.length > 1 ? jQuery.unique(ret) : ret;
+               
+               return this.pushStack( ret, "closest", selectors );
        },
        
        // Determine the position of an element within
@@@ -273,5 -275,3 +277,5 @@@ function winnow( elements, qualifier, k
                return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
        });
  }
 +
 +})( jQuery );
diff --combined test/unit/traversing.js
@@@ -120,7 -120,7 +120,7 @@@ test("filter(jQuery)", function() 
  })
  
  test("closest()", function() {
-       expect(9);
+       expect(10);
        same( jQuery("body").closest("body").get(), q("body"), "closest(body)" );
        same( jQuery("body").closest("html").get(), q("html"), "closest(html)" );
        same( jQuery("body").closest("div").get(), [], "closest(div)" );
        same( jq.closest("html", document.body).get(), [], "Context limited." );
        same( jq.closest("body", document.body).get(), [], "Context limited." );
        same( jq.closest("#nothiddendiv", document.body).get(), q("nothiddendiv"), "Context not reached." );
+       
+       //Test that .closest() returns unique'd set
+       equals( jQuery('#main p').closest('#main').length, 1, "Closest should return a unique set" );
+       
  });
  
  test("closest(Array)", function() {
@@@ -152,7 -156,7 +156,7 @@@ test("not(Selector)", function() 
        equals( jQuery("#main > p#ap > a").not("#google").length, 2, "not('selector')" );
        same( jQuery("p").not(".result").get(), q("firstp", "ap", "sndp", "en", "sap", "first"), "not('.class')" );
        same( jQuery("p").not("#ap, #sndp, .result").get(), q("firstp", "en", "sap", "first"), "not('selector, selector')" );
 -      same( jQuery("#form option").not("option.emptyopt:contains('Nothing'),[selected],[value='1']").get(), q("option1c", "option1d", "option2c", "option3d", "option3e" ), "not('complex selector')");
 +      same( jQuery("#form option").not("option.emptyopt:contains('Nothing'),[selected],[value='1']").get(), q("option1c", "option1d", "option2c", "option3d", "option3e", "option4e" ), "not('complex selector')");
  
        same( jQuery('#ap *').not('code').get(), q("google", "groups", "anchor1", "mark"), "not('tag selector')" );
        same( jQuery('#ap *').not('code, #mark').get(), q("google", "groups", "anchor1"), "not('tag, ID selector')" );
@@@ -163,7 -167,7 +167,7 @@@ test("not(Element)", function() 
        expect(1);
  
        var selects = jQuery("#form select");
 -      same( selects.not( selects[1] ).get(), q("select1", "select3"), "filter out DOM element");
 +      same( selects.not( selects[1] ).get(), q("select1", "select3", "select4"), "filter out DOM element");
  });
  
  test("not(Function)", function() {