findFilter.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. /* jshint -W018 */
  14. return !!qualifier.call( elem, i, elem ) !== not;
  15. } );
  16. }
  17. if ( qualifier.nodeType ) {
  18. return jQuery.grep( elements, function( elem ) {
  19. return ( elem === qualifier ) !== not;
  20. } );
  21. }
  22. if ( typeof qualifier === "string" ) {
  23. if ( risSimple.test( qualifier ) ) {
  24. return jQuery.filter( qualifier, elements, not );
  25. }
  26. qualifier = jQuery.filter( qualifier, elements );
  27. }
  28. return jQuery.grep( elements, function( elem ) {
  29. return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
  30. } );
  31. }
  32. jQuery.filter = function( expr, elems, not ) {
  33. var elem = elems[ 0 ];
  34. if ( not ) {
  35. expr = ":not(" + expr + ")";
  36. }
  37. return elems.length === 1 && elem.nodeType === 1 ?
  38. jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
  39. 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. } );