【问题标题】:Get current running javascript filename after document is loaded加载文档后获取当前正在运行的 javascript 文件名
【发布时间】:2013-09-20 13:56:23
【问题描述】:

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

<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]”必须是动态的,因为我不知道加载脚本的顺序。

【问题讨论】:

  • how to get the absolute path of the current javascript file name 的可能副本。正如那里接受的答案所说:“当然,这只会在初始代码运行时起作用,并且例如在加载初始脚本后调用的函数中没有用,所以如果您需要稍后可用的值,您需要将其保存到变量中。”
  • 正如那个答案所说,当前运行的脚本始终是scripts[scripts.length - 1]。您只需要在文档就绪处理程序之前保存对名称的引用。
  • @MattBall 我想你的意思是一个脚本在加载时只执行一次。那是我的错误,我应该问文档完全加载后,当我调用一个函数时,我怎么知道这个函数所在的脚本的索引而不保存它?希望你理解我。
  • 如果之前不保存,就没有 100% 正确的方法。最好使用a stack trace hack。没有什么可以说在任意时间执行的任意 JS sn-p 甚至 exists 在文件中。我很想知道你为什么要这样做,因为这真的开始闻起来像an XY problem to me.

标签: javascript jquery


【解决方案1】:

也许一个完整的答案会比我的 cmets 更有帮助。如果您将此代码放入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);
}

【讨论】:

  • 没错!这就是我的意思,我已经在使用这个解决方案了。但是我想在没有前 2 行的情况下获得相同的信息,或者我需要在每个脚本上编写这一行并将变量 scriptLocation 保存为数组。
【解决方案2】:

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

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

Error.stack

浏览器兼容性见previous SO question

【讨论】:

  • 这是最好的答案,虽然它很老套而且浏览器支持参差不齐。
【解决方案3】:

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

var scripts = document.getElementsByTagName("script");
for(var i = 0; i < scripts.length; i++){
     var scriptLocation = scripts[i].src;
}

【讨论】:

  • 这确实不能回答问题。
  • 我不能说我完全理解这个问题,但他似乎推断他需要一个我提供的动态索引。他现在应该可以在加载文档后访问所有脚本位置。如果 OP 需要其他东西,欢迎他指定什么。
【解决方案4】:
var scripts = document.getElementsByTagName("script");
for (var i = 0; i < scripts.length; i++) {
    if (scripts[i].src.match(/<desired filename>/) {
        scriptLocation = scripts[i];
    }
}

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

【讨论】:

  • 是的,但我不知道/&lt;desired filename&gt;/。我只知道是当前正在执行的文件。
  • 在那种情况下,我不太确定你想要达到什么目的。
  • 我的问题开始于:有什么方法可以获取文件信息(文件名、路径)。所以我不知道“所需的文件名”。
【解决方案5】:
var scriptName = [].slice.call(document.getElementsByTagName('script')).pop().getAttribute('src');

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

同样的代码可以用来传递参数给 js-script

<script src="file.js" args="arg1;arg2">
...
var args = [].slice.call(document.getElementsByTagName('script')).pop().getAttribute('args').split(';');

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性 cmets 挤满你的代码,因为这会降低代码和解释的可读性!
  • :) 添加说明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 2015-04-10
相关资源
最近更新 更多