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