Added support for .closest(filter, DOMElement). Fixes #4072.
authorJohn Resig <jeresig@gmail.com>
Tue, 28 Jul 2009 12:28:59 +0000 (12:28 +0000)
committerJohn Resig <jeresig@gmail.com>
Tue, 28 Jul 2009 12:28:59 +0000 (12:28 +0000)
src/traversing.js
test/unit/traversing.js

index db446cf..f46820f 100644 (file)
@@ -51,13 +51,13 @@ jQuery.fn.extend({
                return this.pushStack( jQuery.winnow(this, selector, true), "filter", selector );
        },
 
-       closest: function( selector ) {
+       closest: function( selector, context ) {
                var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
                        closer = 0;
 
                return this.map(function(){
                        var cur = this;
-                       while ( cur && cur.ownerDocument ) {
+                       while ( cur && cur.ownerDocument && cur !== context ) {
                                if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
                                        jQuery.data(cur, "closest", closer);
                                        return cur;
index f585d9c..1a7e6ee 100644 (file)
@@ -91,7 +91,7 @@ test("filter(jQuery)", function() {
 })
 
 test("closest()", function() {
-       expect(6);
+       expect(9);
        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)" );
@@ -99,6 +99,12 @@ test("closest()", function() {
 
        isSet( jQuery("div:eq(1)").closest("div:first").get(), [], "closest(div:first)" );
        isSet( jQuery("div").closest("body:first div:last").get(), q("fx-tests"), "closest(body:first div:last)" );
+
+       // Test .closest() limited by the context
+       var jq = jQuery("#nothiddendivchild");
+       isSet( jq.closest("html", document.body).get(), [], "Context limited." );
+       isSet( jq.closest("body", document.body).get(), [], "Context limited." );
+       isSet( jq.closest("#nothiddendiv", document.body).get(), q("nothiddendiv"), "Context not reached." );
 });
 
 test("not(Selector)", function() {