eae7ca61398dc8042c44aa4cf162cab816d415417d0ce82cadfbfbfa074228e8cd87ed8968758b62fc18a66dea81928af6fd2f8836e7eee4a005430a859604 2.3 KB

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