Project

General

Profile

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
} );
    (1-1/1)