JQuery, слайдер, Drupal.behaviors никак не подружатся.

Главные вкладки

Аватар пользователя olejonok olejonok 5 января 2016 в 1:06

Ситуация:
Слайдер и JQuery не могут подружиться.

Запускаем слайдер так:

 jQuery(window).load(function() {
    $(selector).iLightBox({
      skin: 'light'
    });
});

Работает слайдер, в админке JQuery тоже работает.
Дергаем на страничке AJAX.
После этого слайдер естественно уже не работает Smile

Хорошо. Засовываем слайдер в

(function ($) {
  Drupal.behaviors.MY_MODULE = {
     attach : function(context, settings) {
        $(selector).iLightBox({
            skin: 'light'
         });
      } // attach
   };
}) (jQuery);

Слайдер работает замечательно как ДО дерганья на страничке AJAX, так и после, сколько угодно раз.
JQuery отказывается работать. В Админке в связи с этим "траур" - никакие скрипты не работают Sad

Смотрим отладчик, видим, что он ругался:
TypeError: jQuery(...).iLightBox is not a function

О чем это говорит? Мы вызвали функцию ДО ее инициализации? А почему тогда слайдер работает?
Вообщем, я не догнал. Прошу помощи. Спасибо.

Лучший ответ

Аватар пользователя olejonok olejonok 5 января 2016 в 15:44

Применил ваш код.
Все заработало. Но слайдер показывает только ОДНУ картинку.
После загрузки страницы всем картинкам слайдера в HTMLе добавлен class = ilightbox-once-processed
Почему ONCE ? Знаю, скажете RTFM

(function ($) {
Drupal.behaviors.MY_MODULE = {
     attach : function(context, settings) {
                $(SELECTOR, context).once('ilightbox-once', function(){
                        $(this).iLightBox({
                                  skin: 'light',
                        });
               });
        } // attach
   };
}) (jQuery);

Комментарии

Аватар пользователя sas@drupal.org sas@drupal.org 5 января 2016 в 8:59

1 инетерсно люди пляшут - а где определение подружаете для .iLightBox прежде чем использовать ?
И я бы в аттаче изменил

$(selector, context).once('ilightbox-once', function(){
$(this).iLightBox ...
});
Аватар пользователя olejonok olejonok 5 января 2016 в 14:10

Как умеем так и пробуем плясать. Smile
> определение подружаете для .iLightBox прежде чем использовать
Где плагин загружается? Уже загружен своими скриптами и css. Или вы о чем говорите?

И почему именно на этот код вы бы изменили в аттаче? Прошу объяснить. В чем соль?
В чем причина неработы моего варианта?
Что неправильно?
Спасибо.

Аватар пользователя olejonok olejonok 5 января 2016 в 15:44

Применил ваш код.
Все заработало. Но слайдер показывает только ОДНУ картинку.
После загрузки страницы всем картинкам слайдера в HTMLе добавлен class = ilightbox-once-processed
Почему ONCE ? Знаю, скажете RTFM

(function ($) {
Drupal.behaviors.MY_MODULE = {
     attach : function(context, settings) {
                $(SELECTOR, context).once('ilightbox-once', function(){
                        $(this).iLightBox({
                                  skin: 'light',
                        });
               });
        } // attach
   };
}) (jQuery);
Аватар пользователя olejonok olejonok 5 января 2016 в 15:43

Интересное наблюдение (вынужден экспериментировать):

если данный участок кода
    $(this).iLightBox(
заменить на
    $(SELECTOR).iLightBox(

то все картинки в селекторе показываются как надо. Только они выводятся поверх аналогичного слайдера (назовем его теневым), который находится в слое как бы за текущим слайдером.
При выходе из слайдера, теневой слайдер тоже закрывается.
Во всем остальном все работает и ДО дерганья AJAX и ПОСЛЕ.

Аватар пользователя olejonok olejonok 5 января 2016 в 16:15

Эксперимент завершился удачей.
Заработало все как надо.
Но в чем причина я так и не понял.
Объясните пожалуйста, чтобы темноты у меня стало меньше. Мы же все стремимся к свету Smile

Вот это рабочий код.
Объясните пожалуйста его. Можно ли его оптимизировать? Как?

(function ($) {
  Drupal.behaviors.MY_MODULE = {
        attach : function(context, settings) {
                $('ul#infinite_scroll', context).once('ilightbox-once', function(){
                        $('ul#infinite_scroll li a').iLightBox({
                          skin: 'light',                               
                        });
                });
        } // attach
  };
}) (jQuery);
Аватар пользователя sas@drupal.org sas@drupal.org 6 января 2016 в 8:30

Скорее всего дело в специфики функционароания .iLightBox судя по последнему коду ему нужен "ul#infinite_scroll li" тогда логично переписать

 ...
$('ul#infinite_scroll li a', context).once('ilightbox-once', function(){
                       var thisEl = $(this);
                        thisEl.iLightBox({
                          skin: 'light',                              
                        });
                });
...

Но ul#infinite_scroll хреновый селектор для ajax - так как может стать не уникальным, надо бы использовать class

Аватар пользователя olejonok olejonok 6 января 2016 в 9:15

Не работает данный код, точнее работает но на 50%.
Он показывает только одну картинку в слайдере. Отсутствует лента маленьких preview'шек рядом и больших соседей. (образец работающего слайдера: http://ilightbox.net/infinite_scroll.html )

Аватар пользователя sas@drupal.org sas@drupal.org 7 января 2016 в 11:11

Надо разбираться с библиотекой - как работает и по примерам и демо смотреть, в друпале подключение стандартное, но селекторы зависят от логики.