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


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解决常见浏览器兼容问题的12种方法
Jan 04 Javascript
jQuery 学习第七课 扩展jQuery的功能 插件开发
May 17 Javascript
JavaScript中两种链式调用实现代码
Jan 12 Javascript
js 分页全选或反选标识实现代码
Aug 09 Javascript
JavaScript函数参数使用带参数名的方式赋值传入的方法
Mar 19 Javascript
javascript实现倒计时(精确到秒)
Jun 26 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
Dec 22 Javascript
vue自定义全局组件(自定义插件)的用法
Jan 30 Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
Apr 24 Javascript
微信小程序tabBar设置实例解析
Nov 14 Javascript
将Vue组件库更换为按需加载的方法步骤
May 06 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
Jul 20 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
mac下Apache + MySql + PHP搭建网站开发环境
2014/06/02 PHP
javascript操作文本框readOnly
2007/05/15 Javascript
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
基于Asp.net与Javascript控制的日期控件
2010/05/22 Javascript
jQuery Study Notes学习笔记 (二)
2010/08/04 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
运用jQuery定时器的原理实现banner图片切换
2014/10/22 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
JS中from 表单序列化提交的代码
2017/01/20 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
Node解决简单重复问题系列之Excel内容的获取
2018/01/02 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
2018/07/13 Javascript
node.js命令行教程图文详解
2019/05/27 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
通过实例解析vuejs如何实现调试代码
2020/07/16 Javascript
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
3个用于数据科学的顶级Python库
2018/09/29 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
通过案例解析python鸭子类型相关原理
2020/10/10 Python
python爬取youtube视频的示例代码
2021/03/03 Python
Under Armour美国官网:美国知名高端功能性运动品牌
2016/09/05 全球购物
澳大利亚购买最佳炊具品牌网站:Cookware Brands
2019/02/16 全球购物
CheapTickets香港机票预订网站:CheapTickets.hk
2019/06/26 全球购物
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
在Java开发中如何选择使用哪种集合类
2016/08/09 面试题
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
有创意的广告词
2014/03/18 职场文书
保证金退回承诺函格式
2015/01/21 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书
2015年材料员工作总结
2015/04/30 职场文书
葬礼主持词
2015/07/02 职场文书
教你用Python+selenium搭建自动化测试环境
2021/06/18 Python
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python