Made jQuery('<div/>') and jQuery('<div></div>') use the same code path (making the...
[jquery.git] / src / core.js
index 6553258..cdd7851 100644 (file)
@@ -32,15 +32,17 @@ var jQuery = function( selector, context ) {
        rtrim = /^\s+|\s+$/g,
 
        // Match a standalone tag
-       rsingleTag = /^<(\w+)\s*\/?>$/,
+       rsingleTag = /<(\w+)\s*\/?>(?:<\/\1>)?$/,
 
        // Keep a UserAgent string for use with jQuery.browser
        userAgent = navigator.userAgent.toLowerCase(),
 
        // Save a reference to some core methods
        toString = Object.prototype.toString,
+       hasOwnProperty = Object.prototype.hasOwnProperty,
        push = Array.prototype.push,
-       slice = Array.prototype.slice;
+       slice = Array.prototype.slice,
+       indexOf = Array.prototype.indexOf;
 
 jQuery.fn = jQuery.prototype = {
        init: function( selector, context ) {
@@ -51,15 +53,10 @@ jQuery.fn = jQuery.prototype = {
                        return this;
                }
 
-               // $("body"): Shortcut for quickly finding the body element
-               if ( selector === "body" && !context && document.body ) {
-                       selector = document.body;
-               }
-
                // Handle $(DOMElement)
                if ( selector.nodeType ) {
                        this.context = this[0] = selector;
-                       this.length++;
+                       this.length = 1;
                        return this;
                }
 
@@ -99,7 +96,7 @@ jQuery.fn = jQuery.prototype = {
                                                }
 
                                                // Otherwise, we inject the element directly into the jQuery object
-                                               this.length++;
+                                               this.length = 1;
                                                this[0] = elem;
                                        }
 
@@ -108,6 +105,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 );
@@ -124,8 +127,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;
                }
@@ -221,7 +223,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.
@@ -278,7 +280,7 @@ jQuery.extend = jQuery.fn.extend = function() {
                                                clone = src;
                                        } else if ( jQuery.isArray(copy) ) {
                                                clone = [];
-                                       } else if ( jQuery.isObject(copy) ) {
+                                       } else if ( jQuery.isObjectLiteral(copy) ) {
                                                clone = {};
                                        } else {
                                                clone = copy;
@@ -321,8 +323,18 @@ jQuery.extend({
                return toString.call(obj) === "[object Array]";
        },
 
-       isObject: function( obj ) {
-               return this.constructor.call(obj) === Object;
+       isObjectLiteral: function( obj ) {
+               if ( toString.call(obj) !== "[object Object]" ) {
+                       return false;
+               }
+               
+               //own properties are iterated firstly,
+               //so to speed up, we can test last one if it is own or not
+               
+               var key;
+               for ( key in obj ) {}
+               
+               return !key || hasOwnProperty.call( obj, key );
        },
 
        isEmptyObject: function( obj ) {
@@ -443,43 +455,13 @@ jQuery.extend({
                // expando of getElementsByTagName
                var i = 0, elem, pos = first.length;
 
-               // Also, we need to make sure that the correct elements are being returned
-               // (IE returns comment nodes in a '*' query)
-               if ( !jQuery.support.getAll ) {
-                       while ( (elem = second[ i++ ]) != null ) {
-                               if ( elem.nodeType !== 8 ) {
-                                       first[ pos++ ] = elem;
-                               }
-                       }
-
-               } else {
-                       while ( (elem = second[ i++ ]) != null ) {
-                               first[ pos++ ] = elem;
-                       }
+               while ( (elem = second[ i++ ]) != null ) {
+                       first[ pos++ ] = elem;
                }
 
                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 = [];
 
@@ -522,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);
 
@@ -541,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();
 }