如何在浏览器中获取当前执行的脚本文件名

news/2024/7/16 10:10:46

背景

同事提了一个问题,如何在浏览器中动态插入的 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

转载于:https://www.cnblogs.com/ambar/archive/2011/07/18/javascript-get-execute-filename-in-browser.html


http://www.niftyadmin.cn/n/3612819.html

相关文章

视频播放的基本原理(转)

当初看VLC代码花了不少时间&#xff0c;其中很大的原因是不太了解视频播放的基本原理。现在看来&#xff0c;几乎所有的视频播放器&#xff0c;如VLC、MPlayer、Xine&#xff0c;包 括DirectShow&#xff0c;在播放视频的原理和架构上都是非常相似的&#xff0c;理解这个对理解…

wav 文件结构

WAVE是录音时用的标准的WINDOWS文件格式&#xff0c;文件的扩展名为“WAV”&#xff0c;数据本身的格式为PCM或压缩型。 WAV文件格式是一种由微软和IBM联合开发的用于音频数字存储的标准&#xff0c;它采用RIFF文件格式结构&#xff0c;非常接近于AIFF和IFF格式。符合 PIFF R…

修复FCKEditor .Net上传时候Permission denied错误

在使用FCKeditor时&#xff0c;如果使用“上传”对话框上传文件&#xff0c;可能导致客户端出现"权限被拒绝 (Permission denied)"错误。 解决方法 使用VS2005打开FredCK.FCKeditorV2.vs2005.csproj&#xff0c;打开FileBrowser > FileWorkerBase.cs&#xff0c;在…

FLV文件格式(Z)

刚才在看一些关于demux的东西&#xff0c;在处理flv格式的文件的时候&#xff0c;由于自己对flv文件的格式不了解&#xff0c;所以就比较云头转向&#xff0c;正好看到了一篇讲述flv文件格式的文章&#xff0c;写的比较明白&#xff0c;所以就转过来了。O(∩_∩)O~flv头文件比较…

Multithread 之 synchronous

Critical Sections&#xff08;临界区&#xff09;&#xff1a;用来实现“排他性占用”。适用范围是单一进程的各线程之间。一个局部对象&#xff0c;不是一个核心对象快速而有效率不能同时有一个以上的Critical Section被等待无法侦测是否已被某个线程放弃例子&#xff1a; #i…

创业在微软——微软亚洲工程院成长启示(双色)

创业在微软——微软亚洲工程院成长启示&#xff08;双色&#xff09; 许凤婷 编著ISBN 978-7-121-13410-4 2011年8月出版定价&#xff1a;39.00元16开424页宣传语&#xff1a;身处软件业巨擘微软&#xff0c;何来创业一说谋士&#xff1f;说客&#xff1f;人贩&#xff1f;IT精…

RTP 与 RTCP 协议

实时传输协议&#xff08;RTP&#xff09;为数据提供了具有实时特征的端对端传送服务&#xff0c;如在组播或单播网络服务下的交互式视频音频或模拟数据。应用程序通常在 UDP 上运行 RTP 以便使用其多路结点和校验服务&#xff1b;这两种协议都提供了传输层协议的功能。但是 RT…

百科词条比较(3)

3. 中文分词 虽然中文分词工具也很多&#xff0c;但没有一个分词工具能像ICTCLAS那样光芒万丈&#xff0c;而且还是免费的&#xff0c;所以就直接用它了。 我们先看下ICTCLAS犀利的简介 &#xff1a; ICTCLAS在国内973专家组组织的评测中活动获得了第一名&#xff0c;在第一届国…