findFilter.js 2.3 KB

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