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

时间:2010-06-04 18:13:43

标签: javascript

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

<script src=http://site2.com/myscript.js></script>

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

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

alert(getScriptURL());

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

11 个答案:

答案 0 :(得分:51)

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

var scripts = document.getElementsByTagName('script');
var index = scripts.length - 1;
var myScript = scripts[index];

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

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

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

答案 1 :(得分:43)

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

<script id="myscripttag" src="http://site2.com/myscript.js"></script>

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

document.getElementById("myscripttag").src

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

答案 2 :(得分:24)

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

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

答案 3 :(得分:18)

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

我有一些与我的脚本相关的模板文件,因此我创建的类不是硬编码,而是自动创建路径。 The full source is here on github.

前段时间我曾使用arguments.callee尝试做类似的事情,但我最近在MDN上看到它是not allowed in strict mode

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('.');
  };
}

答案 4 :(得分:17)

IE以外的所有内容都支持

document.currentScript

答案 5 :(得分:12)

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

$('script[src$="/myscript.js"]').attr('src');

答案 6 :(得分:6)

简单直接的解决方案非常有效:

如果不是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
}

答案 7 :(得分:2)

以下代码可让您找到具有给定名称的脚本元素

var scripts = document.getElementsByTagName( 'script' );
        var len = scripts.length
        for(var i =0; i < len; i++) {
            if(scripts[i].src.search("<your JS file name") > 0 && scripts[i].src.lastIndexOf("/") >= 0) {
                absoluteAddr = scripts[i].src.substring(0, scripts[i].src.lastIndexOf("/") + 1);
                break;
            }
        }

答案 8 :(得分:0)

document.currentScript.src

将返回当前脚本 URL 的 URL。

注意:如果您加载了类型为 Module 的脚本,请使用

import.meta.url

了解更多import.metacurrentScript.src

答案 9 :(得分:0)

一些死灵法术,但这里有一个尝试几种方法的函数

function getScriptPath (hint) {
    if (  typeof document === "object" && 
          typeof document.currentScript === 'object' && 
          document.currentScript && // null detect
          typeof document.currentScript.src==='string' && 
          document.currentScript.src.length > 0) {
        return document.currentScript.src;
    }
    
    
    let here = new Error();
    if (!here.stack) {
        try { throw here;} catch (e) {here=e;}
    }
    if (here.stack) {
        
        const stacklines = here.stack.split('\n');
        console.log("parsing:",stacklines);
        let result,ok=false;
        stacklines.some(function(line){
            if (ok) {
               const httpSplit=line.split(':/');
               const linetext = httpSplit.length===1?line.split(':')[0]:httpSplit[0]+':/'+( httpSplit.slice(1).join(':/').split(':')[0]);
               const chop = linetext.split('at ');
               if (chop.length>1) {
                   result = chop[1];
                   if ( result[0]!=='<') {
                      console.log("selected script from stack line:",line);               
                      return true;
                   }
                   result=undefined;
               }
               return false; 
            }
            ok = line.indexOf("getScriptPath")>0;
            return false;
        });
        return result;
    }
    
    if ( hint && typeof document === "object") {
       const script = document.querySelector('script[src="'+hint+'"]');
       return script && script.src && script.src.length && script.src;
    }
    
}
   
   console.log("this script is at:",getScriptPath ())

答案 10 :(得分:-6)

你不能使用location.href或location.host然后附加脚本名称吗?