Проверить, подключен ли скрипт

  • 27 Ответов
  • 2122 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

AlekVolsk

  • ********
  • 6301
  • 336
уже обсуждалось, знаю, но не смог найти топик.
В разработке несколько модулей, где будет подключаться скрипт, используемый во всех этих модулях. Если подключать скрипт во всех модулях, будет конфликт.
Как проверить, подключался ли данный скрипт уже или нет?

*

SmokerMan

  • ********
  • 5329
  • 689
Re: Проверить, подключен ли скрипт
« Ответ #1 : 01.09.2014, 22:12:47 »
можно подключить через
Код
JFactory::getDocument()->addScript($url)
тогда он будет подключаться один раз
или тупо через константу можно
Код
if (!defined('LOAD_SCRIPT')) {
    define('LOAD_SCRIPT', true);
    //подключаем скрипт
}

*

zomby6888

  • ******
  • 1484
  • 167
интернет-блог: http://websiteprog.ru

*

AlekVolsk

  • ********
  • 6301
  • 336
Re: Проверить, подключен ли скрипт
« Ответ #3 : 01.09.2014, 22:22:06 »
http://php.net/manual/ru/function.require-once.php
Это для php-скриптов, а у меня js

можно подключить через
Код
JFactory::getDocument()->addScript($url)
тогда он будет подключаться один раз
или тупо через константу можно
Код
if (!defined('LOAD_SCRIPT')) {
    define('LOAD_SCRIPT', true);
    //подключаем скрипт
}
addScript($url) в каждом модуле подключает несколько копий скрипта.
Про константы не догнал

*

SmokerMan

  • ********
  • 5329
  • 689
Re: Проверить, подключен ли скрипт
« Ответ #4 : 01.09.2014, 22:33:19 »
Про константы не догнал
что там догонять?
проверяем определена или нет константа
если не определена, то задаем ее и подключаем скрипт
если определена, то ничего не делаем

а по поводу addScript($url), то не должен он по идее подключать одинаковые файлы
« Последнее редактирование: 01.09.2014, 22:42:44 от SmokerMan »

*

AlekVolsk

  • ********
  • 6301
  • 336
Re: Проверить, подключен ли скрипт
« Ответ #5 : 01.09.2014, 23:16:32 »
Решил подключить 1 раз в шаблоне. Не самый верный вариант, но все модули под конкретный сайт с конкретным шаблоном, в частном случае прокатит.
Более универсализированное решение еще потестирую позже.


*

AlekVolsk

  • ********
  • 6301
  • 336
Re: Проверить, подключен ли скрипт
« Ответ #7 : 02.09.2014, 00:10:27 »
Вспомнил, что все подключенные скрипты находятся в JFactory::getDocument()->_scripts :
Спойлер
[свернуть]
По сути, просто проверить, включен ли скрип в массив, если нет - подключаем.
Вот только в массиве хранятся относительные или полные пути, а мне надо только имя файла проверить, in_array() сработает или полный перебор массива делать придется? или array_search()?

*

capricorn

  • *******
  • 1634
  • 106
Re: Проверить, подключен ли скрипт
« Ответ #8 : 02.09.2014, 00:30:13 »
как вы собираетесь проверить на стороне сервера, загрузку клиентского java скрипта? Извините, если я что-то не понял.

может вам использовать cookie для проверки загрузки?

*

zomby6888

  • ******
  • 1484
  • 167
Re: Проверить, подключен ли скрипт
« Ответ #9 : 02.09.2014, 00:35:02 »
Ну вобще проверять то надо ключи, поэтому вам эти функции не подойдут. А еще модули вроде бы испольняются после исполнения кода шаблона, так что если проверять подключение скрипта в шаблоне вполне возможно его там на тот момент еще не будет.
интернет-блог: http://websiteprog.ru

*

AlekVolsk

  • ********
  • 6301
  • 336
Re: Проверить, подключен ли скрипт
« Ответ #10 : 02.09.2014, 00:39:14 »
как вы собираетесь проверить на стороне сервера, загрузку клиентского java скрипта? Извините, если я что-то не понял.

может вам использовать cookie для проверки загрузки?
А откуда грузятся скрипты, если не с сервера? Выполняются они на стороне клиента, но их список формируется на сервере.

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

*

AlekVolsk

  • ********
  • 6301
  • 336
Re: Проверить, подключен ли скрипт
« Ответ #11 : 02.09.2014, 00:40:46 »
Уже проверил, что и in_arra() и array_search() не ищут по подстроке, а еще они не ищут в массиве массивов, что имеет место быть. Остается только прямой перебор.

*

Aleks.Denezh

  • *******
  • 2785
  • 376
Re: Проверить, подключен ли скрипт
« Ответ #12 : 02.09.2014, 00:59:57 »
Уже проверил, что и in_arra() и array_search() не ищут по подстроке, а еще они не ищут в массиве массивов, что имеет место быть. Остается только прямой перебор.
Вообще то есть поиск по ключам ещё... http://php.net//manual/ru/function.array-key-exists.php
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

capricorn

  • *******
  • 1634
  • 106
