// A simple way to check for HTML strings or ID strings
// (both of which we optimize for)
- quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
+ quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,
// Is it a simple selector
isSimple = /^.[^:#\[\.,]*$/,
+ // Check if a string has a non-whitespace character in it
+ rnotwhite = /\S/,
+
+ // Used for trimming whitespace
+ rtrim = /^\s+|\s+$/g,
+
+ // Match a standalone tag
+ rsingleTag = /^<(\w+)\s*\/?>$/,
+
// Keep a UserAgent string for use with jQuery.browser
userAgent = navigator.userAgent.toLowerCase(),
- // Save a reference to the core toString method
- toString = Object.prototype.toString;
-
-// Expose jQuery to the global object
-window.jQuery = window.$ = jQuery;
+ // Save a reference to some core methods
+ toString = Object.prototype.toString,
+ push = Array.prototype.push,
+ slice = Array.prototype.slice,
+ indexOf = Array.prototype.indexOf;
jQuery.fn = jQuery.prototype = {
init: function( selector, context ) {
- var match, elem, ret;
+ var match, elem, ret, doc;
// Handle $(""), $(null), or $(undefined)
if ( !selector ) {
- this.length = 0;
return this;
}
// Handle $(DOMElement)
if ( selector.nodeType ) {
- this[0] = selector;
- this.length = 1;
- this.context = selector;
+ this.context = this[0] = selector;
+ this.length++;
return this;
}
// HANDLE: $(html) -> $(array)
if ( match[1] ) {
- selector = jQuery.clean( [ match[1] ], context );
+ doc = (context ? context.ownerDocument || context : document);
- // HANDLE: $("#id")
- } else {
- elem = document.getElementById( match[3] );
+ // If a single string is passed in and it's a single tag
+ // just do a createElement and skip the rest
+ ret = rsingleTag.exec( selector );
+
+ if ( ret ) {
+ selector = [ doc.createElement( ret[1] ) ];
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem && elem.id !== match[3] ) {
- return rootjQuery.find( selector );
+ } else {
+ ret = buildFragment( [ match[1] ], [ doc ] );
+ selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
}
- // Otherwise, we inject the element directly into the jQuery object
- this.length = elem ? 1 : 0;
+ // HANDLE: $("#id")
+ } else {
+ elem = document.getElementById( match[2] );
+
if ( elem ) {
+ // 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++;
this[0] = elem;
}
+
this.context = document;
this.selector = selector;
return this;
}
+ // HANDLE: $("TAG")
+ } else if ( !context && /^\w+$/.test( selector ) ) {
+ this.selector = selector;
+ this.context = document;
+ selector = document.getElementsByTagName( selector );
+
// HANDLE: $(expr, $(...))
} else if ( !context || context.jquery ) {
return (context || rootjQuery).find( selector );
return rootjQuery.ready( selector );
}
- // Make sure that old selector state is passed along
- if ( selector.selector && selector.context ) {
+ if (selector.selector !== undefined) {
this.selector = selector.selector;
this.context = selector.context;
}
// The current version of jQuery being used
jquery: "@VERSION",
+ // The default length of a jQuery object is 0
+ length: 0,
+
// The number of elements contained in the matched element set
size: function() {
return this.length;
},
- toArray: Array.prototype.slice,
+ toArray: function(){
+ return slice.call( this, 0 );
+ },
// Get the Nth element in the matched element set OR
// Get the whole matched element set as a clean array
this.toArray() :
// Return just the object
- ( num < 0 ? this.toArray.call(this, num)[0] : this[ num ] );
+ ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
},
// Take an array of elements and push it onto the stack
// Resetting the length to 0, then using the native Array push
// is a super-fast way to populate an object with array-like properties
this.length = 0;
- Array.prototype.push.apply( this, elems );
+ push.apply( this, elems );
return this;
},
// For internal use only.
// Behaves like an Array's method, not like a jQuery method.
- push: [].push,
+ push: push,
sort: [].sort,
splice: [].splice
};
// Recurse if we're merging object values
if ( deep && copy && typeof copy === "object" && !copy.nodeType ) {
- target[ name ] = jQuery.extend( deep,
- // Never move original objects, clone them
- src || ( jQuery.isArray(copy) ? [ ] : { } ), copy );
+ var clone;
+
+ if ( src ) {
+ clone = src;
+ } else if ( jQuery.isArray(copy) ) {
+ clone = [];
+ } else if ( jQuery.isObject(copy) ) {
+ clone = {};
+ } else {
+ clone = copy;
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
// Don't bring in undefined values
} else if ( copy !== undefined ) {
return toString.call(obj) === "[object Array]";
},
+ isObject: function( obj ) {
+ return this.constructor.call(obj) === Object;
+ },
+
+ isEmptyObject: function( obj ) {
+ for ( var name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
// check if an element is in a (or is an) XML document
isXMLDoc: function( elem ) {
- return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
- !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML";
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
},
// Evalulates a script in a global context
globalEval: function( data ) {
- if ( data && /\S/.test(data) ) {
+ if ( data && rnotwhite.test(data) ) {
// Inspired by code by Andrea Giammarchi
// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
var head = document.getElementsByTagName("head")[0] || document.documentElement,
script = document.createElement("script");
script.type = "text/javascript";
+
if ( jQuery.support.scriptEval ) {
script.appendChild( document.createTextNode( data ) );
} else {
},
trim: function( text ) {
- return (text || "").replace( /^\s+|\s+$/g, "" );
+ return (text || "").replace( rtrim, "" );
},
makeArray: function( array ) {
return first;
},
- unique: function( array ) {
- var ret = [], done = {}, id;
-
- try {
- for ( var i = 0, length = array.length; i < length; i++ ) {
- id = jQuery.data( array[ i ] );
-
- if ( !done[ id ] ) {
- done[ id ] = true;
- ret.push( array[ i ] );
- }
- }
- } catch( e ) {
- ret = array;
- }
-
- return ret;
- },
-
grep: function( elems, callback, inv ) {
var ret = [];
// It's included for backwards compatibility and plugins,
// although they should work to migrate away.
browser: {
- version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
+ version: (/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/.exec(userAgent) || [0,'0'])[1],
safari: /webkit/.test( userAgent ),
opera: /opera/.test( userAgent ),
msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
}
});
+if ( indexOf ) {
+ jQuery.inArray = function( elem, array ) {
+ return indexOf.call( array, elem );
+ };
+}
+
// All jQuery objects should point back to these
rootjQuery = jQuery(document);
}
}
+// Mutifunctional method to get and set values to a collection
+// The value/s can be optionally by executed if its a function
+function access( elems, key, value, exec, fn ) {
+ var l = elems.length;
+
+ // Setting many attributes
+ if ( typeof key === "object" ) {
+ for (var k in key) {
+ access(elems, k, key[k], exec, fn);
+ }
+ return elems;
+ }
+
+ // Setting one attribute
+ if (value !== undefined) {
+ // Optionally, function values get executed if exec is true
+ exec = exec && jQuery.isFunction(value);
+
+ for (var i = 0; i < l; i++) {
+ var elem = elems[i],
+ val = exec ? value.call(elem, i) : value;
+ fn(elem, key, val);
+ }
+ return elems;
+ }
+
+ // Getting an attribute
+ return l ? fn(elems[0], key) : null;
+}
+
function now() {
return (new Date).getTime();
}