Fixed #1959 by postponing ALL script evaluations till the html insertion is done...
authorDavid Serduke <davidserduke@gmail.com>
Mon, 10 Dec 2007 19:04:59 +0000 (19:04 +0000)
committerDavid Serduke <davidserduke@gmail.com>
Mon, 10 Dec 2007 19:04:59 +0000 (19:04 +0000)
src/core.js
test/unit/core.js

index 39ffdb5..582e53e 100644 (file)
@@ -494,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 )
index 533fcef..3aa66b3 100644 (file)
@@ -1022,7 +1022,8 @@ test("html(String)", function() {
 
        $("#main").html('foo <form><script type="text/javascript">ok( true, "$().html().evalScripts() Evals Scripts Twice in Firefox, see #975" );</script></form>');
 
-       $("#main").html("<script>ok(scriptorder++ == 0, 'Script is executed in order');ok($('#scriptorder').length == 0,'Execute before html')<\/script><span id='scriptorder'><script>ok(scriptorder++ == 1, 'Script is executed in order');ok($('#scriptorder').length == 1,'Execute after html')<\/script></span><script>ok(scriptorder++ == 2, 'Script is executed in order');ok($('#scriptorder').length == 1,'Execute after html')<\/script>");
+       // it was decided that waiting to execute ALL scripts makes sense since nested ones have to wait anyway so this test case is changed, see #1959
+       $("#main").html("<script>ok(scriptorder++ == 0, 'Script is executed in order');ok($('#scriptorder').length == 1,'Execute after html (even though appears before)')<\/script><span id='scriptorder'><script>ok(scriptorder++ == 1, 'Script (nested) is executed in order');ok($('#scriptorder').length == 1,'Execute after html')<\/script></span><script>ok(scriptorder++ == 2, 'Script (unnested) is executed in order');ok($('#scriptorder').length == 1,'Execute after html')<\/script>");
 
        setTimeout( start, 100 );
 });