UNPKG

2.35 kBJavaScriptView Raw
1define( [
2 "../core",
3 "../var/indexOf",
4 "../var/isFunction",
5 "./var/rneedsContext",
6 "../selector"
7], function( jQuery, indexOf, isFunction, rneedsContext ) {
8
9"use strict";
10
11// Implement the identical functionality for filter and not
12function winnow( elements, qualifier, not ) {
13 if ( isFunction( qualifier ) ) {
14 return jQuery.grep( elements, function( elem, i ) {
15 return !!qualifier.call( elem, i, elem ) !== not;
16 } );
17 }
18
19 // Single element
20 if ( qualifier.nodeType ) {
21 return jQuery.grep( elements, function( elem ) {
22 return ( elem === qualifier ) !== not;
23 } );
24 }
25
26 // Arraylike of elements (jQuery, arguments, Array)
27 if ( typeof qualifier !== "string" ) {
28 return jQuery.grep( elements, function( elem ) {
29 return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
30 } );
31 }
32
33 // Filtered directly for both simple and complex selectors
34 return jQuery.filter( qualifier, elements, not );
35}
36
37jQuery.filter = function( expr, elems, not ) {
38 var elem = elems[ 0 ];
39
40 if ( not ) {
41 expr = ":not(" + expr + ")";
42 }
43
44 if ( elems.length === 1 && elem.nodeType === 1 ) {
45 return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
46 }
47
48 return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
49 return elem.nodeType === 1;
50 } ) );
51};
52
53jQuery.fn.extend( {
54 find: function( selector ) {
55 var i, ret,
56 len = this.length,
57 self = this;
58
59 if ( typeof selector !== "string" ) {
60 return this.pushStack( jQuery( selector ).filter( function() {
61 for ( i = 0; i < len; i++ ) {
62 if ( jQuery.contains( self[ i ], this ) ) {
63 return true;
64 }
65 }
66 } ) );
67 }
68
69 ret = this.pushStack( [] );
70
71 for ( i = 0; i < len; i++ ) {
72 jQuery.find( selector, self[ i ], ret );
73 }
74
75 return len > 1 ? jQuery.uniqueSort( ret ) : ret;
76 },
77 filter: function( selector ) {
78 return this.pushStack( winnow( this, selector || [], false ) );
79 },
80 not: function( selector ) {
81 return this.pushStack( winnow( this, selector || [], true ) );
82 },
83 is: function( selector ) {
84 return !!winnow(
85 this,
86
87 // If this is a positional/relative selector, check membership in the returned set
88 // so $("p:first").is("p:last") won't return true for a doc with two "p".
89 typeof selector === "string" && rneedsContext.test( selector ) ?
90 jQuery( selector ) :
91 selector || [],
92 false
93 ).length;
94 }
95} );
96
97} );