diff --git a/src/sizzle-jquery.js b/src/sizzle-jquery.js index cb4c8e17..4243c504 100644 --- a/src/sizzle-jquery.js +++ b/src/sizzle-jquery.js @@ -4,5 +4,6 @@ jQuery.expr[":"] = jQuery.expr.filters; jQuery.unique = Sizzle.uniqueSort; jQuery.getText = getText; jQuery.isXMLDoc = isXML; +jQuery.contains = contains; return; diff --git a/src/traversing.js b/src/traversing.js index 57621a39..d6947ace 100644 --- a/src/traversing.js +++ b/src/traversing.js @@ -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); }, diff --git a/test/unit/traversing.js b/test/unit/traversing.js index 7b046e3d..a235bbd5 100644 --- a/test/unit/traversing.js +++ b/test/unit/traversing.js @@ -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);