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

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

 <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 ”。

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

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

variablesmyScript现在具有脚本dom元素。 您可以通过使用myScript.src来获取src url。

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

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

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

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

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

 document.getElementById("myscripttag").src 

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

有了DOM和一个querySelector,你可以采取一个特定的脚本:

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

我写了一个类来寻找获得延迟加载和asynchronous脚本标签的脚本的path。

我有一些模板文件是相对于我的脚本,所以而不是硬编码他们,我创build了类自动创buildpath。 完整的源代码在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('.'); }; } 

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

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

除了IE支持的所有东西

 document.currentScript 

以下代码可让您find指定名称的脚本元素

 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; } } 

如果它不是IE你可以使用document.currentScript和IE浏览器,你可以做document.querySelector('script[src*=myscript.js]')所以:

 getScriptURL(){ var script = document.currentScript || document.querySelector('script[src*=myscript.js]') return script.src } 

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