Made isPlainObject() supporting null, undefined, and window values on IE too. Also...
[jquery.git] / src / core.js
index 0d5588c..bc48e5d 100644 (file)
@@ -53,7 +53,7 @@ var jQuery = function( selector, context ) {
 
 jQuery.fn = jQuery.prototype = {
        init: function( selector, context ) {
-               var match, elem, ret, doc, parent;
+               var match, elem, ret, doc;
 
                // Handle $(""), $(null), or $(undefined)
                if ( !selector ) {
@@ -88,12 +88,7 @@ jQuery.fn = jQuery.prototype = {
 
                                        } else {
                                                ret = buildFragment( [ match[1] ], [ doc ] );
-                                               parent = ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment;
-                                               selector = [];
-
-                                               while ( parent.firstChild ) {
-                                                       selector.push( parent.removeChild( parent.firstChild ) );
-                                               }
+                                               selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
                                        }
 
                                // HANDLE: $("#id")
@@ -224,12 +219,12 @@ jQuery.fn = jQuery.prototype = {
                jQuery.bindReady();
 
                // If the DOM is already ready
-               if ( jQuery.isReady && !readyList ) {
+               if ( jQuery.isReady ) {
                        // Execute the function immediately
                        fn.call( document, jQuery );
 
                // Otherwise, remember the function for later
-               } else {
+               } else if ( readyList ) {
                        // Add the function to the wait list
                        readyList.push( fn );
                }
@@ -430,19 +425,21 @@ jQuery.extend({
        },
 
        isPlainObject: function( obj ) {
-               if ( toString.call(obj) !== "[object Object]" || typeof obj.nodeType === "number" ) {
+               // Must be an Object.
+               // Because of IE, we also have to check the presence of the constructor property.
+               if ( !obj || toString.call(obj) !== "[object Object]" || !("constructor" in obj) ) {
                        return false;
                }
                
-               // not own constructor property must be Object
+               // Not own constructor property must be Object
                if ( obj.constructor
                        && !hasOwnProperty.call(obj, "constructor")
                        && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
                        return false;
                }
                
-               //own properties are iterated firstly,
-               //so to speed up, we can test last one if it is own or not
+               // Own properties are enumerated firstly, so to speed up,
+               // if last one is own, then all properties are own.
        
                var key;
                for ( key in obj ) {}