Получить путь к выполняемому сценарию JS jQuery
Здравствуйте, кто-нибудь может подсказать как получить абсолютный путь к скрипту JS, внутри этого же скрипта?
Я столкнулся вот с такой проблемой var lang = 'ru'; var resJSON = []; $.getJSON('lang/'+lang+'.json',function(data) { resJSON = data; }); В этом коде я хочу получить настройки из JSON файла, чтобы настроить плагин, точнее сделать локализацию. Но как я понимаю getJSON работает только с абсолютными url адресами, а я не могу заранее знать в какой дирректории будет размещен плагин. Вот я и подумал, что эту проблему можно решить если получить абсолютный путь к текущему выполняемому скрипту, или есть другие способы??? |
Погуглил поискал, видимо эта проблема никак не решается средствами JS, даже в reuireJS, нужно укзаывать baseUrl, так и я могу сделать, просто заставить клиента указать где лежит плагин...
|
Цитата:
Вряд ли потребуется постоянно изменять папку плагина, а значит и проблемы не должно существовать. Но если все таки потребуется изменение структуры каталогов на сайте, то данную задачу нужно решать средствами сервера, и для этого пути хранят в виде переменных подставляемых везде где указывается путь. Тогда не потребуется делать изменений во всех скриптах, файлах, а только изменить значение переменных при изменении структуры каталогов. |
Да, конечно можно использовать переменные, и я так и сделал сейчас, именно клиент при вызове плагина задает параметр baseUrl, при конфигурации плагина.
Мне казалось, что при локализации datepicker, этот плагин подгружает локализацию но я покапался в его коде и понял, что локализация ему передается в виде объекта через метод setDefaults, и потом смешивается с текущей конфигурацией плагина, можно и так сделать локализацию. |
Сделал метод, который устанавливает текущий язык плагина, и в этом методе можно передать базовый путь для загрузки языковых файлов в формате JSON, вроде бы выглядит не плохо
jQuery(document).formFilter.setLang({ lang: "ru", baseUrl: '/lpu/js/formFilterPlugin/' }); Это мой, практически, первый плагин jQuery, поэтому возникают вопросы, этот плагин фильтрует данные в форме, закрывает кнопку отправки, выдает сообщения, ну в общем обычный плагин проверки формы. Вот как пример http://atcoding.ru/lpu/ |
Цитата:
|
Цитата:
Когда я говорил об изменении пути к плагину, я говорил о том что на разных сайтах, этот плагин может попасть в разные дирректории, но указание baseUrl, решает эту проблему. Кончено в рамках одного сайта никто не станет менять расположение плагина. Цитата:
Извиняюсь если я немного затупливаю!:) |
/ - да, это от корня, и указание src="/path/file.ext", это как раз относительный путь от корня документов сайта. Иногда нужен и абсолютный путь, и он будет возвращен как src="X:/path/file.ext", где Х имя диска и т.д. Данный путь в url не подставляется, а будет использован полный путь - протокол/домен/имя файла. Это и есть понятие "абсолютного url". Но браузер в любом случае будет обращаться по абсолютному url, даже есть путь указан относительный, протокол/домен браузером будет подставляться автоматически. То есть по сути "относительный url" понятие тоже чисто относительное на клиенте, в отличие от сервера оперирующего и тем, и другим понятием.
А как узнать из текущего url, это получить src скрипта. Зная имя каталога плагина (если оно может изменяется, то должно быть в конфигурациях, вот тут и удобны переменные), а каталоги его ресурсов, это содержимое каталога плагина, не сложно получить из src путь, достаточно отбросить имя файла скрипта из него, а оно последнее в пути, и подставить каталог ресурсов. |
Да я Вас понял, спасибо. Я как то и не подумал о том, что можно просто перебрать подключенные скрипты и получить оттуда путь, как раз то что нужно!
|
В результате у меня появилась вот такая функция
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, хотя эту возможность я оставил на всякий случай. |
Часовой пояс GMT +3, время: 14:26. |