A fix for bug #1443, where globalEval occurred asynchronously in Safari 2, provided...
authorJohn Resig <jeresig@gmail.com>
Mon, 1 Oct 2007 20:15:20 +0000 (20:15 +0000)
committerJohn Resig <jeresig@gmail.com>
Mon, 1 Oct 2007 20:15:20 +0000 (20:15 +0000)
src/core.js
test/unit/core.js

index 3b0c465..0cf0444 100644 (file)
@@ -564,15 +564,19 @@ jQuery.extend({
                data = jQuery.trim( data );
 
                if ( data ) {
-                       if ( window.execScript )
-                               window.execScript( data );
-
-                       else if ( jQuery.browser.safari )
-                               // safari doesn't provide a synchronous global eval
-                               window.setTimeout( data, 0 );
-
+                       // Inspired by code by Andrea Giammarchi
+                       // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
+                       var head = document.getElementsByTagName("head")[0] || document.documentElement,
+                               script = document.createElement("script");
+
+                       script.type = "text/javascript";
+                       if ( jQuery.browser.msie )
+                               script.text = data;
                        else
-                               eval.call( window, data );
+                               script.appendChild( document.createTextNode( data ) );
+
+                       head.appendChild( script );
+                       head.removeChild( script );
                }
        },
 
index 730e18c..32ff83e 100644 (file)
@@ -123,11 +123,18 @@ test("isFunction", function() {
        });
 });
 
+var foo = false;
+
 test("$('html')", function() {
-       expect(2);
+       expect(4);
        
        reset();
-       ok( $("<script>var foo='test';</script>")[0], "Creating a script" );
+       foo = false;
+       var s = $("<script>var foo='test';</script>")[0];
+       ok( s, "Creating a script" );
+       ok( !foo, "Make sure the script wasn't executed prematurely" );
+       $("body").append(s);
+       ok( foo, "Executing a scripts contents in the right context" );
        
        reset();
        ok( $("<link rel='stylesheet'/>")[0], "Creating a link" );