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


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 相关文章推荐
Javascript this关键字使用分析
Oct 21 Javascript
JS控制图片等比例缩放的示例代码
Dec 24 Javascript
javascript的解析执行顺序在各个浏览器中的不同
Mar 17 Javascript
javascript初学者常用技巧
Sep 02 Javascript
Node.js 的异步 IO 性能探讨
Oct 08 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
Mar 29 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
Aug 05 Javascript
wap手机端解决返回上一页的js实例
Dec 08 Javascript
vue2使用keep-alive缓存多层列表页的方法
Sep 21 Javascript
js实现页面多个日期时间倒计时效果
Jun 20 Javascript
JS面向对象编程基础篇(三) 继承操作实例详解
Mar 03 Javascript
Postman环境变量全局变量使用方法详解
Aug 13 Javascript
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
提升PHP执行速度全攻略(下)
2006/10/09 PHP
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
2009/09/05 PHP
解决phpmyadmin中缺少mysqli扩展问题的方法
2013/05/06 PHP
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
php获取301跳转URL简单实例
2013/12/16 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
2014/04/18 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
JS日历 推荐
2006/12/03 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
对table和ul实现js分页示例分享
2014/02/24 Javascript
Nodejs Post请求报socket hang up错误的解决办法
2014/09/25 NodeJs
jQuery中closest()函数用法实例
2015/01/07 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
VUE-Table上绑定Input通过render实现双向绑定数据的示例
2018/08/27 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
python文件比较示例分享
2014/01/10 Python
python读取和保存视频文件
2018/04/16 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
基于HTML5的齿轮动画特效
2016/02/29 HTML / CSS
贝佳斯官方网站:Borghese
2020/05/08 全球购物
企事业单位求职者的自我评价
2013/12/28 职场文书
大学同学十年聚会感言
2014/02/21 职场文书
总经理秘书岗位职责
2014/03/17 职场文书
关于保护环境的建议书
2014/05/13 职场文书
阳光体育活动实施方案
2014/05/25 职场文书
环保小标语
2014/06/13 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
团队会宣传标语
2014/10/09 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书
2015学校年度工作总结
2015/05/11 职场文书