背景
同事提了一個問題,如何在浏覽器中動態插入的 JavaScript 文件中,獲取當前文件名?
除了服務器輸出一個文件名外,在腳本中獲取應該只有下面三種做法。
解法A
普遍的解法,只能用於頁面靜態scripts標簽引入或者單個動態加載。
復制代碼 代碼如下:
var scripts = document.getElementsByTagName('script');
var filename = scripts[scripts.length -1].src;
動態插入多個腳本標簽的情況:
復制代碼 代碼如下:
loadScript('b.js?param=1')
loadScript('a.js?param=2')
loadScript('b.js?param=3')
loadScript('a.js?param=4')
/* 輸出
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
*/
解法B
變態型,只能工作於FireFox:
復制代碼 代碼如下:
try {
throw new Error();
}
catch(exception){
console.log( exception.fileName );
}
解法C
我的解法,操作源代碼:
復制代碼 代碼如下:
requireScript('a.js?'+Date.now(),function(text,src) {
console.log('text:',text);
globalEval('(function() { \nvar __filename = "'+ src +'";\n'+ text +'\n;})();');
})
浏覽器輸出:
復制代碼 代碼如下:
<script>(function() {
var __filename = "a.js?1310971812334";
var scripts = document.getElementsByTagName('script');
console.log('a.js',' >>> ',scripts[scripts.length -1].src);
console.log(__filename);
;})();</script>
優點:可靠、可緩存、可推遲執行、可擴展。
限制:1)變量命名被約定為“__filename”;2)同源策略。
又想到這個加載策略用來加載流行的 CoffeeScript,比如:
復制代碼 代碼如下:
requireScript('script.coffee',function(text,src) {
if( isCoffeeScript(src) )
globalEval( CoffeeScript.compile(text) );
})
鏈接
Cross-Origin Resource Sharing
Passing JavaScript arguments via the src attribute
CoffeeScript
查看或下載
https://gist.github.com/1088730