Подтвердить что ты не робот

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.

4b9b3361

Ответ 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?