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, хотя эту возможность я оставил на всякий случай.

laimas 25.01.2016 18:27

Можно же, если с привлечением JQ, и

$('script').each(function() {
    if(this.src && /pluiginname/i.test(this.src)) {
       var a = this.getAttribute('src').split('/'); //можно и полный url использовать this.src
       path = a.slice(0, a.length-1).join('/')+'/';   
    }
})

kosuha606 25.01.2016 18:38

да это здорово, но понять гораздо сложнее что происходит.:) Но это вопрос практики/опыта

laimas 25.01.2016 19:00

А что тут сложного. Вы для того чтобы узнать src скрипта тревожите JQ - $(scripts[i]).attr('src');, но это ведь можно получить и как this.getAttribute('src'), и сразу разбив его в массив. Если разбить по рег. выражению, одиночному слешу, то можно использовать непосредственно полный url, какая разница вам:

var a = this.src.split(/\/{1}/);


Найденные скрипты в теле страницы и не имеющие атрибута src вернут null, а значит сразу проверив истинность атрибута и есть ли в нем имя плагина, обработаем только нужный url, и да, надо после этого прервать цикл:

$('script').each(function() { //если использовать селектор 'script[src]', то проверку this.src из условия можно убрать 
    if(this.src && /pluigin_name/i.test(this.src)) {
       var a = this.src.split(/\/{1}/); 
       path = a.slice(0, a.length-1).join('/')+'/'; //соединили элементы массива, как его срез без последнего элемента, в строку через слеш
       return false;   
    }
})


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

Если вообще не дергать JQ для этой операции ($('script').each(function()...), то querySelectorAll().

PS. Не обязательно разбивать url в массив, можно взять только часть строки от начала до позиции последнего найденного слеша.

PPS. Ну еще "из непонятного", хотя это не так: :)

var path = document.querySelector("script[src*=pluigin_name]").src;
path = path.slice(0, path.lastIndexOf('/')+1)


Только в этом случае нужно учитывать регистр в имени каталога плагина


Часовой пояс GMT +3, время: 19:16.