Background
A colleague asked a question, how to get the current file name in a JavaScript file dynamically inserted in the browser?
In addition to the server outputting a file name, there should only be the following three ways to obtain it in the script.
Solution A
The common solution can only be used for the introduction of static scripts tags on the page or a single dynamic load.
var scripts = document.getElementsByTagName('script');
var filename = scripts[scripts.length -1].src;
Dynamic insertion of multiple script tags:
loadScript('b.js?param=1')
loadScript('a.js?param=2')
loadScript('b.js?param=3')
loadScript('a.js?param=4')
/* Output
a.js >>> ; http://localhost:800/io/a.js?param=4
a.js >>> http://localhost:800/io/a.js?param=4
b.js >>> http://localhost:800/io/a.js?param=4
b.js >>> http://localhost:800/io/a. js?param=4
*/
Solution B
Abnormal type, only works on FireFox:
try {
throw new Error();
}
catch(exception){
console.log ( exception.fileName );
}
Solution C
My solution, operation source code:
requireScript('a.js?' Date.now(),function(text,src) {
console.log('text :',text);
globalEval('(function() { nvar __filename = "' src '";n' text 'n;})();');
})
Browser output:
<script> (function() { <br>var __filename = "a.js?1310971812334"; <br>var scripts = document.getElementsByTagName('script'); <br>console.log('a.js',' > >> ',scripts[scripts.length -1].src); <br>console.log(__filename); <br>;})();</script>
Advantages: reliable, cacheable, deferrable execution, scalable.
Restrictions: 1) Variable naming is agreed to be "__filename"; 2) Same origin policy.
I also thought of this loading strategy to load the popular CoffeeScript, such as:
requireScript('script.coffee',function(text,src) {
if( isCoffeeScript(src) )
globalEval( CoffeeScript.compile(text) );
})
Link
Cross-Origin Resource Sharing
Passing JavaScript arguments via the src attribute
CoffeeScript
View or download
https://gist.github.com/1088730