Re: Проверить, подключен ли скрипт
« Ответ #13 : 02.09.2014, 01:02:04 »
Цитировать
А откуда грузятся скрипты, если не с сервера? Выполняются они на стороне клиента, но их список формируется на сервере.

Да, но вам ничего не даст эта проверка на предмет загрузки скрипта клиенту.

Цитировать
Вот только в массиве хранятся относительные или полные пути, а мне надо только имя файла проверить

Вы только имя php скрипта можете проверить, который расположен на сервере, средствами php.

У вас задача какая-то странная. Посмотрите, как осуществляется загрузка скриптов разработчиками шаблонов. Вряд-ли у вас что-то новое.

Даже если вопрос как перебрать массив - у вас там что 100000 элементов? Вам не все равно как его перебрать7

*

AlekVolsk

  • ********
  • 6301
  • 336
Re: Проверить, подключен ли скрипт
« Ответ #14 : 02.09.2014, 01:12:46 »
isset($search_array['caption.js'])) - возвращает false, поскольку ищем только имя файла, а не весь путь.
array_key_exists('caption.js', $doc->_scripts) - тоже false.

*

Aleks.Denezh

  • *******
  • 2785
  • 376
Re: Проверить, подключен ли скрипт
« Ответ #15 : 02.09.2014, 01:14:21 »
У вас задача какая-то странная. Посмотрите, как осуществляется загрузка скриптов разработчиками шаблонов. Вряд-ли у вас что-то новое.
Ничего странного нет просто вы не поняли задачу..
могу вам объяснить на пальцах:
есть например два модуля mod_slider и mod_news, у каждого модуля в папке лежит скрипт например slider.js
в модуле mod_slider подрубаем скрип JFactory::getDocument()->addScript('/modules/mod_slider/slider.js')
и в модуле mod_news подрубаем скрип JFactory::getDocument()->addScript('/modules/mod_news/slider.js')

в итоге в <head> видим подключенный /modules/mod_slider/slider.js и /modules/mod_news/slider.js скрипты абсолютно одинаковы, и могут пойти косяки..

Единственный вариант в модуле при каждом подрублении скриптов сделать перебор массива и если там нет скрипт slider.js то подрубать...
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

Aleks.Denezh

  • *******
  • 2785
  • 376
Re: Проверить, подключен ли скрипт
« Ответ #16 : 02.09.2014, 01:15:48 »
isset($search_array['caption.js'])) - возвращает false, поскольку ищем только имя файла, а не весь путь.
array_key_exists('caption.js', $doc->_scripts) - тоже false.
Да ищет полный путь, нужно выполнить полный перебор всех ключей массива
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

AlekVolsk

  • ********
  • 6301
  • 336
Re: Проверить, подключен ли скрипт
« Ответ #17 : 02.09.2014, 01:18:36 »
Единственный вариант в модуле при каждом подрублении скриптов сделать перебор массива и если там нет скрипт slider.js то подрубать...
Вот в этом-то сейчас и проблема...

Да ищет полный путь, нужно выполнить полный перебор всех ключей массива
Не знаю, как. Пробовал различные варианты, не получилось.

*

capricorn

  • *******
  • 1634
  • 106
Re: Проверить, подключен ли скрипт
« Ответ #18 : 02.09.2014, 01:20:01 »
Вы идете по неправильному пути, как разработчик. На этом разговор предлагаю окончить.

Цитировать
у каждого модуля в папке лежит скрипт например slider.js

Это детский сад. Не смешно?
« Последнее редактирование: 02.09.2014, 01:23:57 от capricorn »

*

AlekVolsk

  • ********
  • 6301
  • 336
Re: Проверить, подключен ли скрипт
« Ответ #19 : 02.09.2014, 01:21:51 »
Код: php
function IsInArray($array, $findme) {
  foreach ($array as $key=>$value) {
    print_r($value.'<br />');
    if (strpos($value, $findme)!= false) return true;
  }
  return false;
}
print_r выводит только 7 строчек Array и все

*

Aleks.Denezh

  • *******
  • 2785
  • 376
Re: Проверить, подключен ли скрипт
« Ответ #20 : 02.09.2014, 01:34:18 »
Это детский сад. Не смешно?
Простите но вы ведете себя точно как в детском саду, очень часто есть случаи что в нескольких модулях используется одинаковый абсолютно скрипт, делать перелинковку из одного модуля в другой не вариант, ибо в любой момент пользователь может удалить неиспользуемый модуль!
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

Aleks.Denezh

  • *******
  • 2785
  • 376
Re: Проверить, подключен ли скрипт
« Ответ #21 : 02.09.2014, 01:34:56 »
Код: php
function IsInArray($array, $findme) {
  foreach ($array as $key=>$value) {
    print_r($value.'<br />');
    if (strpos($value, $findme)!= false) return true;
  }
  return false;
}
if (strpos($key, $findme)!= false) return true;

Код: php
function checkInArray( $checkKey )
{
$script = JFactory::getDocument()->_scripts;
foreach ( $script as $key => $script ) {
if ( strpos( $key, $checkKey )!== false ) return true;
}
return false;
}

