Permalink
Cannot retrieve contributors at this time
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
106 lines (88 sloc)
2.61 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| define( [ | |
| "../core", | |
| "../var/indexOf", | |
| "./var/rneedsContext", | |
| "../selector" | |
| ], function( jQuery, indexOf, rneedsContext ) { | |
| "use strict"; | |
| var risSimple = /^.[^:#\[\.,]*$/; | |
| // Implement the identical functionality for filter and not | |
| function winnow( elements, qualifier, not ) { | |
| if ( jQuery.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; | |
| } ); | |
| } | |
| // Simple selector that can be filtered directly, removing non-Elements | |
| if ( risSimple.test( qualifier ) ) { | |
| return jQuery.filter( qualifier, elements, not ); | |
| } | |
| // Complex selector, compare the two sets, removing non-Elements | |
| qualifier = jQuery.filter( qualifier, elements ); | |
| return jQuery.grep( elements, function( elem ) { | |
| return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; | |
| } ); | |
| } | |
| 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; | |
| } | |
| } ); | |
| } ); |