Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Определить js-файл, из которого запущен код (https://javascript.ru/forum/events/52554-opredelit-js-fajjl-iz-kotorogo-zapushhen-kod.html)

rygoravich 24.12.2014 02:44

Определить js-файл, из которого запущен код
 
Вроде бы простой вопрос, но гуглеж, увы, ничего не дал... В общем, как определить, в каком из загруженных файлов находится выполняемый код?

Поясню на своей задаче: имеются файлы, скажем, 1.js и 1.css, лежат в одной папке, скажем, /subfolder/1/. Цель - подгружать из html только 1.js, чтобы он автоматом загружал 1.css (без прописывания 1.css в исходном html). Проблема в следующем: часть пути может в будущем меняться, скажем, эти файлы могут оказаться в /subfolder/subfolder2/1/. Если прописать в js загрузку css по абсолютному пути (/subfolder/1/1.css), то после перемещения работать перестанет. Соответственно, надо каким-то образом из 1.js получить его расположение и из него вычленить папку, но как это сделать?

Прописывать css-файл в html очень не хочется - речь идет о cmf, где в самых разных местах может файл подгружаться, писать везде для двух файлов крайне нежелательно...

Буду очень благодарен за дельные советы.

danik.js 24.12.2014 06:39

Цитата:

Сообщение от rygoravich
писать везде для двух файлов крайне нежелательно

Да ладно? Это почему? Если не радуют задержки на лишний http-запрос стиля, то объединяй все стили в один файл.

BETEPAH 24.12.2014 08:57

Цитата:

Сообщение от rygoravich
Если прописать в js загрузку css по абсолютному пути

сами же ответили на свой вопрос. Прописывать относительный путь.

Deff 24.12.2014 13:23

Цитата:

Сообщение от rygoravich (Сообщение 348013)
Вроде бы простой вопрос, но гуглеж, увы, ничего не дал... В общем, как определить, в каком из загруженных файлов находится выполняемый код?

Поясню на своей задаче: имеются файлы, скажем, 1.js и 1.css, лежат в одной папке, скажем, /subfolder/1/. Цель - подгружать из html только 1.js, чтобы он автоматом загружал 1.css (без прописывания 1.css в исходном html). Проблема в следующем: часть пути может в будущем меняться, скажем, эти файлы могут оказаться в /subfolder/subfolder2/1/. Если прописать в js загрузку css по абсолютному пути (/subfolder/1/1.css), то после перемещения работать перестанет. Соответственно, надо каким-то образом из 1.js получить его расположение и из него вычленить папку, но как это сделать?

Прописывать css-файл в html очень не хочется - речь идет о cmf, где в самых разных местах может файл подгружаться, писать везде для двух файлов крайне нежелательно...

Буду очень благодарен за дельные советы.

Выделить установку css в отдельную функцию, с прописанным уникальным атрибутом в теге style или link, дабы проверять нужна ли сама установка, или тег со стилем уже стоит, эту проверку делать в самой функции.

Тогда просто вызываете функцию в нужных вам скриптах

danik.js 24.12.2014 13:42

RequireJS вроде умеет css подгружать. Но я считаю не нужно этого делать. Юзай RequireJS для асинхронной загрузки и управлением зависимостями между модулями.

rygoravich 25.12.2014 02:42

Цитата:

Сообщение от danik.js (Сообщение 348018)
Да ладно? Это почему? Если не радуют задержки на лишний http-запрос стиля, то объединяй все стили в один файл.

Напротив - я как раз хочу максимально разделить css. Дело в том, что прописанные в целевом css стили понадобятся только на некоторых страницах, причем будут востребованы только незначительной долей посетителей - зачем включать их в общий файл? Насчет задержек - они не волнуют, все равно css кэшируется браузером, а запрос из js обслуживается уж никак не быстрее, чем сгенерированный браузером на основе тега style. Цель - именно избавится от необходимости прописывать этот тег. Фишка в том, что стили в этом css применяются исключительно для элементов, сгенерированных одним конкретным js, тогда зачем прописывать в html и script и link, если можно подгрузить css-файл из скрипта?

Цитата:

Сообщение от BETEPAH (Сообщение 348031)
сами же ответили на свой вопрос. Прописывать относительный путь.

Так относительный путь будет искать файл относительно не js-файла, а текущего документа... Предположим, есть файлы (путь от корня сайта) /cmf/js/plugin1/plugin.js и /cmf/js/plugin1/plugin.css. Можно загрузить css, указав путь /cmf/js/plugin1/plugin.css, однако на других проектах файлы могут лежать не в /cmf/js/plugin1/, а, например, в /engine/js/plugin1/ или в /other/core/js/plugin1/. А если мы укажем просто имя файла (поскольку он лежит в одной папке с js), то браузер будет считать, что путь указан относительно текущего html-документа и будет пытаться грузить его как /plugin.css или, например, /news/plugin.css - в зависимости от того, на какой странице находится пользователь.

Цитата:

Сообщение от Deff (Сообщение 348095)
Выделить установку css в отдельную функцию, с прописанным уникальным атрибутом в теге style или link, дабы проверять нужна ли сама установка, или тег со стилем уже стоит, эту проверку делать в самой функции.

Тогда просто вызываете функцию в нужных вам скриптах

Цель как раз в том, чтобы не прописывать этот css в html вообще - пусть он грузится только по инициативе js...

Цитата:

Сообщение от danik.js (Сообщение 348097)
RequireJS вроде умеет css подгружать. Но я считаю не нужно этого делать. Юзай RequireJS для асинхронной загрузки и управлением зависимостями между модулями.

Ну, просто подгружать стили и я умею, вот функция:

function addCss(path) {
	var el = document.createElement('link');
	el.rel = 'stylesheet';
	el.href = path;
	el.type = 'text/css';
	var head1 = document.getElementsByTagName('head');
	head1[0].appendChild(el);
}


Вопрос - как вычислить параметр, с которым ее вызывать, с учетом того, что css лежит в той же папке, что и js-файл, из которого она будет вызвана?

Т.е. в файле, например, /cmf/js/plugin1/plugin.js осуществляется вызов этой функции, нужно, чтобы js знал, по какому пути он лежит, чтобы потом на его основе вычислить путь к целевому css...

Неужели совсем нет никакого способа определить, откуда запущен конкретный код?

krasovsky 25.12.2014 10:17

Цитата:

Сообщение от rygoravich
1.js получить его расположение и из него вычленить папку, но как это сделать?

Никак. Хотя можешь конечно, задать класс или id этому срипту и из него же потом обратиться по этому селектору и получить src. Распарсить и вуаля.

Цитата:

Сообщение от rygoravich
Напротив - я как раз хочу максимально разделить css. Дело в том, что прописанные в целевом css стили понадобятся только на некоторых страницах,

использовать css препроцессоры lesscss\sass\stylus, там вся эта работа решена, отлажена и вылизана. lesscss можно подключить как библиотеку на клиенте, хотя это и не рекомендуется, но как я вижу ты не ищешь легких путей. Так что не проблема.
Тебе останется только разбивать свои стили на модули подцеплять куда надо объединять разъединять все че хошь.

danik.js 25.12.2014 14:49

Цитата:

Сообщение от krasovsky
Никак

Ну если скрипт синхронный (блокирующий), то во время исполнения он будет последним в коллекции document.scripts (ибо блокирует дальнейший парсинг).

danik.js 25.12.2014 14:50

Цитата:

Сообщение от rygoravich
Вопрос - как вычислить параметр

А разве requirejs не разруливает относительные пути? Ты же src к скриптам будежь через require() задавать, так что все элементарно.

vflash 25.12.2014 16:32

у FF вроде чтота было для этого. но у других не встречал.
на сколько вырастит css если собрать все в один файл ? может не так все критично?
Асинхронная загрузка ресурса тянет за собой свои проблемы. Вдруг не загрузиться скрипт(стиль), или будет слишком долго грузить. Хороший UI все эти ситуации должен отработать.


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