findFilter.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. // 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. // Simple selector that can be filtered directly, removing non-Elements
  29. if ( risSimple.test( qualifier ) ) {
  30. return jQuery.filter( qualifier, elements, not );
  31. }
  32. // Complex selector, compare the two sets, removing non-Elements
  33. qualifier = jQuery.filter( qualifier, elements );
  34. return jQuery.grep( elements, function( elem ) {
  35. return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
  36. } );
  37. }
  38. jQuery.filter = function( expr, elems, not ) {
  39. var elem = elems[ 0 ];
  40. if ( not ) {
  41. expr = ":not(" + expr + ")";
  42. }
  43. if ( elems.length === 1 && elem.nodeType === 1 ) {
  44. return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
  45. }
  46. return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
  47. return elem.nodeType === 1;
  48. } ) );
  49. };
  50. jQuery.fn.extend( {
  51. find: function( selector ) {
  52. var i, ret,
  53. len = this.length,
  54. self = this;
  55. if ( typeof selector !== "string" ) {
  56. return this.pushStack( jQuery( selector ).filter( function() {
  57. for ( i = 0; i < len; i++ ) {
  58. if ( jQuery.contains( self[ i ], this ) ) {
  59. return true;
  60. }
  61. }
  62. } ) );
  63. }
  64. ret = this.pushStack( [] );
  65. for ( i = 0; i < len; i++ ) {
  66. jQuery.find( selector, self[ i ], ret );
  67. }
  68. return len > 1 ? jQuery.uniqueSort( ret ) : ret;
  69. },
  70. filter: function( selector ) {
  71. return this.pushStack( winnow( this, selector || [], false ) );
  72. },
  73. not: function( selector ) {
  74. return this.pushStack( winnow( this, selector || [], true ) );
  75. },
  76. is: function( selector ) {
  77. return !!winnow(
  78. this,
  79. // If this is a positional/relative selector, check membership in the returned set
  80. // so $("p:first").is("p:last") won't return true for a doc with two "p".
  81. typeof selector === "string" && rneedsContext.test( selector ) ?
  82. jQuery( selector ) :
  83. selector || [],
  84. false
  85. ).length;
  86. }
  87. } );
  88. } );