我如何从该脚本中获取脚本文件名?

cor*_*ore 39 html javascript

我很确定答案是否定的,但我想我还是会问.

如果我的站点引用了一个名为"whatever.js"的脚本,是否可以从该脚本中获取"whatever.js"?喜欢:

var scriptName = ???

if (typeof jQuery !== "function") {
    throw new Error(
        "jQuery's script needs to be loaded before " + 
        scriptName + ". Check the <script> tag order.");
}
Run Code Online (Sandbox Code Playgroud)

可能比依赖检查更值得麻烦,但是到底是怎么回事.

Sho*_*og9 33

var scripts = document.getElementsByTagName('script');
var lastScript = scripts[scripts.length-1];
var scriptName = lastScript.src;
alert("loading: " + scriptName);
Run Code Online (Sandbox Code Playgroud)

测试:FF 3.0.8,Chrome 1.0.154.53,IE6


另请参阅:如何引用加载当前正在执行的脚本的脚本标记?

  • 我遇到过这种算法无法可靠运行的情况.设置为异步的其他脚本标记可以在您请求和运行的脚本之间运行.这些脚本可以向DOM后面添加其他脚本.当你的脚本运行时,页面上的最后一个脚本不再是你的,而是返回了错误的`src`. (9认同)
  • 边缘情况:如果在加载`<body>`之后将当前脚本添加到`<head>`并且`<body>`中有任何脚本,这将返回`<body>`中的最后一个脚本,而不是目前正在运行`<head>`中的脚本. (6认同)
  • 这对于同步加载的脚本非常有效 (5认同)
  • 这个答案已经严重过时了。脚本可以被延迟,异步,模块,工作程序。这个答案对他们都不起作用。 (3认同)

jdu*_*tor 20

我知道这已经过时了,但我已经开发出了更好的解决方案,因为上述所有内容都不适用于异步脚本.通过一些调整,以下脚本可以涵盖几乎所有用例.什么对我有用:

function getScriptName() {
    var error = new Error()
      , source
      , lastStackFrameRegex = new RegExp(/.+\/(.*?):\d+(:\d+)*$/)
      , currentStackFrameRegex = new RegExp(/getScriptName \(.+\/(.*):\d+:\d+\)/);

    if((source = lastStackFrameRegex.exec(error.stack.trim())) && source[1] != "")
        return source[1];
    else if((source = currentStackFrameRegex.exec(error.stack.trim())))
        return source[1];
    else if(error.fileName != undefined)
        return error.fileName;
}
Run Code Online (Sandbox Code Playgroud)

不确定Internet Explorer上的支持,但在我测试的其他所有浏览器中都能正常工作.

  • 谢谢!这是一个很好的方法,因为它也适用于Web Workers.但是在缩小后它会失败,因为该函数不再被称为getScriptName.解决方案是将currentStackFrameRegex表达式替换为:new RegExp(arguments.callee.name +'\\(.+ \\ /(.*):\\ d +:\\ d + \\)') (4认同)

ale*_*lex 12

您可以使用...

var scripts = document.getElementsByTagName("script"),
  currentScriptUrl = (document.currentScript || scripts[scripts.length - 1]).src;
Run Code Online (Sandbox Code Playgroud)

currentScript() 除了IE之外的所有浏览器都支持.

确保它在解析和执行文件时运行,而不是在DOM就绪或window加载时运行.

如果它是一个空字符串,则您的script块没有或没有空src属性.

  • 与其他一些答案不同,我喜欢即使在“异步”脚本中这也很有用。不幸的是,如果 `currentScript` 在一个事件处理程序或全局函数中被调用,而该函数本身是从另一个文件调用的,它将返回另一个文件。 (2认同)
  • 继@Stephan的评论之后,现在在caniuse.com上有[document.currentScript](https://caniuse.com/#feat=document-currentscript)的条目. (2认同)

Ali*_*ino 8

在 Node.js 中:

var abc = __filename.split(__dirname+"/").pop();
Run Code Online (Sandbox Code Playgroud)

  • 显然 __filename 和 __dirname 是 node.js 的东西,并且只在 node.js 上下文中工作。 (7认同)

F-3*_*000 5

Shog9 的建议更短:

alert("loading: " + document.scripts[document.scripts.length-1].src);
Run Code Online (Sandbox Code Playgroud)