Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Получить путь к выполняемому сценарию JS jQuery (https://javascript.ru/forum/misc/60882-poluchit-put-k-vypolnyaemomu-scenariyu-js-jquery.html)

kosuha606 25.01.2016 14:33

Получить путь к выполняемому сценарию JS jQuery
 
Здравствуйте, кто-нибудь может подсказать как получить абсолютный путь к скрипту JS, внутри этого же скрипта?

Я столкнулся вот с такой проблемой
var lang = 'ru';
var resJSON = [];

$.getJSON('lang/'+lang+'.json',function(data) {
   resJSON = data;
});

В этом коде я хочу получить настройки из JSON файла, чтобы настроить плагин, точнее сделать локализацию. Но как я понимаю getJSON работает только с абсолютными url адресами, а я не могу заранее знать в какой дирректории будет размещен плагин. Вот я и подумал, что эту проблему можно решить если получить абсолютный путь к текущему выполняемому скрипту, или есть другие способы???

kosuha606 25.01.2016 15:11

Погуглил поискал, видимо эта проблема никак не решается средствами JS, даже в reuireJS, нужно укзаывать baseUrl, так и я могу сделать, просто заставить клиента указать где лежит плагин...

laimas 25.01.2016 15:20

Цитата:

Сообщение от kosuha606
Но как я понимаю getJSON работает только с абсолютными url адресами

Адрес не может быть относительным или абсолютным, а путь может быть, и для Ajax запроса можно указывать как абсолютные пути, так и относительные, имея ввиду относительно корня документов или текущей страницы (исполняемого файла).

Вряд ли потребуется постоянно изменять папку плагина, а значит и проблемы не должно существовать. Но если все таки потребуется изменение структуры каталогов на сайте, то данную задачу нужно решать средствами сервера, и для этого пути хранят в виде переменных подставляемых везде где указывается путь. Тогда не потребуется делать изменений во всех скриптах, файлах, а только изменить значение переменных при изменении структуры каталогов.

kosuha606 25.01.2016 15:35

Да, конечно можно использовать переменные, и я так и сделал сейчас, именно клиент при вызове плагина задает параметр baseUrl, при конфигурации плагина.

Мне казалось, что при локализации datepicker, этот плагин подгружает локализацию но я покапался в его коде и понял, что локализация ему передается в виде объекта через метод setDefaults, и потом смешивается с текущей конфигурацией плагина, можно и так сделать локализацию.

kosuha606 25.01.2016 16:14

Сделал метод, который устанавливает текущий язык плагина, и в этом методе можно передать базовый путь для загрузки языковых файлов в формате JSON, вроде бы выглядит не плохо
jQuery(document).formFilter.setLang({
                lang: "ru",
                baseUrl: '/lpu/js/formFilterPlugin/'
            });

Это мой, практически, первый плагин jQuery, поэтому возникают вопросы, этот плагин фильтрует данные в форме, закрывает кнопку отправки, выдает сообщения, ну в общем обычный плагин проверки формы.

Вот как пример http://atcoding.ru/lpu/

laimas 25.01.2016 16:29

Цитата:

Сообщение от kosuha606
baseUrl: '/lpu/js/formFilterPlugin/'

Это относительный путь, и если "не знать каким он будет", то изменение каталога на сервере потребует изменение пути и в методе, то есть переписать руками. Если же плагин положен в произвольный каталог, а его ресурсы в каталогах этого каталога и их имена не изменяются, то можно и на клиенте найти папку расположения каталога из текущего url, ну и соответственно каталоги ресурсов.

kosuha606 25.01.2016 16:41

Цитата:

Сообщение от laimas
Это относительный путь

Если честно, я может немного подзабыл, но если путь начинается со / - то он будет от корневой дирректории сайта начинаться, то есть это абсолютный путь, хотя конечно я могу и ошибаться.

Когда я говорил об изменении пути к плагину, я говорил о том что на разных сайтах, этот плагин может попасть в разные дирректории, но указание baseUrl, решает эту проблему. Кончено в рамках одного сайта никто не станет менять расположение плагина.

Цитата:

Сообщение от laimas
и на клиенте найти папку расположения каталога из текущего url

А вот это можно немного пояснить, по поводу текущего url.
Извиняюсь если я немного затупливаю!:)

laimas 25.01.2016 16:59

/ - да, это от корня, и указание src="/path/file.ext", это как раз относительный путь от корня документов сайта. Иногда нужен и абсолютный путь, и он будет возвращен как src="X:/path/file.ext", где Х имя диска и т.д. Данный путь в url не подставляется, а будет использован полный путь - протокол/домен/имя файла. Это и есть понятие "абсолютного url". Но браузер в любом случае будет обращаться по абсолютному url, даже есть путь указан относительный, протокол/домен браузером будет подставляться автоматически. То есть по сути "относительный url" понятие тоже чисто относительное на клиенте, в отличие от сервера оперирующего и тем, и другим понятием.

А как узнать из текущего url, это получить src скрипта. Зная имя каталога плагина (если оно может изменяется, то должно быть в конфигурациях, вот тут и удобны переменные), а каталоги его ресурсов, это содержимое каталога плагина, не сложно получить из src путь, достаточно отбросить имя файла скрипта из него, а оно последнее в пути, и подставить каталог ресурсов.

kosuha606 25.01.2016 17:06

Да я Вас понял, спасибо. Я как то и не подумал о том, что можно просто перебрать подключенные скрипты и получить оттуда путь, как раз то что нужно!

kosuha606 25.01.2016 17:49

В результате у меня появилась вот такая функция
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.