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

Как я могу получить имя файла script изнутри этого script?

Я уверен, что ответ отрицательный, но думал, что я все равно спрошу.

Если мой сайт ссылается на сценарий под названием "whatever.js", можно ли получить "whatever.js" изнутри этого script? Как:

var scriptName = ???

if (typeof jQuery !== "function") {
    throw new Error(
        "jQuery script needs to be loaded before " + 
        scriptName + ". Check the <script> tag order.");
}

Вероятно, больше проблем, чем это стоит для проверки зависимостей, но какого черта.

4b9b3361

Ответ 2

Я знаю, что это старо, но я разработал лучшее решение, потому что все вышеперечисленное не работает для сценариев Async. При некоторой настройке следующий script может охватывать практически все варианты использования. Heres, что сработало для меня:

function getScriptName() {
    var error = new Error()
      , source
      , lastStackFrameRegex = new RegExp(/.+\/(.*?):\d+(:\d+)*$/)
      , currentStackFrameRegex = new RegExp(/getScriptName \(.+\/(.*):\d+:\d+\)/);

    if((source = lastStackFrameRegex.exec(error.stack.trim())) && source[1] != "")
        return source[1];
    else if((source = currentStackFrameRegex.exec(error.stack.trim())))
        return source[1];
    else if(error.fileName != undefined)
        return error.fileName;
}

Не уверен в поддержке в Internet Explorer, но отлично работает в каждом другом браузере, на котором я тестировал.

Ответ 3

Вы можете использовать...

var scripts = document.getElementsByTagName("script"),
  currentScriptUrl = (document.currentScript || scripts[scripts.length - 1]).src;

currentScript() поддерживается всеми браузерами, кроме IE.

Убедитесь, что он запущен, когда файл анализируется и выполняется, а не в режиме готовности DOM или window.

Если это пустая строка, ваш блок script не имеет или пустой атрибут src.

Ответ 4

Вы можете вернуть список элементов script на странице:

var scripts = document.getElementsByTagName("script");

И затем оцените каждый из них и верните его местоположение:

var location;

for(var i=0; i<scripts.length;++i) {
   location = scripts[i].src;

   //Do stuff with the script location here
}

Ответ 5

Я оставлю это здесь на всякий случай:

var abc = __filename.split(__dirname+"/").pop();

Ответ 6

Предложение Shog9 более короткое:

alert("loading: " + document.scripts[document.scripts.length-1].src);

Ответ 7

Поскольку атрибут src содержит полный путь к файлу script, вы можете добавить вызов подстроки, чтобы получить только имя файла.

var path = document.scripts[document.scripts.length-1].src;

var fileName = path.substring(path.lastIndexOf('/')+1);

Ответ 8

У меня возникли проблемы с указанным выше кодом при извлечении имени script, когда код вызова включен в .html файл. Поэтому я разработал это решение:

var scripts = document.getElementsByTagName( "script" ) ;
var currentScriptUrl = ( document.currentScript || scripts[scripts.length - 1] ).src ;
var scriptName = currentScriptUrl.length > 0 ? currentScriptUrl : scripts[scripts.length-1].baseURI.split( "/" ).pop() ; 

Ответ 9

Вы можете попробовать поставить это вверху вашего файла JavaScript:

window.myJSFilename = "";
window.onerror = function(message, url, line) {
    if (window.myJSFilename != "") return;
    window.myJSFilename =  url;
}
throw 1;

Убедитесь, что у вас есть только функции ниже этого. Переменная myJSFilename будет содержать полный путь к файлу JavaScript, имя файла может быть проанализировано из этого. Протестировано в IE11, но оно должно работать в другом месте.

Ответ 10

Что произойдет, если jQuery script не существует? Вы собираетесь выводить сообщение? Я думаю, это немного лучше для отладки, если что-то пойдет не так, но это не очень полезно для пользователей.

Я бы сказал, что просто создавайте страницы таким образом, чтобы этого происшествия не было, и в редком случае это произойдет, просто отпустите script.