如何获取javascript文件的位置(src)?

9
一个JavaScript文件怎样知道自己所在的位置?例如:
<script type="text/javascript" src="http://mysite.com/scripts/howdy.js"></script>
< p >如何让howdy.js中的代码知道http://mysite.com/scripts/howdy.js

编辑:澄清。我不能依靠搜索DOM来获取我的脚本标签,因为我需要在DOM准备就绪之前了解它。


2
我很好奇,你为什么需要这个信息? - tenfour
可能是重复的问题:如何在脚本内获取脚本文件名? - Marcel Korpel
1
@tenfour - howdy.js可能从同一目录中拉取其他脚本,我无法确定howdy.js将托管在哪里(测试、生产、qa、客户端主机等)。这不是很好,但这是业务要求。@Marcel - 是的,你说得对,这是一个重复的问题。但我会保留它,因为我用搜索词找不到那个答案。 - Josh Johnson
4个回答

14

在执行当前脚本的时刻,DOM中将是最后一个script元素,因此您可以通过以下方式获取它:

var scripts = document.getElementsByTagName('script'),
    currentScriptSrc = scripts[scripts.length-1].src;

查看这个示例,它会加载这个脚本

编辑: 考虑到@kangax对于asyncdefer属性的评论,我认为唯一安全的方法是,在事先已知文件名的情况下,检查页面上的script元素,检查其src属性。一些库,比如Scriptaculous.us就是使用这种技术的。

var scripts = document.getElementsByTagName('script'),
    len = scripts.length,
    re = /howdy\.js$/,
    src, howdyScriptSrc;

while (len--) {
  src = scripts[len].src;
  if (src && src.match(re)) {
    howdyScriptSrc = src;
    break;
  }
}
​

很酷,我不知道你能保证这些信息。但是在我尝试的每个浏览器上似乎都是一致的。谢谢! - Josh Johnson
1
请考虑Kangax的评论,他在这里留下了链接:http://twitter.com/kangax/status/22208127507 - zachleat
1
@zachleat:谢谢!是的,我完全忘记了defer和async属性。 - Christian C. Salvadó

1
给这个脚本标签一个ID,并写入:
var src = document.getElementById('scriptID').attributes['src'];

1

试试这个:

function getScriptSourceName(name){
    var scripts = document.getElementsByTagName('script');
    for (i=0;i<scripts.length;i++){
        if (scripts[i].src.indexOf(name) > -1)
            return scripts[i].src;
    }
}

getScriptSourceName('howdy.js');

0

尝试:

document.scripts[document.scripts.length-1]; // add .src to get href
//or
document.getElementsByTagName("script")[document.getElementsByTagName("script").length-1];
//for (maybe) better compatibility

获取DOM中的最后一个脚本。如果您的脚本在加载时正在执行,则会返回正确的元素。

将其保存到变量中,以便在稍后使用的函数中使用。

var thisScript = document.scripts[document.scripts.length-1];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接