Ответ 1
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
Я уверен, что ответ отрицательный, но думал, что я все равно спрошу.
Если мой сайт ссылается на сценарий под названием "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.");
}
Вероятно, больше проблем, чем это стоит для проверки зависимостей, но какого черта.
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
Я знаю, что это старо, но я разработал лучшее решение, потому что все вышеперечисленное не работает для сценариев 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, но отлично работает в каждом другом браузере, на котором я тестировал.
Вы можете использовать...
var scripts = document.getElementsByTagName("script"),
currentScriptUrl = (document.currentScript || scripts[scripts.length - 1]).src;
currentScript()
поддерживается всеми браузерами, кроме IE.
Убедитесь, что он запущен, когда файл анализируется и выполняется, а не в режиме готовности DOM или window
.
Если это пустая строка, ваш блок script
не имеет или пустой атрибут src
.
Вы можете вернуть список элементов 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
}
Я оставлю это здесь на всякий случай:
var abc = __filename.split(__dirname+"/").pop();
Предложение Shog9 более короткое:
alert("loading: " + document.scripts[document.scripts.length-1].src);
Поскольку атрибут src содержит полный путь к файлу script, вы можете добавить вызов подстроки, чтобы получить только имя файла.
var path = document.scripts[document.scripts.length-1].src;
var fileName = path.substring(path.lastIndexOf('/')+1);
У меня возникли проблемы с указанным выше кодом при извлечении имени 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() ;
Вы можете попробовать поставить это вверху вашего файла JavaScript:
window.myJSFilename = "";
window.onerror = function(message, url, line) {
if (window.myJSFilename != "") return;
window.myJSFilename = url;
}
throw 1;
Убедитесь, что у вас есть только функции ниже этого. Переменная myJSFilename будет содержать полный путь к файлу JavaScript, имя файла может быть проанализировано из этого. Протестировано в IE11, но оно должно работать в другом месте.
Что произойдет, если jQuery script не существует? Вы собираетесь выводить сообщение? Я думаю, это немного лучше для отладки, если что-то пойдет не так, но это не очень полезно для пользователей.
Я бы сказал, что просто создавайте страницы таким образом, чтобы этого происшествия не было, и в редком случае это произойдет, просто отпустите script.