| define( [ |
| "../core", |
| "../var/indexOf", |
| "../var/isFunction", |
| "./var/rneedsContext", |
| "../selector" |
| ], function( jQuery, indexOf, isFunction, rneedsContext ) { |
| |
| "use strict"; |
| |
| // Implement the identical functionality for filter and not |
| function winnow( elements, qualifier, not ) { |
| if ( isFunction( qualifier ) ) { |
| return jQuery.grep( elements, function( elem, i ) { |
| return !!qualifier.call( elem, i, elem ) !== not; |
| } ); |
| } |
| |
| // Single element |
| if ( qualifier.nodeType ) { |
| return jQuery.grep( elements, function( elem ) { |
| return ( elem === qualifier ) !== not; |
| } ); |
| } |
| |
| // Arraylike of elements (jQuery, arguments, Array) |
| if ( typeof qualifier !== "string" ) { |
| return jQuery.grep( elements, function( elem ) { |
| return ( indexOf.call( qualifier, elem ) > -1 ) !== not; |
| } ); |
| } |
| |
| // Filtered directly for both simple and complex selectors |
| return jQuery.filter( qualifier, elements, not ); |
| } |
| |
| jQuery.filter = function( expr, elems, not ) { |
| var elem = elems[ 0 ]; |
| |
| if ( not ) { |
| expr = ":not(" + expr + ")"; |
| } |
| |
| if ( elems.length === 1 && elem.nodeType === 1 ) { |
| return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; |
| } |
| |
| return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { |
| return elem.nodeType === 1; |
| } ) ); |
| }; |
| |
| jQuery.fn.extend( { |
| find: function( selector ) { |
| var i, ret, |
| len = this.length, |
| self = this; |
| |
| if ( typeof selector !== "string" ) { |
| return this.pushStack( jQuery( selector ).filter( function() { |
| for ( i = 0; i < len; i++ ) { |
| if ( jQuery.contains( self[ i ], this ) ) { |
| return true; |
| } |
| } |
| } ) ); |
| } |
| |
| ret = this.pushStack( [] ); |
| |
| for ( i = 0; i < len; i++ ) { |
| jQuery.find( selector, self[ i ], ret ); |
| } |
| |
| return len > 1 ? jQuery.uniqueSort( ret ) : ret; |
| }, |
| filter: function( selector ) { |
| return this.pushStack( winnow( this, selector || [], false ) ); |
| }, |
| not: function( selector ) { |
| return this.pushStack( winnow( this, selector || [], true ) ); |
| }, |
| is: function( selector ) { |
| return !!winnow( |
| this, |
| |
| // If this is a positional/relative selector, check membership in the returned set |
| // so $("p:first").is("p:last") won't return true for a doc with two "p". |
| typeof selector === "string" && rneedsContext.test( selector ) ? |
| jQuery( selector ) : |
| selector || [], |
| false |
| ).length; |
| } |
| } ); |
| |
| } ); |