Commit 2f627494 authored by Timmy Willison's avatar Timmy Willison

Separate jQuery.fn.init into its own module (for lighter core dependencies...

Separate jQuery.fn.init into its own module (for lighter core dependencies across all modules). Restore proper support property for effects.

Conflicts:
	src/attributes/classes.js
	src/core.js
	src/manipulation.js
	src/traversing.js
parent 6c573391
...@@ -3,6 +3,7 @@ define([ ...@@ -3,6 +3,7 @@ define([
"./var/rnotwhite", "./var/rnotwhite",
"./ajax/var/nonce", "./ajax/var/nonce",
"./ajax/var/rquery", "./ajax/var/rquery",
"./core/init",
"./ajax/parseJSON", "./ajax/parseJSON",
"./ajax/parseXML", "./ajax/parseXML",
"./deferred" "./deferred"
......
define([ define([
"../core", "../core",
"../var/rnotwhite", "../var/rnotwhite",
"../var/strundefined" "../var/strundefined",
"../core/init"
], function( jQuery, rnotwhite, strundefined ) { ], function( jQuery, rnotwhite, strundefined ) {
var rclass = /[\t\r\n\f]/g; var rclass = /[\t\r\n\f]/g;
......
define([ define([
"../core", "../core",
"./support" "./support",
"../core/init"
], function( jQuery, support ) { ], function( jQuery, support ) {
var rreturn = /\r/g; var rreturn = /\r/g;
......
...@@ -10,17 +10,8 @@ var ...@@ -10,17 +10,8 @@ var
toString = require( "./var/toString" ), toString = require( "./var/toString" ),
hasOwn = require( "./var/hasOwn" ), hasOwn = require( "./var/hasOwn" ),
trim = require( "./var/trim" ), trim = require( "./var/trim" ),
rsingleTag = require( "./var/rsingleTag" ),
support = require( "./var/support" ), support = require( "./var/support" ),
i,
// A central reference to the root jQuery(document)
rootjQuery,
// Use the correct document accordingly with window argument (sandbox)
document = window.document,
// Map over jQuery in case of overwrite // Map over jQuery in case of overwrite
_jQuery = window.jQuery, _jQuery = window.jQuery,
...@@ -32,17 +23,13 @@ var ...@@ -32,17 +23,13 @@ var
// Define a local copy of jQuery // Define a local copy of jQuery
jQuery = function( selector, context ) { jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced' // The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context, rootjQuery ); // Need init if jQuery is called (just allow error to be thrown if not included)
return new jQuery.fn.init( selector, context );
}, },
// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE) // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
// A simple way to check for HTML strings
// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
// Strict HTML recognition (#11290: must start with <)
rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
// Matches dashed string for camelizing // Matches dashed string for camelizing
rmsPrefix = /^-ms-/, rmsPrefix = /^-ms-/,
rdashAlpha = /-([\da-z])/gi, rdashAlpha = /-([\da-z])/gi,
...@@ -58,111 +45,6 @@ jQuery.fn = jQuery.prototype = { ...@@ -58,111 +45,6 @@ jQuery.fn = jQuery.prototype = {
constructor: jQuery, constructor: jQuery,
init: function( selector, context, rootjQuery ) {
var match, elem;
// HANDLE: $(""), $(null), $(undefined), $(false)
if ( !selector ) {
return this;
}
// Handle HTML strings
if ( typeof selector === "string" ) {
if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
// Assume that strings that start and end with <> are HTML and skip the regex check
match = [ null, selector, null ];
} else {
match = rquickExpr.exec( selector );
}
// Match html or make sure no context is specified for #id
if ( match && (match[1] || !context) ) {
// HANDLE: $(html) -> $(array)
if ( match[1] ) {
context = context instanceof jQuery ? context[0] : context;
// scripts is true for back-compat
// Intentionally let the error be thrown if parseHTML is not present
jQuery.merge( this, jQuery.parseHTML(
match[1],
context && context.nodeType ? context.ownerDocument || context : document,
true
) );
// HANDLE: $(html, props)
if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
for ( match in context ) {
// Properties of context are called as methods if possible
if ( jQuery.isFunction( this[ match ] ) ) {
this[ match ]( context[ match ] );
// ...and otherwise set as attributes
} else {
this.attr( match, context[ match ] );
}
}
}
return this;
// HANDLE: $(#id)
} else {
elem = document.getElementById( match[2] );
// Check parentNode to catch when Blackberry 4.6 returns
// nodes that are no longer in the document #6963
if ( elem && elem.parentNode ) {
// Handle the case where IE and Opera return items
// by name instead of ID
if ( elem.id !== match[2] ) {
return rootjQuery.find( selector );
}
// Otherwise, we inject the element directly into the jQuery object
this.length = 1;
this[0] = elem;
}
this.context = document;
this.selector = selector;
return this;
}
// HANDLE: $(expr, $(...))
} else if ( !context || context.jquery ) {
return ( context || rootjQuery ).find( selector );
// HANDLE: $(expr, context)
// (which is just equivalent to: $(context).find(expr)
} else {
return this.constructor( context ).find( selector );
}
// HANDLE: $(DOMElement)
} else if ( selector.nodeType ) {
this.context = this[0] = selector;
this.length = 1;
return this;
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
return typeof rootjQuery.ready !== "undefined" ?
rootjQuery.ready( selector ) :
// Execute immediately if ready is not present
selector( jQuery );
}
if ( selector.selector !== undefined ) {
this.selector = selector.selector;
this.context = selector.context;
}
return jQuery.makeArray( selector, this );
},
// Start with an empty selector // Start with an empty selector
selector: "", selector: "",
...@@ -242,9 +124,6 @@ jQuery.fn = jQuery.prototype = { ...@@ -242,9 +124,6 @@ jQuery.fn = jQuery.prototype = {
splice: deletedIds.splice splice: deletedIds.splice
}; };
// Give the init function the jQuery prototype for later instantiation
jQuery.fn.init.prototype = jQuery.fn;
jQuery.extend = jQuery.fn.extend = function() { jQuery.extend = jQuery.fn.extend = function() {
var src, copyIsArray, copy, name, options, clone, var src, copyIsArray, copy, name, options, clone,
target = arguments[0] || {}, target = arguments[0] || {},
...@@ -348,6 +227,51 @@ jQuery.extend({ ...@@ -348,6 +227,51 @@ jQuery.extend({
return !isNaN( parseFloat(obj) ) && isFinite( obj ); return !isNaN( parseFloat(obj) ) && isFinite( obj );
}, },
isEmptyObject: function( obj ) {
var name;
for ( name in obj ) {
return false;
}
return true;
},
isPlainObject: function( obj ) {
var key;
// Must be an Object.
// Because of IE, we also have to check the presence of the constructor property.
// Make sure that DOM nodes and window objects don't pass through, as well
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
return false;
}
try {
// Not own constructor property must be Object
if ( obj.constructor &&
!hasOwn.call(obj, "constructor") &&
!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
return false;
}
} catch ( e ) {
// IE8,9 Will throw exceptions on certain host objects #9897
return false;
}
// Support: IE<9
// Handle iteration over inherited properties before own properties.
if ( support.ownLast ) {
for ( key in obj ) {
return hasOwn.call( obj, key );
}
}
// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
for ( key in obj ) {}
return key === undefined || hasOwn.call( obj, key );
},
type: function( obj ) { type: function( obj ) {
if ( obj == null ) { if ( obj == null ) {
return String( obj ); return String( obj );
...@@ -357,14 +281,6 @@ jQuery.extend({ ...@@ -357,14 +281,6 @@ jQuery.extend({
typeof obj; typeof obj;
}, },
isEmptyObject: function( obj ) {
var name;
for ( name in obj ) {
return false;
}
return true;
},
error: function( msg ) { error: function( msg ) {
throw new Error( msg ); throw new Error( msg );
}, },
...@@ -615,54 +531,6 @@ jQuery.extend({ ...@@ -615,54 +531,6 @@ jQuery.extend({
support: support support: support
}); });
// Support: IE<9
// Iteration over object's inherited properties before its own.
// It would be better to move this test to one of test modules but since
// tests require the jQuery object to exist as well as some other variables set
// core initialization is needed first for tests used in core itself.
for ( i in jQuery( support ) ) {
break;
}
support.ownLast = i !== "0";
jQuery.isPlainObject = function( obj ) {
var key;
// Must be an Object.
// Because of IE, we also have to check the presence of the constructor property.
// Make sure that DOM nodes and window objects don't pass through, as well
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
return false;
}
try {
// Not own constructor property must be Object
if ( obj.constructor &&
!hasOwn.call(obj, "constructor") &&
!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
return false;
}
} catch ( e ) {
// IE8,9 Will throw exceptions on certain host objects #9897
return false;
}
// Support: IE<9
// Handle iteration over inherited properties before own properties.
if ( support.ownLast ) {
for ( key in obj ) {
return hasOwn.call( obj, key );
}
}
// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
for ( key in obj ) {}
return key === undefined || hasOwn.call( obj, key );
};
// Populate the class2type map // Populate the class2type map
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
class2type[ "[object " + name + "]" ] = name.toLowerCase(); class2type[ "[object " + name + "]" ] = name.toLowerCase();
...@@ -685,8 +553,5 @@ function isArraylike( obj ) { ...@@ -685,8 +553,5 @@ function isArraylike( obj ) {
typeof length === "number" && length > 0 && ( length - 1 ) in obj ); typeof length === "number" && length > 0 && ( length - 1 ) in obj );
} }
// All jQuery objects should point back to these
rootjQuery = jQuery( document );
return jQuery; return jQuery;
}); });
// Initialize a jQuery object
define([
"../core",
"./var/rsingleTag",
"../traversing/findFilter"
], function( jQuery, rsingleTag ) {
// A central reference to the root jQuery(document)
var rootjQuery,
// Use the correct document accordingly with window argument (sandbox)
document = window.document,
// A simple way to check for HTML strings
// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
// Strict HTML recognition (#11290: must start with <)
rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
init = jQuery.fn.init = function( selector, context ) {
var match, elem;
// HANDLE: $(""), $(null), $(undefined), $(false)
if ( !selector ) {
return this;
}
// Handle HTML strings
if ( typeof selector === "string" ) {
if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
// Assume that strings that start and end with <> are HTML and skip the regex check
match = [ null, selector, null ];
} else {
match = rquickExpr.exec( selector );
}
// Match html or make sure no context is specified for #id
if ( match && (match[1] || !context) ) {
// HANDLE: $(html) -> $(array)
if ( match[1] ) {
context = context instanceof jQuery ? context[0] : context;
// scripts is true for back-compat
// Intentionally let the error be thrown if parseHTML is not present
jQuery.merge( this, jQuery.parseHTML(
match[1],
context && context.nodeType ? context.ownerDocument || context : document,
true
) );
// HANDLE: $(html, props)
if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
for ( match in context ) {
// Properties of context are called as methods if possible
if ( jQuery.isFunction( this[ match ] ) ) {
this[ match ]( context[ match ] );
// ...and otherwise set as attributes
} else {
this.attr( match, context[ match ] );
}
}
}
return this;
// HANDLE: $(#id)
} else {
elem = document.getElementById( match[2] );
// Check parentNode to catch when Blackberry 4.6 returns
// nodes that are no longer in the document #6963
if ( elem && elem.parentNode ) {
// Handle the case where IE and Opera return items
// by name instead of ID
if ( elem.id !== match[2] ) {
return rootjQuery.find( selector );
}
// Otherwise, we inject the element directly into the jQuery object
this.length = 1;
this[0] = elem;
}
this.context = document;
this.selector = selector;
return this;
}
// HANDLE: $(expr, $(...))
} else if ( !context || context.jquery ) {
return ( context || rootjQuery ).find( selector );
// HANDLE: $(expr, context)
// (which is just equivalent to: $(context).find(expr)
} else {
return this.constructor( context ).find( selector );
}
// HANDLE: $(DOMElement)
} else if ( selector.nodeType ) {
this.context = this[0] = selector;
this.length = 1;
return this;
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
return typeof rootjQuery.ready !== "undefined" ?
rootjQuery.ready( selector ) :
// Execute immediately if ready is not present
selector( jQuery );
}
if ( selector.selector !== undefined ) {
this.selector = selector.selector;
this.context = selector.context;
}
return jQuery.makeArray( selector, this );
};
// Give the init function the jQuery prototype for later instantiation
init.prototype = jQuery.fn;
// Initialize central reference
rootjQuery = jQuery( document );
return init;
});
define([ define([
"../core", "../core",
"../var/rsingleTag", "./var/rsingleTag",
"../manipulation" // buildFragment "../manipulation" // buildFragment
], function( jQuery, rsingleTag ) { ], function( jQuery, rsingleTag ) {
......
define([ define([
"../core", "../core",
"../core/init",
"../deferred" "../deferred"
], function( jQuery ) { ], function( jQuery ) {
......
...@@ -33,6 +33,7 @@ var ...@@ -33,6 +33,7 @@ var
cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
// Dependencies not needed as vars // Dependencies not needed as vars
require( "./core/init" );
require( "./css/swap" ); require( "./css/swap" );
require( "./core/ready" ); require( "./core/ready" );
require( "./selector" ); // contains require( "./selector" ); // contains
......
...@@ -6,7 +6,7 @@ var ...@@ -6,7 +6,7 @@ var
cssExpand = require( "./css/var/cssExpand" ), cssExpand = require( "./css/var/cssExpand" ),
isHidden = require( "./css/var/isHidden" ), isHidden = require( "./css/var/isHidden" ),
defaultDisplay = require( "./css/defaultDisplay" ), defaultDisplay = require( "./css/defaultDisplay" ),
support = require( "./css/support" ), support = require( "./effects/support" ),
fxNow, timerId, fxNow, timerId,
rfxtypes = /^(?:toggle|show|hide)$/, rfxtypes = /^(?:toggle|show|hide)$/,
...@@ -65,6 +65,7 @@ var ...@@ -65,6 +65,7 @@ var
}; };
// Dependencies not needed as vars // Dependencies not needed as vars
require( "./core/init" );
require( "./effects/Tween" ); require( "./effects/Tween" );
require( "./queue" ); require( "./queue" );
require( "./css" ); require( "./css" );
......
...@@ -14,6 +14,7 @@ var ...@@ -14,6 +14,7 @@ var
rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
// Dependencies not needed as vars // Dependencies not needed as vars
require( "./core/init" );
require( "./data/accepts" ); require( "./data/accepts" );
require( "./selector" ); require( "./selector" );
......
...@@ -2,12 +2,6 @@ ...@@ -2,12 +2,6 @@
// Keep in mind that a dependency array cannot be used with CommonJS+AMD syntax // Keep in mind that a dependency array cannot be used with CommonJS+AMD syntax
define(function( require ){ define(function( require ){
// Dependencies not needed as variables
require( "./data/accepts" );
require( "./traversing" );
require( "./selector" );
require( "./event" );
function createSafeFragment( document ) { function createSafeFragment( document ) {
var list = nodeNames.split( "|" ), var list = nodeNames.split( "|" ),
safeFrag = document.createDocumentFragment(); safeFrag = document.createDocumentFragment();
...@@ -71,6 +65,12 @@ wrapMap.optgroup = wrapMap.option; ...@@ -71,6 +65,12 @@ wrapMap.optgroup = wrapMap.option;
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td; wrapMap.th = wrapMap.td;
// Dependencies not needed as variables
require( "./core/init" );
require( "./data/accepts" );
require( "./traversing" );
require( "./selector" );
require( "./event" );
function getAll( context, tag ) { function getAll( context, tag ) {
var elems, elem, var elems, elem,
......
...@@ -2,6 +2,7 @@ define([ ...@@ -2,6 +2,7 @@ define([
"./core", "./core",
"./var/strundefined", "./var/strundefined",
"./core/access", "./core/access",
"./core/init",
"./css", "./css",
"./selector" // contains "./selector" // contains
], function( jQuery, strundefined, access ) { ], function( jQuery, strundefined, access ) {
......
define([ define([
"./core", "./core",
"./manipulation/var/rcheckableType", "./manipulation/var/rcheckableType",
"./core/init",
"./traversing", // filter "./traversing", // filter
"./attributes/prop" "./attributes/prop"
], function( jQuery, rcheckableType ) { ], function( jQuery, rcheckableType ) {
......
...@@ -2,10 +2,19 @@ define([ ...@@ -2,10 +2,19 @@ define([
"./core", "./core",
"./var/strundefined", "./var/strundefined",
"./var/support", "./var/support",
"./core/init", // Needed for hasOwn support test
// This is listed as a dependency for build order, but it's still optional in builds // This is listed as a dependency for build order, but it's still optional in builds
"./core/ready" "./core/ready"
], function( jQuery, strundefined, support ) { ], function( jQuery, strundefined, support ) {
// Support: IE<9
// Iteration over object's inherited properties before its own
var i;
for ( i in jQuery( support ) ) {
break;
}
support.ownLast = i !== "0";
// Note: most support tests are defined in their respective modules. // Note: most support tests are defined in their respective modules.
jQuery(function() { jQuery(function() {
......
define([ define([
"./core", "./core",
"./traversing/var/rneedsContext",
"./core/init",
"./traversing/findFilter",
"./selector" "./selector"
], function( jQuery ) { ], function( jQuery, rneedsContext ) {
var isSimple = /^.[^:#\[\.,]*$/, var rparentsprev = /^(?:parents|prev(?:Until|All))/,
rparentsprev = /^(?:parents|prev(?:Until|All))/,
rneedsContext = jQuery.expr.match.needsContext,
// methods guaranteed to produce a unique set when starting from a unique set // methods guaranteed to produce a unique set when starting from a unique set
guaranteedUnique = { guaranteedUnique = {
children: true, children: true,
...@@ -14,51 +15,7 @@ var isSimple = /^.[^:#\[\.,]*$/, ...@@ -14,51 +15,7 @@ var isSimple = /^.[^:#\[\.,]*$/,
prev: true prev: true
}; };
// Implement the identical functionality for filter and not
function winnow( elements, qualifier, not ) {
if ( jQuery.isFunction( qualifier ) ) {
return jQuery.grep( elements, function( elem, i ) {
/* jshint -W018 */
return !!qualifier.call( elem, i, elem ) !== not;
});
}
if ( qualifier.nodeType ) {
return jQuery.grep( elements, function( elem ) {
return ( elem === qualifier ) !== not;
});
}
if ( typeof qualifier === "string" ) {
if ( isSimple.test( qualifier ) ) {
return jQuery.filter( qualifier, elements, not );
}
qualifier = jQuery.filter( qualifier, elements );
}
return jQuery.grep( elements, function( elem ) {
return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
});
}
jQuery.extend({ jQuery.extend({
filter: function( expr, elems, not ) {
var elem = elems[ 0 ];
if ( not ) {
expr = ":not(" + expr + ")";
}
return elems.length === 1 && elem.nodeType === 1 ?
jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
return elem.nodeType === 1;
}));
},
dir: function( elem, dir, until ) { dir: function( elem, dir, until ) {
var matched = [], var matched = [],
cur = elem[ dir ]; cur = elem[ dir ];
...@@ -86,32 +43,6 @@ jQuery.extend({ ...@@ -86,32 +43,6 @@ jQuery.extend({
}); });
jQuery.fn.extend({ jQuery.fn.extend({
find: function( selector ) {
var i,
ret = [],
self = this,
len = self.length;
if ( typeof selector !== "string" ) {
return this.pushStack( jQuery( selector ).filter(function() {
for ( i = 0; i < len; i++ ) {
if ( jQuery.contains( self[ i ], this ) ) {
return true;
}
}
}) );
}
for ( i = 0; i < len; i++ ) {
jQuery.find( selector, self[ i ], ret );
}
// Needed because $( selector, context ) becomes $( context ).find( selector )
ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
ret.selector = this.selector ? this.selector + " " + selector : selector;
return ret;
},
has: function( target ) { has: function( target ) {
var i, var i,
targets = jQuery( target, this ), targets = jQuery( target, this ),
...@@ -126,27 +57,6 @@ jQuery.fn.extend({ ...@@ -126,27 +57,6 @@ jQuery.fn.extend({
}); });
}, },
not: function( selector ) {
return this.pushStack( winnow(this, selector || [], true) );
},
filter: function( selector ) {
return this.pushStack( winnow(this, selector || [], false) );
},
is: function( selector ) {
return !!winnow(
this,
// If this is a positional/relative selector, check membership in the returned set
// so $("p:first").is("p:last") won't return true for a doc with two "p".
typeof selector === "string" && rneedsContext.test( selector ) ?
jQuery( selector ) :
selector || [],
false
).length;
},
closest: function( selectors, context ) { closest: function( selectors, context ) {
var cur, var cur,
i = 0, i = 0,
......
define([
"../core",
"../var/indexOf",
"./var/rneedsContext",
"../selector"
], function( jQuery, indexOf, rneedsContext ) {
var risSimple = /^.[^:#\[\.,]*$/;
// Implement the identical functionality for filter and not
function winnow( elements, qualifier, not ) {
if ( jQuery.isFunction( qualifier ) ) {
return jQuery.grep( elements, function( elem, i ) {
/* jshint -W018 */
return !!qualifier.call( elem, i, elem ) !== not;
});
}
if ( qualifier.nodeType ) {
return jQuery.grep( elements, function( elem ) {
return ( elem === qualifier ) !== not;
});
}
if ( typeof qualifier === "string" ) {
if ( risSimple.test( qualifier ) ) {
return jQuery.filter( qualifier, elements, not );
}
qualifier = jQuery.filter( qualifier, elements );
}
return jQuery.grep( elements, function( elem ) {
return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
});
}
jQuery.filter = function( expr, elems, not ) {
var elem = elems[ 0 ];
if ( not ) {
expr = ":not(" + expr + ")";
}
return elems.length === 1 && elem.nodeType === 1 ?
jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
return elem.nodeType === 1;
}));
};
jQuery.fn.extend({
find: function( selector ) {
var i,
ret = [],
self = this,
len = self.length;
if ( typeof selector !== "string" ) {
return this.pushStack( jQuery( selector ).filter(function() {
for ( i = 0; i < len; i++ ) {
if ( jQuery.contains( self[ i ], this ) ) {
return true;
}
}
}) );
}
for ( i = 0; i < len; i++ ) {
jQuery.find( selector, self[ i ], ret );
}
// Needed because $( selector, context ) becomes $( context ).find( selector )
ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
ret.selector = this.selector ? this.selector + " " + selector : selector;
return ret;
},
filter: function( selector ) {
return this.pushStack( winnow(this, selector || [], false) );
},
not: function( selector ) {
return this.pushStack( winnow(this, selector || [], true) );
},
is: function( selector ) {
return !!winnow(
this,
// If this is a positional/relative selector, check membership in the returned set
// so $("p:first").is("p:last") won't return true for a doc with two "p".
typeof selector === "string" && rneedsContext.test( selector ) ?
jQuery( selector ) :
selector || [],
false
).length;
}
});
});
define([
"../../core",
"../../selector"
], function( jQuery ) {
return jQuery.expr.match.needsContext;
});
define([ define([
"./core", "./core",
"./core/init",
"./traversing" // parent, contents "./traversing" // parent, contents
], function( jQuery ) { ], function( jQuery ) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment