我在文件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”。
答案 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
答案 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然后附加脚本名称吗?