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


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中最常用的55个经典小技巧
Nov 29 Javascript
js中的eventType事件及其浏览器支持性介绍
Nov 29 Javascript
JavaScript初学者建议:不要去管浏览器兼容
Feb 04 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
Oct 15 Javascript
js微信分享API
Oct 11 Javascript
AngularJS 路由详解和简单实例
Jul 28 Javascript
javascript实现根据汉字获取简拼
Sep 25 Javascript
BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
Dec 01 Javascript
js实现图片切换(动画版)
Dec 25 Javascript
vue编译打包本地查看index文件的方法
Feb 23 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
Aug 11 Javascript
在项目vue中使用echarts的操作步骤
Sep 07 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
10条PHP高级技巧[修正版]
2011/08/02 PHP
YII中assets的使用示例
2014/07/31 PHP
Zend Framework教程之Autoloading用法详解
2016/03/08 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
判断JavaScript对象是否可用的最正确方法分析
2008/10/03 Javascript
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
原生JS实现ajax与ajax的跨域请求实例
2017/12/01 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
jQuery实现鼠标移入显示蒙版效果
2020/01/11 jQuery
[00:55]2015国际邀请赛中国区预选赛5月23日——28日约战上海
2015/05/25 DOTA
使用C语言扩展Python程序的简单入门指引
2015/04/14 Python
Python MySQLdb Linux下安装笔记
2015/05/09 Python
python 文件操作api(文件操作函数)
2016/08/28 Python
python实现弹窗祝福效果
2019/04/07 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
python实现实时视频流播放代码实例
2020/01/11 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
python 常见的排序算法实现汇总
2020/08/21 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
Nike加拿大官网:Nike.com (CA)
2019/04/09 全球购物
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
记帐员岗位责任制
2014/02/08 职场文书
市级文明单位申报材料
2014/05/07 职场文书
机械工程及其自动化专业求职信
2014/08/08 职场文书
公司踏青活动方案
2014/08/16 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
党校学习党性分析材料
2014/12/19 职场文书
用Python简陋模拟n阶魔方
2021/04/17 Python
python中的class_static的@classmethod的巧妙用法
2021/06/22 Python
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js
go goroutine 怎样进行错误处理
2021/07/16 Golang