25.01.2016, 14:33
|
Интересующийся
|
|
Регистрация: 30.08.2015
Сообщений: 12
|
|
Получить путь к выполняемому сценарию JS jQuery
Здравствуйте, кто-нибудь может подсказать как получить абсолютный путь к скрипту JS, внутри этого же скрипта?
Я столкнулся вот с такой проблемой
var lang = 'ru';
var resJSON = [];
$.getJSON('lang/'+lang+'.json',function(data) {
resJSON = data;
});
В этом коде я хочу получить настройки из JSON файла, чтобы настроить плагин, точнее сделать локализацию. Но как я понимаю getJSON работает только с абсолютными url адресами, а я не могу заранее знать в какой дирректории будет размещен плагин. Вот я и подумал, что эту проблему можно решить если получить абсолютный путь к текущему выполняемому скрипту, или есть другие способы???
|
|
25.01.2016, 15:11
|
Интересующийся
|
|
Регистрация: 30.08.2015
Сообщений: 12
|
|
Погуглил поискал, видимо эта проблема никак не решается средствами JS, даже в reuireJS, нужно укзаывать baseUrl, так и я могу сделать, просто заставить клиента указать где лежит плагин...
|
|
25.01.2016, 15:20
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от kosuha606
|
Но как я понимаю getJSON работает только с абсолютными url адресами
|
Адрес не может быть относительным или абсолютным, а путь может быть, и для Ajax запроса можно указывать как абсолютные пути, так и относительные, имея ввиду относительно корня документов или текущей страницы (исполняемого файла).
Вряд ли потребуется постоянно изменять папку плагина, а значит и проблемы не должно существовать. Но если все таки потребуется изменение структуры каталогов на сайте, то данную задачу нужно решать средствами сервера, и для этого пути хранят в виде переменных подставляемых везде где указывается путь. Тогда не потребуется делать изменений во всех скриптах, файлах, а только изменить значение переменных при изменении структуры каталогов.
Последний раз редактировалось laimas, 25.01.2016 в 15:26.
|
|
25.01.2016, 15:35
|
Интересующийся
|
|
Регистрация: 30.08.2015
Сообщений: 12
|
|
Да, конечно можно использовать переменные, и я так и сделал сейчас, именно клиент при вызове плагина задает параметр baseUrl, при конфигурации плагина.
Мне казалось, что при локализации datepicker, этот плагин подгружает локализацию но я покапался в его коде и понял, что локализация ему передается в виде объекта через метод setDefaults, и потом смешивается с текущей конфигурацией плагина, можно и так сделать локализацию.
|
|
25.01.2016, 16:14
|
Интересующийся
|
|
Регистрация: 30.08.2015
Сообщений: 12
|
|
Сделал метод, который устанавливает текущий язык плагина, и в этом методе можно передать базовый путь для загрузки языковых файлов в формате JSON, вроде бы выглядит не плохо
jQuery(document).formFilter.setLang({
lang: "ru",
baseUrl: '/lpu/js/formFilterPlugin/'
});
Это мой, практически, первый плагин jQuery, поэтому возникают вопросы, этот плагин фильтрует данные в форме, закрывает кнопку отправки, выдает сообщения, ну в общем обычный плагин проверки формы.
Вот как пример http://atcoding.ru/lpu/
|
|
25.01.2016, 16:29
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от kosuha606
|
baseUrl: '/lpu/js/formFilterPlugin/'
|
Это относительный путь, и если "не знать каким он будет", то изменение каталога на сервере потребует изменение пути и в методе, то есть переписать руками. Если же плагин положен в произвольный каталог, а его ресурсы в каталогах этого каталога и их имена не изменяются, то можно и на клиенте найти папку расположения каталога из текущего url, ну и соответственно каталоги ресурсов.
|
|
25.01.2016, 16:41
|
Интересующийся
|
|
Регистрация: 30.08.2015
Сообщений: 12
|
|
Сообщение от laimas
|
Это относительный путь
|
Если честно, я может немного подзабыл, но если путь начинается со / - то он будет от корневой дирректории сайта начинаться, то есть это абсолютный путь, хотя конечно я могу и ошибаться.
Когда я говорил об изменении пути к плагину, я говорил о том что на разных сайтах, этот плагин может попасть в разные дирректории, но указание baseUrl, решает эту проблему. Кончено в рамках одного сайта никто не станет менять расположение плагина.
Сообщение от laimas
|
и на клиенте найти папку расположения каталога из текущего url
|
А вот это можно немного пояснить, по поводу текущего url.
Извиняюсь если я немного затупливаю!
|
|
25.01.2016, 16:59
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
/ - да, это от корня, и указание src="/path/file.ext", это как раз относительный путь от корня документов сайта. Иногда нужен и абсолютный путь, и он будет возвращен как src="X:/path/file.ext", где Х имя диска и т.д. Данный путь в url не подставляется, а будет использован полный путь - протокол/домен/имя файла. Это и есть понятие "абсолютного url". Но браузер в любом случае будет обращаться по абсолютному url, даже есть путь указан относительный, протокол/домен браузером будет подставляться автоматически. То есть по сути "относительный url" понятие тоже чисто относительное на клиенте, в отличие от сервера оперирующего и тем, и другим понятием.
А как узнать из текущего url, это получить src скрипта. Зная имя каталога плагина (если оно может изменяется, то должно быть в конфигурациях, вот тут и удобны переменные), а каталоги его ресурсов, это содержимое каталога плагина, не сложно получить из src путь, достаточно отбросить имя файла скрипта из него, а оно последнее в пути, и подставить каталог ресурсов.
Последний раз редактировалось laimas, 25.01.2016 в 18:08.
|
|
25.01.2016, 17:06
|
Интересующийся
|
|
Регистрация: 30.08.2015
Сообщений: 12
|
|
Да я Вас понял, спасибо. Я как то и не подумал о том, что можно просто перебрать подключенные скрипты и получить оттуда путь, как раз то что нужно!
|
|
25.01.2016, 17:49
|
Интересующийся
|
|
Регистрация: 30.08.2015
Сообщений: 12
|
|
В результате у меня появилась вот такая функция
function buildScriptPath()
{
var pluginNameRe = /formFilterPlugin/;
var scripts = document.scripts;
var pathname = window.location.pathname;
var pluginSrc = null;
for(var i=0;i<scripts.length;i++)
{
var src = $(scripts[i]).attr('src');
if(typeof(src)!=='undefined') {
if(pluginNameRe.test(src)) {
pluginSrc = src;
}
}
}
var splitted = pluginSrc.split('/');
var path = pathname;
// Не учитываем последнее значение
for(var j=0;j<splitted.length-1;j++) {
path += splitted[j]+'/';
}
return path;
}
И в вызове клиент теперь может не указывать baseUrl, хотя эту возможность я оставил на всякий случай.
|
|
|
|