Side navigation
#407 closed bug (fixed)
Opened November 17, 2006 04:55PM UTC
Closed December 22, 2006 09:13AM UTC
getScript and Safari
Reported by: | aercolino at yahoo.c | Owned by: | |
---|---|---|---|
Priority: | major | Milestone: | 1.1a |
Component: | ajax | Version: | 1.1a |
Keywords: | Cc: | ||
Blocked by: | Blocking: |
Description
While developing the PunchCard widget I've found a problem with getScript in
IE7.
If you are interested in helping me, I've isolated the issue here:
http://www.mondotondo.com/aercolino/punchcard/test-getScript-error/
Attachments (3)
Change History (10)
Changed November 17, 2006 07:01PM UTC by comment:1
Changed November 18, 2006 09:49PM UTC by comment:2
Please refer to the page http://www.mondotondo.com/aercolino/punchcard/test-getScript-error/ for testing the general solution based on a script by Jeff Watkins. I provide a link to Jeff's post documenting its findings.
I think that Jeff's installScript function for evaluating a script in the global scope should be added to the core of jQuery, with the signature "void jQuery.eval( String script )" and every call in jQuery to window.eval should be replaced by a call to jQuery.eval
execScript seems to be available since IE4.x at least (maybe before too)
execScript gets a second optional argument for the language: it defaults to jscript
Changed November 20, 2006 07:23PM UTC by comment:3
Update: I checked the test suite in Safari 1.3.2 and some stuff is broken: "9 tests of 283 failed." The only error in ajax.js however was serialize, and all of the failures existed prior to applying my patch. In other words, it fails in Safari in exactly the same way.
Another note: this last patch I posted from today (11/20/2006) is not in addition to the one posted previously, it is meant to be instead of.
Paul
Changed November 20, 2006 08:40PM UTC by comment:4
Thanks Paul. I just commited your patch and modified one test, it runs fine on FF1.5, IE6, IE7 and Opera 9. Though I'm not sure if the eval/global context stuff is really covered.
Unfortuatenetely I can't declare this bug is fixed... stupid spam :/
Changed November 21, 2006 09:13AM UTC by comment:5
This stuff should be extracted as $.eval:
if(window.execScript) window.execScript(data); else setTimeout(data, 0)
And then replace that call within httpData and evalScripts.
API change scheduled for 1.1.
Changed November 21, 2006 09:58AM UTC by comment:6
Using setTimeout causes the eval to run asynchrounosly, which is ugly. Using eval.call( window, data) works fine together with window.execScript. According to my tests it runs for FF1.5, IE6, IE7 and Opera 9.
Changed November 21, 2006 03:28PM UTC by comment:7
I think that Jeff sais something about Safari support of eval.call(window, data)
Changed November 22, 2006 11:03PM UTC by comment:8
Latest version for $.eval (or rather, $.globalEval)
jQuery.globalEval = function(data){ if(window.execScript) // msie window.execScript(data); else if(jQuery.browser.safari) // safari window.setTimeout(data,0); else // all others eval.call( window, data ); }
eval.call or self.eval won't work either on Safari. Looks like we must live with the timeout, but that must be documented.
Changed December 02, 2006 01:25PM UTC by comment:9
summary: | getScript and IE7 → getScript and Safari |
---|
Fixed for IE7, but won't fix for Safari. If anyone finds a more reliable workaround for Safari...
Changed December 22, 2006 09:13AM UTC by comment:10
resolution: | → fixed |
---|---|
status: | new → closed |
No way to fix it for safari.
You must not use either of the following two methods (they're synonymous) when using getScript when defining functions in the scripts to be loaded.
function myFunc(){}
var myFunc = function(){}
However, if you define functions like this:
myFunc = function(){} // note the lack of "var"
Then it will be available and work fine. I've found no fix for this
in jQuery source. For now we just have to be careful of the scripts we
load in.
You can also keep using the first method above and just define the
variable in the global scope earlier in the script file like so:
myFunc = myOtherFunc = {};
function myFunc(){}
etc...
This was tested against SVN jQuery and IE7.