Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How would I pass data to an external script loaded with $.getScript()?

So I'm trying to load a javascript remotely using jquery's $.getScript, but I'm puzzled on how I can pass data to the external script.

I've tried setting variables before the call but they aren't available in the script that gets loaded, and when I try to send/retrieve them using the query string, the remote script tries to read the querystring of the base file that it gets called from, not itself. Is there any other way to do this? Or is it possible to have a javascript file read its own querystring rather than the file it's called from (that's loaded in the browser)?

// editor ini
var editor_ini = { page: current_page, action: 'edit' };
var foo = 'bar';
// load the editor
$.getScript('assets/desktop/desklets/'+launcher.config.editor+'/execute.js', function(){});

In the execute.js file, the editor_ini and foo are both unavailable, I get the same result with:

// load the editor
$.getScript('assets/desktop/desklets/'+launcher.config.editor+'/execute.js', { page: current_page, action: 'edit', foo: 'bar' }, function(){});

because the remote script seems to be getting the query string from the original document rather than the one used when calling the file.

If it matters, I was trying to use the query object plugin for jquery for reading the query string.

like image 395
wyqydsyq Avatar asked Sep 16 '11 05:09

wyqydsyq


3 Answers

global variable declared in inline javascript is accessible in external javascript page loaded using $.getScript().

like image 58
Bhanu Krishnan Avatar answered Oct 11 '22 20:10

Bhanu Krishnan


I bet that your var foo='bar' is inside a function, so not visible in global scope. Try:

window.foo = 'bar'
like image 36
Alexei Levenkov Avatar answered Oct 11 '22 19:10

Alexei Levenkov


Truly global variables will be accessible to your script. So, if they aren't, then it's probably because your variables that you think are global actually aren't. You can either move them to the top level scope or set them on the window object like Alexei suggested.

There are other ways to share data.

1) You can put an id on the <script> tag that loads the code and then have the code get the .src value from that tag and get the query string off the script's actual URL. I like this option, but I don't know if you can do it using jQuery.getScript() since I don't think it exposes that as an option.

2) You can have the loading script call a function that you provide and return an object with the desired data from that function.

3) Once the new script is loaded, you can call a setXXX() function in that script to set the state that it needs.

4) You can set information into a cookie that the other script can read.

5) You can encode data into a URL hash value that the other script can read.

like image 33
jfriend00 Avatar answered Oct 11 '22 20:10

jfriend00