Организовать загрузку JS по условию

Прошу помощи в организации загрузки js файлов по условию

#1 8 декабря 2012 в 12:45
Доброго времени суток.

Есть пара разных модулей которые для своей работы используют одинаковый js скрипт. например — jquery.capslide.js
В обычном режиме(без моих изменений) они грузят этот файл с разных урлов(т.к модули разные) = не приятно да и ПэйджСпид в ФаерБаге матерится.
Вынеся загрузку jquery.capslide.js в шаблон сайта = уже лучше, но имеем загрузку данного скрипта на всех страницах сайта, что тоже не радует.

На одном форуме подсмотрел такой скриптик:
  1.  
  2. <script type="text/javascript">
  3. if (typeof(jQuery) == 'undefined') {
  4. document.write('<scr' + 'ipt type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></scr' + 'ipt>');
  5. }
  6. </script>
  7.  
"Модуль для своей работы подгружает jquery.min.js если на странице ранее не подключен другой jQuery."

И теперь вопрос:
Как правильно записать if (typeof(jQuery) == 'undefined') {, чтобы определялось наличие в коде страницы загружен ранее или нет скрипт jquery.capslide.js ?

P.S. забыл прицепить сам скрипт jquery.capslide.js

  1.  
  2.  
  3. (function($) {
  4. $.fn.capslide = function(b) {
  5. var opts = $.extend({}, $.fn.capslide.defaults, b);
  6. return this.each(function() {
  7. $this = $(this);
  8. var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
  9.  
  10. if(!o.showcaption) $this.find('.ic_caption').css('display','none');
  11. else $this.find('.ic_text').css('display','none');
  12.  
  13. var _img = $this.find('img:first');
  14. var w = _img.css('width');
  15. var h = _img.css('height');
  16. $('.ic_caption',$this).css({'color':o.caption_color,'background-color':o.caption_bgcolor,'bottom':'0px','width':w});
  17. $('.overlay',$this).css('background-color',o.overlay_bgcolor);
  18. $this.css({'width':w , 'height':h, 'border':o.border});
  19. $this.hover(
  20. function () {
  21. if((navigator.appVersion).indexOf('MSIE 7.0') > 0)
  22. $('.overlay',$(this)).show();
  23. else
  24. $('.overlay',$(this)).fadeIn();
  25. if(!o.showcaption)
  26. $(this).find('.ic_caption').slideDown(500);
  27. else
  28. $('.ic_text',$(this)).slideDown(500);
  29. },
  30. function () {
  31. if((navigator.appVersion).indexOf('MSIE 7.0') > 0)
  32. $('.overlay',$(this)).hide();
  33. else
  34. $('.overlay',$(this)).fadeOut();
  35. if(!o.showcaption)
  36. $(this).find('.ic_caption').slideUp(200);
  37. else
  38. $('.ic_text',$(this)).slideUp(200);
  39. }
  40. );
  41. });
  42. };
  43. $.fn.capslide.defaults = {
  44. caption_color : 'white',
  45. caption_bgcolor : 'black',
  46. overlay_bgcolor : 'blue',
  47. border : '1px solid #fff',
  48. showcaption : true
  49. };
  50. })(jQuery);
  51.  
  52.  
#2 8 декабря 2012 в 13:17

В обычном режиме они грузят этот файл с разных урлов

А не проще ли просто адрес одинаковый прописать?..
#3 8 декабря 2012 в 13:39


А не проще ли просто адрес одинаковый прописать?...

Pasha

Ставил. Но всё равно подгрузка происходит дважды.

поэтому и хочу в модулях прописать условие — скрипт уже загружен следовательно повторно не загружаем
#4 8 декабря 2012 в 13:55
Понятно. Тогда так и пишите:
  1. <script type="text/javascript">
  2. if (typeof(как там функция называется, capslide?) == 'undefined') {
  3. document.write('<script type="text/javascript" src="Путь к скрипту"></script>');
  4. }
  5. </script>
#5 8 декабря 2012 в 14:57
Если я правильно понял, из кода под спойлером, то функция называется $.fn.capslide
сейчас попробую так:
  1.  
  2. <script type="text/javascript">
  3. if (typeof(fn.capslide) == 'undefined') {
  4. document.write('<script type="text/javascript" src="Путь к скрипту"></script>');
  5. }
  6. </script>
  7.  
#6 8 декабря 2012 в 15:40
работает такое условие
  1.  
  2. <script type="text/javascript">
  3. if (typeof(capslide) == 'undefined') {
  4. document.write('<scr' + 'ipt src="/templates/шаблон/js/jquery.capslide.js" type="text/javascript"></scr' + 'ipt>');
  5. }
  6. </script>
  7.  
но работает не в полном объёме. Все равно подгружает файл несколько раз.

Как запретить повторную загрузку файла????
#7 8 декабря 2012 в 18:32
  1.  
  2. if (jQuery().pluginMethod) {
  3. // Делаем что-либо, если плагин загружен
  4. } else {
  5. // Плагин не загружен
  6. }
  7.  
либо же так:

  1.  
  2. if (jQuery.fn.pluginMethod) {
  3. // Делаем что-либо, если плагин загружен
  4. } else {
  5. // Плагин не загружен
  6. }
  7.  
#8 8 декабря 2012 в 21:01
У меня тоже возникал подобный вопрос и я для себя нашёл вот такое решение, думаю, что оно и тебе подойдёт:
1) Делаешь для этих самых модулей отдельную позицию показа, например topmodul, соответственно в файле positions.txt прописываешь эту позицию.

