Как я могу получить имя файла сценария из этого сценария? - PullRequest
35 голосов
/ 02 апреля 2009

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

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

var scriptName = ???

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

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

Ответы [ 11 ]

33 голосов
/ 02 апреля 2009
var scripts = document.getElementsByTagName('script');
var lastScript = scripts[scripts.length-1];
var scriptName = lastScript.src;
alert("loading: " + scriptName);

Протестировано в: FF 3.0.8, Chrome 1.0.154.53, IE6


См. Также: Как я могу ссылаться на тег сценария, который загрузил выполняемый в данный момент сценарий?

18 голосов
/ 06 ноября 2013

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

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, но отлично работает во всех других браузерах, на которых я тестировал.

11 голосов
/ 18 мая 2012

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

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

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

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

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

5 голосов
/ 24 апреля 2017

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

var abc = __filename.split(__dirname+"/").pop();
4 голосов
/ 09 сентября 2013

предложение Shog9 короче:

alert("loading: " + document.scripts[document.scripts.length-1].src);
3 голосов
/ 02 апреля 2009

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

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
}
2 голосов
/ 30 октября 2015

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

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

var fileName = path.substring(path.lastIndexOf('/')+1);
1 голос
/ 08 ноября 2016

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

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

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

1 голос
/ 28 ноября 2015

У меня были проблемы с приведенным выше кодом при извлечении имени сценария, когда вызывающий код включен в файл .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() ; 
0 голосов
/ 06 апреля 2018

Если вы не хотите использовать jQuery:

function getCurrentFile() {
    var filename = document.location.href;
    var tail = (filename.indexOf(".", (filename.indexOf(".org") + 1)) == -1) ? filename.length : filename.lastIndexOf(".");
    return (filename.lastIndexOf("/") >= (filename.length - 1)) ? (filename.substring(filename.substring(0, filename.length - 2).lastIndexOf("/") + 1, filename.lastIndexOf("/"))).toLowerCase() : (filename.substring(filename.lastIndexOf("/") + 1, tail)).toLowerCase();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...