4

有什么方法可以在文档准备好后获取 javascript 文件的文件信息(文件名、路径),而不知道有多少脚本或它们的加载顺序?

IE

<html>
  <head>
    <script src="http://www.example.ex/js/js1.js" type="text/javascript">
    <script src="http://www.example.ex/javascript/js2.js" type="text/javascript">
    <script src="http://www.example.ex/scripts/js3.js" type="text/javascript">
    <...>

文件 js2.js 的内容如下:

$(document).ready(function() {
  // get the filename "js2.js"
}

我可以

var scripts = document.getElementsByTagName("script"),
    scriptLocation = scripts[1].src;

但索引“[1]”必须是动态的,因为我不知道加载脚本的顺序。

4

5 回答 5

3

也许一个完整的答案会比我的评论更有帮助。如果你把这段代码放进去js2.js,你会得到你想要的。scriptLocation关键是在一段与加载文件同步运行的代码中捕获,这意味着不在回调中。

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

$(document).ready(function() {
  // logs the full path corresponding to "js2.js"
  console.log(scriptLocation);
}
于 2013-09-20T14:36:36.697 回答
2

要从Error.stack例如获取行号和文件名:

console.log((new Error).stack.split("\n"));

请参见Error.stack

有关浏览器兼容性,请参阅上一个 SO 问题

于 2013-09-20T14:04:09.153 回答
1

不完全确定你在追求什么,但如果你想获得对 DOM 中加载的所有脚本的引用,你只需这样做:

var scripts = document.getElementsByTagName("script");
for(var i = 0; i < scripts.length; i++){
     var scriptLocation = scripts[i].src;
}
于 2013-09-20T14:00:08.117 回答
0
var scripts = document.getElementsByTagName("script");
for (var i = 0; i < scripts.length; i++) {
    if (scripts[i].src.match(/<desired filename>/) {
        scriptLocation = scripts[i];
    }
}

如果我正确理解了您的问题,那应该可以解决问题。

于 2013-09-20T14:06:52.133 回答
0
var scriptName = [].slice.call(document.getElementsByTagName('script')).pop().getAttribute('src');

document.getElementsByTagName('script')返回HTMLCollection页面脚本。最后一个元素是当前脚本。HTMLCollection没有办法得到最后一个,但是在将 colliection 转换为[].slice.callto之后,Array我们可以调用pop来做它。最后getAttribute返回所需的文件名。

相同的代码可用于将参数传递给 js-script

<script src="file.js" args="arg1;arg2">
...
var args = [].slice.call(document.getElementsByTagName('script')).pop().getAttribute('args').split(';');
于 2016-07-21T20:09:00.743 回答