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


Posted in Javascript onJuly 19, 2011

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

Javascript 相关文章推荐
jQuery 数据缓存data(name, value)详解及实现
Jan 04 Javascript
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
May 04 Javascript
JavaScript中数组的排序、乱序和搜索实现代码
Nov 30 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
Sep 25 Javascript
深入理解JS中的变量及作用域、undefined与null
Mar 04 Javascript
JS实现仿雅虎首页快捷登录入口及导航模块效果
Sep 19 Javascript
Vue.js每天必学之数据双向绑定
Sep 05 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
Feb 10 Javascript
jQuery实现大图轮播
Feb 13 Javascript
简单使用webpack打包文件的实现
Oct 29 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
Jan 08 Javascript
jQuery实现动态加载瀑布流
Sep 01 jQuery
iframe 异步加载技术及性能分析
Jul 19 #Javascript
15款优秀的jQuery导航菜单插件分享
Jul 19 #Javascript
jQuery .tmpl(), .template()学习资料小结
Jul 18 #Javascript
JS仿flash上传头像效果实现代码
Jul 18 #Javascript
js中的string.format函数代码
Aug 11 #Javascript
关于html+ashx开发中几个问题的解决方法
Jul 18 #Javascript
TreeView 用法(有代码)(asp.net)
Jul 15 #Javascript
You might like
c#中的实现php中的preg_replace
2009/12/21 PHP
eval的两组性能测试数据
2012/08/17 Javascript
引用其它js时如何同时处理多个window.onload事件
2014/09/02 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
jQuery中extend函数详解
2015/02/13 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
关于JavaScript的变量的数据类型的判断方法
2015/08/14 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
node.js实现微信开发之获取用户授权
2019/03/18 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
[47:20]DAC2018 4.4 淘汰赛 Optic vs Mineski 第一场
2018/04/05 DOTA
通过实例浅析Python对比C语言的编程思想差异
2015/08/30 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
2019/03/01 Python
浅谈Python 敏感词过滤的实现
2019/08/15 Python
Numpy之将矩阵拉成向量的实例
2019/11/30 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
django-csrf使用和禁用方式
2020/03/13 Python
python+adb命令实现自动刷视频脚本案例
2020/04/23 Python
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
HTML5 Canvas 起步(1) - 基本概念
2009/05/12 HTML / CSS
意大利值得信赖的在线超级药房:PillolaStore
2020/02/05 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
不用游标的SQL语句有哪些
2012/09/07 面试题
国培远程培训感言
2014/03/08 职场文书
药剂专业毕业生求职信
2014/06/24 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
2014年大学班级工作总结
2014/11/14 职场文书
员工拾金不昧表扬稿
2015/05/05 职场文书
使用HttpSessionListener监听器实战
2022/03/17 Java/Android
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers