Landing in jQuery.contains, jQuery.fn.contains, and jQuery.fn.has support. Fixes...
authorYehuda Katz <wycats@gmail.com>
Wed, 9 Dec 2009 20:43:13 +0000 (12:43 -0800)
committerJohn Resig <jeresig@gmail.com>
Wed, 9 Dec 2009 20:43:13 +0000 (12:43 -0800)
src/sizzle-jquery.js
src/traversing.js
test/unit/traversing.js

index cb4c8e1..4243c50 100644 (file)
@@ -4,5 +4,6 @@ jQuery.expr[":"] = jQuery.expr.filters;
 jQuery.unique = Sizzle.uniqueSort;
 jQuery.getText = getText;
 jQuery.isXMLDoc = isXML;
+jQuery.contains = contains;
 
 return;
index 57621a3..d6947ac 100644 (file)
@@ -57,6 +57,21 @@ jQuery.fn.extend({
                return ret;
        },
 
+       has: function( target ) {
+               var targets = jQuery( target );
+               return this.filter(function() {
+                       for ( var i = 0, l = targets.length; i < l; i++ ) {
+                               if ( jQuery.contains( this, targets[i] ) ) {
+                                       return true;
+                               }
+                       }
+               });
+       },
+
+       contains: function( target ) {
+               return this.has( target ).length > 0;
+       },
+
        not: function( selector ) {
                return this.pushStack( winnow(this, selector, false), "not", selector);
        },
index 7b046e3..a235bbd 100644 (file)
@@ -152,7 +152,43 @@ test("not(jQuery)", function() {
        expect(1);
 
        same( jQuery("p").not(jQuery("#ap, #sndp, .result")).get(), q("firstp", "en", "sap", "first"), "not(jQuery)" );
-})
+});
+
+test("has(Element)", function() {
+       expect(2);
+
+       var obj = jQuery("#main").has(jQuery("#sndp")[0]);
+       same( obj.get(), q("main"), "Keeps elements that have the element as a descendant" );
+
+       var multipleParent = jQuery("#main, #header").has(jQuery("#sndp")[0]);
+       same( obj.get(), q("main"), "Does not include elements that do not have the element as a descendant" );
+});
+
+test("has(Selector)", function() {
+       expect(3);
+
+       var obj = jQuery("#main").has("#sndp");
+       same( obj.get(), q("main"), "Keeps elements that have any element matching the selector as a descendant" );
+
+       var multipleParent = jQuery("#main, #header").has("#sndp");
+       same( obj.get(), q("main"), "Does not include elements that do not have the element as a descendant" );
+
+       var multipleHas = jQuery("#main").has("#sndp, #first");
+       same( multipleHas.get(), q("main"), "Only adds elements once" );
+});
+
+test("has(Arrayish)", function() {
+       expect(3);
+
+       var simple = jQuery("#main").has(jQuery("#sndp"));
+       same( simple.get(), q("main"), "Keeps elements that have any element in the jQuery list as a descendant" );
+
+       var multipleParent = jQuery("#main, #header").has(jQuery("#sndp"));
+       same( multipleParent.get(), q("main"), "Does not include elements that do not have an element in the jQuery list as a descendant" );
+
+       var multipleHas = jQuery("#main").has(jQuery("#sndp, #first"));
+       same( simple.get(), q("main"), "Only adds elements once" );
+});
 
 test("andSelf()", function() {
        expect(4);