JavaScript - 如何获取调用脚本的URL?

Mik*_*eC8 72 javascript

我在文件中包含myscript.js,http://site1.com/index.html如下所示:

<script src=http://site2.com/myscript.js></script>
Run Code Online (Sandbox Code Playgroud)

在"myscript.js"中,我希望能够访问URL" http://site2.com/myscript.js ".我想要这样的东西:

function getScriptURL() {
    // something here
    return s
}

alert(getScriptURL());
Run Code Online (Sandbox Code Playgroud)

如果从上面提到的index.html调用,它会提醒" http://site2.com/myscript.js ".

lam*_*cck 53

来自http://feather.elektrum.org/book/src.html:

var scripts = document.getElementsByTagName('script');
var index = scripts.length - 1;
var myScript = scripts[index];
Run Code Online (Sandbox Code Playgroud)

该变量myScript现在具有脚本dom元素.您可以使用获取src网址myScript.src.

请注意,这需要作为脚本初始评估的一部分执行.如果您不想污染Javascript命名空间,您可以执行以下操作:

var getScriptURL = (function() {
    var scripts = document.getElementsByTagName('script');
    var index = scripts.length - 1;
    var myScript = scripts[index];
    return function() { return myScript.src; };
})();
Run Code Online (Sandbox Code Playgroud)

  • 在所有浏览器中,这总是会返回正确脚本的URL吗?这看起来会返回最后一个脚本标记,但是如果文档中有多个脚本标记会怎么样? (18认同)
  • 我遇到过这种算法无法可靠运行的情况.设置为异步的其他脚本标记可以在您请求和运行的脚本之间运行.这些脚本可以向DOM后面添加其他脚本.当你的脚本运行时,页面上的最后一个脚本不再是你的,而是返回了错误的`src`. (15认同)
  • 如果在页面加载后使用以下内容加载脚本,则不起作用:`document.getElementsByTagName("head")[0] .appendChild(scriptElement);` (9认同)
  • 好的...然后我的问题就变成了,所有浏览器在进入下一个脚本标记之前,是否始终会完全加载并执行远程脚本的全部内容?这个标准有多严格?我可以想象它并行发生... (2认同)

tsd*_*sds 48

您可以将id属性添加到脚本标记中(即使它位于head标记内):

<script id="myscripttag" src="http://site2.com/myscript.js"></script>
Run Code Online (Sandbox Code Playgroud)

然后按如下方式访问其src:

document.getElementById("myscripttag").src
Run Code Online (Sandbox Code Playgroud)

当然,对于包含您脚本的每个文档,id值应该相同,但我认为这对您来说不是很大的不便.


3DR*_*ert 24

使用DOM和querySelector,您可以获取特定脚本:

var dir = document.querySelector('script[src$="myscript.js"]').getAttribute('src');
var name = dir.split('/').pop(); 
dir = dir.replace('/'+name,"");
Run Code Online (Sandbox Code Playgroud)


dav*_*010 22

IE以外的所有东西都支持

document.currentScript
Run Code Online (Sandbox Code Playgroud)

  • 更准确地说:“document.currentScript.src”。 (3认同)
  • 请注意!如果加载的脚本类型是模块,它将不起作用。欲了解更多/sf/ask/208365601/ Called/67235905#67235905 (3认同)
  • 更多信息:https://developer.mozilla.org/en-US/docs/Web/API/Document/currentScript (2认同)

Que*_*mer 18

我写了一个类来查找使用延迟加载和异步脚本标记的脚本路径.

我有一些与我的脚本相关的模板文件,因此我创建的类不是硬编码,而是自动创建路径.完整的源代码在github上.

前段时间我曾使用arguments.callee尝试做类似的事情,但我最近在MDN上看到它在严格模式下不允许的.

function ScriptPath() {
  var scriptPath = '';
  try {
    //Throw an error to generate a stack trace
    throw new Error();
  }
  catch(e) {
    //Split the stack trace into each line
    var stackLines = e.stack.split('\n');
    var callerIndex = 0;
    //Now walk though each line until we find a path reference
    for(var i in stackLines){
      if(!stackLines[i].match(/http[s]?:\/\//)) continue;
      //We skipped all the lines with out an http so we now have a script reference
      //This one is the class constructor, the next is the getScriptPath() call
      //The one after that is the user code requesting the path info (so offset by 2)
      callerIndex = Number(i) + 2;
      break;
    }
    //Now parse the string for each section we want to return
    pathParts = stackLines[callerIndex].match(/((http[s]?:\/\/.+\/)([^\/]+\.js)):/);
  }

  this.fullPath = function() {
    return pathParts[1];
  };

  this.path = function() {
    return pathParts[2];
  };

  this.file = function() {
    return pathParts[3];
  };

  this.fileNoExt = function() {
    var parts = this.file().split('.');
    parts.length = parts.length != 1 ? parts.length - 1 : 1;
    return parts.join('.');
  };
}
Run Code Online (Sandbox Code Playgroud)

  • @AbdullahAydın:请注意,在错误被抛出之前,IE和Edge浏览器中不会填充新错误的堆栈属性. (3认同)
  • 你不需要以这种方式抛出"错误"(得到它的".stack")它只是像其他人一样的对象:console.log(new Error().stack); (2认同)

Mr.*_*kin 14

如果你有机会使用jQuery,代码将如下所示:

$('script[src$="/myscript.js"]').attr('src');
Run Code Online (Sandbox Code Playgroud)


per*_*mon 7

简单而直接的解决方案效果很好:

如果不是IE,则可以使用document.currentScript
IE document.querySelector('script[src*="myscript.js"]')

function getScriptURL(){
 var script =  document.currentScript || document.querySelector('script[src*="myscript.js"]')
 return script.src
}
Run Code Online (Sandbox Code Playgroud)