Fixed #1959 by postponing ALL script evaluations till the html insertion is done...
[jquery.git] / src / core.js
index 313cdfa..582e53e 100644 (file)
@@ -14,10 +14,8 @@ if ( window.jQuery )
        var _jQuery = window.jQuery;
 
 var jQuery = window.jQuery = function( selector, context ) {
-       // If the context is a namespace object, return a new object
-       return this instanceof jQuery ?
-               this.init( selector, context ) :
-               new jQuery( selector, context );
+       // The jQuery object is actually just the init constructor 'enhanced'
+       return new jQuery.prototype.init( selector, context );
 };
 
 // Map over the $ in case of overwrite
@@ -292,9 +290,23 @@ jQuery.fn = jQuery.prototype = {
        clone: function( events ) {
                // Do the clone
                var ret = this.map(function(){
-                       return this.outerHTML ?
-                               jQuery( this.outerHTML )[0] :
-                               this.cloneNode( true );
+                       if ( jQuery.browser.msie ) {
+                               // IE copies events bound via attachEvent when
+                               // using cloneNode. Calling detachEvent on the
+                               // clone will also remove the events from the orignal
+                               // In order to get around this, we use innerHTML.
+                               // Unfortunately, this means some modifications to 
+                               // attributes in IE that are actually only stored 
+                               // as properties will not be copied (such as the
+                               // the name attribute on an input).
+                               var clone = this.cloneNode(true),
+                                       container = document.createElement("div"),
+                                       container2 = document.createElement("div");
+                               container.appendChild(clone);
+                               container2.innerHTML = container.innerHTML;
+                               return container2.firstChild;
+                       } else
+                               return this.cloneNode(true);
                });
 
                // Need to set the expando to null on the cloned set if it exists
@@ -482,16 +494,9 @@ jQuery.fn = jQuery.prototype = {
                                        this.cloneNode( true ) :
                                        this;
 
+                               // execute all scripts after the elements have been injected
                                if ( jQuery.nodeName( elem, "script" ) ) {
-
-                                       // If scripts are waiting to be executed, wait on this script as well
-                                       if ( scripts.length )
-                                               scripts = scripts.add( elem );
-
-                                       // If nothing is waiting to be executed, run immediately
-                                       else
-                                               evalScript( 0, elem );
-
+                                       scripts = scripts.add( elem );
                                } else {
                                        // Remove any inner scripts for later evaluation
                                        if ( elem.nodeType == 1 )
@@ -507,6 +512,9 @@ jQuery.fn = jQuery.prototype = {
        }
 };
 
+// Give the init function the jQuery prototype for later instantiation
+jQuery.prototype.init.prototype = jQuery.prototype;
+
 function evalScript( i, elem ) {
        if ( elem.src )
                jQuery.ajax({