2)В самом верху файла temlate.php прописываешь условие равенства: $mod_count['topmodul'] = cmsCountModules('topmodul');

3) В разделе <head>, там где стоят яваскрипты, подключаешь этот самый скрипт и помещаешь его в конструкцию проверки позиции, таким вот образом:
<? if ($mod_count['topmodul']) {?><script language="JavaScript" type="text/javascript" src="/includes/jquery/upload/твой скрипт.js"></script><? } ?>

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

А вообще если подключишь скрипт чтобы он вызывался на всез страницах сайта, т.е. так как тебе не понравилось, то страшного ничего в этом не будет, это только лишь на долю секунды увеличет первую загрузку страницы с твоего сайта, а далее скрипт будет спокойно сидеть в кэше браузера и ждать своего инициирования.
#9 9 декабря 2012 в 01:21
Все проще, в шаблоне модуля добавляйте скрипт через

  1. {add_js file="нужный_скрипт.js"}
И сам движок будет следить за уникальностью и подключит его только один раз. И не надо достраивать какие-либо проверки и тому подобное…
#10 9 декабря 2012 в 09:51

Все проще, в шаблоне модуля добавляйте скрипт через

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

smile
#11 9 декабря 2012 в 10:59
  1.  
  2. <script type="text/javascript">
  3. jQuery(function($){
  4.  
  5. $('.bar2').mosaic({
  6. animation : 'slide' //fade or slide
  7. });
  8. });
  9.  
  10. </script>
  11.  
Мне вот тоже нужно в шапку сайта этот код добавить, но работать он будет только в разделе фото есть ли для него какие нибудь решения?
#12 9 декабря 2012 в 11:41

Мне вот тоже нужно в шапку сайта этот код добавить, но работать он будет только в разделе фото есть ли для него какие нибудь решения?

Gorec

Если тебе нужно, чтобы этот скрипт срабатывал только в разделе фото, то и пропиши его во всех tpl-ках компонента фото альбома, или только тех TPL-ках, где он нужен, конечно заключив эту конструкцию в теги {literal} {/literal}
#13 9 декабря 2012 в 11:44

Мне вот тоже нужно в шапку сайта этот код добавить, но работать он будет только в разделе фото есть ли для него какие нибудь решения?

Moloh88-project
Особой разницы нет, в каком месте подсоединён внешний js или прописан внутренний, и совсем не обязательно чтобы это была шапка сайта.
Многие вообще рекомендуют js подключать перед закрывающим тегом </body>. Встраивай скрипт слайдера в шаблон фотогаллереи и не парься
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.