.closest() with positional selectors wasn't worked as expected.
authorJohn Resig <jeresig@gmail.com>
Sat, 10 Jan 2009 20:30:03 +0000 (20:30 +0000)
committerJohn Resig <jeresig@gmail.com>
Sat, 10 Jan 2009 20:30:03 +0000 (20:30 +0000)
src/core.js
test/unit/core.js

index 4047170..24438e3 100644 (file)
@@ -342,10 +342,12 @@ jQuery.fn = jQuery.prototype = {
        },
 
        closest: function( selector ) {
+               var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null;
+
                return this.map(function(){
                        var cur = this;
                        while ( cur && cur.ownerDocument ) {
-                               if ( jQuery(cur).is(selector) )
+                               if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) )
                                        return cur;
                                cur = cur.parentNode;
                        }
index 1ec3487..494917e 100644 (file)
@@ -1407,11 +1407,14 @@ test("filter()", function() {
 });
 
 test("closest()", function() {
-       expect(4);
+       expect(6);
        isSet( jQuery("body").closest("body").get(), q("body"), "closest(body)" );
        isSet( jQuery("body").closest("html").get(), q("html"), "closest(html)" );
        isSet( jQuery("body").closest("div").get(), [], "closest(div)" );
        isSet( jQuery("#main").closest("span,#html").get(), q("html"), "closest(span,#html)" );
+
+       isSet( jQuery("div:eq(1)").closest("div:first").get(), [], "closest(div:first)" );
+       isSet( jQuery("div").closest("body:first div:last").get(), q("divWithNoTabIndex"), "closest(body:first div:last)" );
 });
 
 test("not()", function() {