Moved a bunch of methods out of the jQuery-specific Sizzle code into more-appropriate...
[jquery.git] / src / core.js
index cb9b528..f605e1d 100644 (file)
@@ -20,7 +20,7 @@ var jQuery = function( selector, context ) {
 
        // 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 = /^.[^:#\[\.,]*$/,
@@ -31,23 +31,26 @@ var jQuery = function( selector, context ) {
        // 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 some core methods
        toString = Object.prototype.toString,
        push = Array.prototype.push,
-       slice = Array.prototype.slice;
-
-// Expose jQuery to the global object
-window.jQuery = window.$ = jQuery;
+       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 ) return this;
+               if ( !selector ) {
+                       return this;
+               }
 
                // Handle $(DOMElement)
                if ( selector.nodeType ) {
@@ -66,16 +69,30 @@ jQuery.fn = jQuery.prototype = {
 
                                // HANDLE: $(html) -> $(array)
                                if ( match[1] ) {
-                                       selector = jQuery.clean( [ match[1] ], context );
+                                       doc = (context ? context.ownerDocument || context : document);
+
+                                       // 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] ) ];
+
+                                       } else {
+                                               ret = buildFragment( [ match[1] ], [ doc ] );
+                                               selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
+                                       }
 
                                // HANDLE: $("#id")
                                } else {
-                                       elem = document.getElementById( match[3] );
+                                       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[3] ) return rootjQuery.find( selector );
+                                               if ( elem.id !== match[2] ) {
+                                                       return rootjQuery.find( selector );
+                                               }
 
                                                // Otherwise, we inject the element directly into the jQuery object
                                                this.length++;
@@ -87,6 +104,12 @@ jQuery.fn = jQuery.prototype = {
                                        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 );
@@ -103,8 +126,7 @@ jQuery.fn = jQuery.prototype = {
                        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;
                }
@@ -200,7 +222,7 @@ jQuery.fn = jQuery.prototype = {
        },
 
        is: function( selector ) {
-               return !!selector && jQuery.multiFilter( selector, this ).length > 0;
+               return !!selector && jQuery.filter( selector, this ).length > 0;
        },
 
        // For internal use only.
@@ -313,7 +335,10 @@ jQuery.extend({
 
        // check if an element is in a (or is an) XML document
        isXMLDoc: function( elem ) {
-               return (elem.ownerDocument || elem).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
@@ -437,25 +462,6 @@ jQuery.extend({
                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 = [];
 
@@ -498,6 +504,12 @@ jQuery.extend({
        }
 });
 
+if ( indexOf ) {
+       jQuery.inArray = function( elem, array ) {
+               return indexOf.call( array, elem );
+       };
+}
+
 // All jQuery objects should point back to these
 rootjQuery = jQuery(document);
 
@@ -517,6 +529,36 @@ function evalScript( i, elem ) {
        }
 }
 
+// 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();
 }