var_dump( checkInArray( 'jquery' ) );
« Последнее редактирование: 02.09.2014, 01:42:24 от Istaan »
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

AlekVolsk

  • ********
  • 6301
  • 336
Re: Проверить, подключен ли скрипт
« Ответ #22 : 02.09.2014, 01:42:36 »
if (strpos($key, $findme)!= false) return true;
Блин, я их постоянно местами путаю, $key и $value :) Работает:
Код: php
function IsInArray($array, $findme) {
  foreach ($array as $key=>$value) {
    if (strpos($key, $findme)!= false) return true;
  }
  return false;
}

$scriptname = 'script.js';
if (!IsInArray($doc->_scripts, $scriptname))
  $doc->addScript('/media/'.$module_name.'/js/'.$scriptname);
Решено.

*

Aleks.Denezh

  • *******
  • 2785
  • 376
Re: Проверить, подключен ли скрипт
« Ответ #23 : 02.09.2014, 01:48:59 »
Решено.
Я бы сделал так:
Код: php
function appendScript( $scriptPath )
{
$scripts = JFactory::getDocument()->_scripts;
foreach ( $scripts as $key => $script ) {
if ( strpos( $key, basename( $scriptPath ) )!== false ) return;
}
JFactory::getDocument()->addScript( $scriptPath );
}

appendScript( '/test/my_script.js' );
appendScript( '/tes3t/my_script.js' );
appendScript( '/test/my_script.js' );
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

AlekVolsk

  • ********
  • 6301
  • 336
Re: Проверить, подключен ли скрипт
« Ответ #24 : 02.09.2014, 01:57:00 »
Можно и так, эффективно, когда много скриптов, но когда проверки требует всего 1, делать проверку на все уже не эффективно, имхо. Да, ничего не значащие ms, но все же.
Вообще у меня встал вопрос с подключением jquery.validate.min.js, модули грузятся через {loadmodule ... } в материалах и их от 2 до 5, и все - заказы различные... Бред, но шеф сказал: надо! вот и [далее межнациональная емкая лексика].

*

Fedor Vlasenko

  • ********
  • 3800
  • 698
  • Все начинается с Value
Re: Проверить, подключен ли скрипт
« Ответ #25 : 02.09.2014, 03:02:06 »
AlekVolsk, на самом то деле ничего страшного не произойдет если вы подключите скрипт еще раз. Он возьмется из кеша и перезагрузит функционал.
SmokerMan, вам предложил оптимальные решения.
Еще есть одно когда вы самим js проверяете наличие какой либо функции и ли переменной и при ее значении undefined загружаете скрипт
Пример
Код: javascript
    <script>
      if (typeof foo !== "function") {
        //if (window.perem ==  undefined){
        var script = document.createElement("script");
        script.src = 'http://code.jquery.com/jquery-1.9.1.js';
        document.head.appendChild(script);
      }
    </script>
Или воспользоватся библиотекой Js для автоматической подзагрузки скриптов
К  примеру моей. Попиарюсь  :laugh:
Js для автоматической загрузки CSS и js файлов. А также для подзагрузки чего либо в кеш.
С функцией кеширования.  http://jsfiddle.net/vlasenkofedor/5pDXf/

*

Aleks.Denezh

  • *******
  • 2785
  • 376
Re: Проверить, подключен ли скрипт
« Ответ #26 : 02.09.2014, 03:37:02 »
Можно и так, эффективно, когда много скриптов, но когда проверки требует всего 1, делать проверку на все уже не эффективно, имхо.
Вообще то это тоже самое что у вас, только меньше кода и универсальнее..
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

almika

  • ****
  • 269
  • 22
Re: Проверить, подключен ли скрипт
« Ответ #27 : 20.03.2015, 10:37:29 »
Добрый день!
Тоже встретилась с такой проблемой. Метод
Код
if (!defined('LOAD_SCRIPT')) {
    define('LOAD_SCRIPT', true);
    //подключаем скрипт
}
очень симпатичный, но вот такая проблема:
Размещаю несколько одинаковых модулей в несуществующие позиции, каждый опубликован, показывать - для всех меню.
Вывожу потом в нужной статье через loadposition нужные модули.
На другой странице, где не загружаю эти модули, они всё равно рендерятся, хотя и не отображаются (для проверки - error_log(defined('MYJS_LOADED'), 0); в helper.php модуля). А в том единственном модуле, который выводится в существующей позиции проверка defined даёт 1, и, соответственно, скрипты для него не грузятся.
Думаю, что и методы перебора такое же дадут.
Правильно работает, если задавать для модулей в несуществующих позициях только пункт меню, к которому статья привязана, но это не вариант, если кто-то другой будет использовать модуль.
Методы с динамической подгрузкой JS, насколько я понимаю, все грузят в head? Пока я в параметрах модуля позволяю указать - в head или в body.
Подскажите, как лучше сделать - оставить дубли скриптов или добавить параметр в модуль - типа "тонкая настройка для продвинутых", при котором будет запускаться анализ (как сейчас работает), а если что-то у пользователя не пойдёт, то он сможет просто выключить её и тогда будут дубли скриптов, или попробовать что-то ещё?
Прошу ваших советов.