JavaScript - Как получить URL-адрес script, который вызывается?
Я включаю 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());
Что бы предупредить " http://site2.com/myscript.js", если вызвано из указанного выше index.html.
Ответы
Ответ 1
Из http://feather.elektrum.org/book/src.html:
var scripts = document.getElementsByTagName('script');
var index = scripts.length - 1;
var myScript = scripts[index];
Теперь переменная myScript
имеет элемент script dom. Вы можете получить url src, используя myScript.src
.
Обратите внимание, что это необходимо выполнить как часть начальной оценки script. Если вы хотите не загрязнять пространство имен Javascript, вы можете сделать что-то вроде:
var getScriptURL = (function() {
var scripts = document.getElementsByTagName('script');
var index = scripts.length - 1;
var myScript = scripts[index];
return function() { return myScript.src; };
})();
Ответ 2
Вы можете добавить атрибут id в свой тег script (даже если он находится внутри основного тега):
<script id="myscripttag" src="http://site2.com/myscript.js"></script>
а затем получить доступ к его src следующим образом:
document.getElementById("myscripttag").src
конечно, значение id должно быть одинаковым для каждого документа, который включает ваш script, но я не думаю, что это большое неудобство для вас.
Ответ 3
С помощью DOM и querySelector вы можете взять для определенного script:
var dir = document.querySelector('script[src$="myscript.js"]').getAttribute('src');
var name = dir.split('/').pop();
dir = dir.replace('/'+name,"");
Ответ 4
Я написал класс, чтобы найти путь к сценариям, который работает с задержкой загрузки и тегами async script.
У меня были некоторые файлы шаблонов, которые были относительно моих скриптов, поэтому вместо жесткого кодирования я создал созданный класс, чтобы создавать пути автоматически. Полный источник находится здесь на 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('.');
};
}
Ответ 5
Все, кроме IE, поддерживает
document.currentScript
Ответ 6
Если у вас есть возможность использовать jQuery, код будет выглядеть так:
$('script[src$="/myscript.js"]').attr('src');
Ответ 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
}
Ответ 8
Следующий код позволяет найти элемент script с заданным именем
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;
}
}
Ответ 9
Не можете ли вы использовать location.href или location.host, а затем добавить имя script?