При використанні бібліотеки FullAjax можна зіткнутись з тим, що інші скрипти (наприклад LightBox) відмовляються працювати, або працюють не коректно. Причина з якої вони відмовляються працювати дуже проста – вони не зовсім розраховані на сумісну роботу з AJAX.

Як це можна поправити, опишу в декількох рядках нижче…

Основна причина (але не єдина) по якій деякі скрипти відмовляються працювати сумісно з AJAX – це те, що вони не “бачать” коли AJAX сторінка завантажена та готова до “використання”. Щоб це поправити потрібно самостійно їм вказувати, що сторінка “готова”.

Для цього, після завантаження AJAX сторінки потрібно повідомити скриптам, що сторінку оновлено.
Щоб визначити коли сторінка готова, можна скористатись подією “load” бібліотеки FullAJAX (приклад для Mootools fireEvent()):

FLAX.Html.onall('load', function(options){
	window.fireEvent('domready');
});

або функцією зворотного виклику:

function doSomethingAfterFAjxPagLoad (){
	window.fireEvent('domready');
};

Щоб ця функція спрацювала після завантаження AJAX сторінки, в базові налаштування бібліотеки FullAjax потрібно додати параметр onload:doSomethingAfterFAjxPagLoad .
Приклад :

FLAX.Filter.add({url:'/', id:fullAjaxId, onload:doSomethingAfterFAjxPagLoad}); 
...
function doSomethingAfterFAjxPagLoad (){
/* fix for mootools 'domready', uncomment if need*/
/*	window.fireEvent('domready');  */
};

При використанні window.fireEvent(‘domready’); потрібно бути обережним.
По перше це допомагає лише якщо скрипт дійсно не “бачить”, що сторінка “готова”.
По друге, при сумісному використанні з іншими скриптами які нормально працюють з AJAX – це може призвести, до додаткових не бажаних помилок, таких як подвійне виконання цього скрипта. Тому в плагіні ця функція за замовчуванням закоментована.

В деяких випадках потрібно використовувати window.fireEvent(‘load’); – все залежить від самого скрипта який “відмовляється” працювати.

Взагалі, якщо “неробочий” (наприклад LightBox) скрипт потрібен лише на певній сторінці, то вище вказану функцію краще виконувати саме на цій сторінці, а не на кожній. Це попередить виникнення додаткових помилок.
Приклад для сторінки “Галерея” ( mysite.com/galery ):

if(location.toString().indexOf('/galery') != -1){
	window.fireEvent('domready'); 
}

Далі буде, можливо… :)

91s коментарів to “ Проблеми при використанні LightBox та деяких інших скриптів ”

  1. Василь коментує:

    Привіт Федір! Чудовий плагін, гордий що ти з України. В мене при використанні плагіна виникли проблеми з темплейтами зробленими в Artisteer. Головна проблема – меню, яке не оновлюється, підскажи будь-ласка як правильно необхідно вбудовувати код в темплейт.

    • Fedik коментує:

      Привіт, з Artisteer-ом проблема так як він “городиться свій город”. Пробуй знайти місце де він виводить компонент в шаблоні, і помісти це місце в блок. Але не факт, що все буде працювати ;). Щось типу:

        echo '<div id="forajax">';
        if ($view->hasMessages())
          echo artxPost('<jdoc:include type="message" />');
        echo '<jdoc:include type="component" />';
        echo '</div>';
    • Fedik коментує:

      на рахунок меню, що саме не оновлюється?
      не визначається поточний активний елемент? чи щось інше

  2. Василь коментує:

    Так, не визначається поточний активний елемент меню.

    • Fedik коментує:

      якщо з налаштуванням “Меню CSS Class та/або ID” все гаразд, тоді потрібно дивитись в живу, так важко щось відповісти

    • Fedik коментує:

      для Artister спробуй відключи визначення поточного меню в налаштуваннях, та в розширені
      налаштування додай:

      FLAX.Html.onall('load', function(){
        var curUrl = (location.hash) ? 
      location.hash.replace('#ajx','').replace('?ax=ok','').replace('&ax=ok','') 
      : location.href.replace(fullAjaxBase,'');
        $$('.hmenu li').each(function(item){
            if(item.hasClass('current')){item.removeClass('current');};
       
      if(item.hasClass('active')){item.removeClass('active');item.getChildren().removeClass('active')};
           if(item.getChildren().get('href') == curUrl){item.addClass('current 
      active');item.getChildren().addClass('active')};
        });
      });
  3. Влад коментує:

    Спасибо за плагин но куча вопросов и проблем у меня возникло. 1) СВ не хочет работать не загружает дизайн самих профилей. 2) Не как не выходит сделать обновления модулей. Шаблон сделан на аристери. Если конкретно то не получается сделать модули в разных местах то есть на главной показывается а на форуме к примеру нет. 3) опять же модули – модуль последних сообщений форума кунена – когда нажимаешь на ссылку посмотреть тему – дублируется полностью сайт и накладывается друг на друга. 4) И подскажите Фёдор как отключить определенный модуль от воздействия аякс – только не позицию а модуль – спасибо

  4. Влад коментує:

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

    • Fedik коментує:

      если плохо знакоми з javascript то для форума лутше отключить fullajax, так как там свои заморочки с формами, редактором, своим аяксом …

      на счет СВ, если мне не изменяет память, там просто не работают таби .. нужна повторная инициализация, после загрузки через аякс…

      в артистер может бить следуующая проблема: для обновления позиций нужно чтоб блок всегда бил загружен … если, к примеру на домашней странице нет модуля а на остальних есть, то блок все равно должен бить, на домашней он будет пустой, на остальних заполнен через аякс …

      по 4) пункту, если имеется ввиду игнорировать ссылки в блоке, то можно попробовать фильтрами что в fullajax … посмотрите форум может чего интересного найдете ;) … правда он лежит через раз :(

  5. Влад коментує:

    Я вас понял – форум давно отключил, дело в модуле то есть этот модуль выводится на всех страницах сайта – но отображает последние темы форумы – на самом форуме не отображается модуль. но выводит ссылки с форума – и я думаю как исключить сам модуль из использования аякс

    • Fedik коментує:

      для блокировки ссилок в блоке можно как то так:

      FLAX.Filter.on('beforewrap', function(ops){
       var parent = ops.el.parentNode.parentNode.id;
       if(parent == 'SOME-ID'){
          return false;
       } 
      })

      только нужно знать сколько parentNode нужно :)

      на счет ссылки, если имеется ввиду #ajx то в старых браузерах никак, только сменить текст можно, смотрите в настройка … для новых браузеров пробуйте последнюю версию плагина

  6. hunt коментує:

    Anyone gotten this to work with Jomsocial? Fails to load calendar on some pages with error: Calendar.setup:
    Nothing to setup (no fields found). Please check your code

    • Fedik коментує:

      it problem of the calendar initialization, but it not possible fix without hacking of the calendar script

      • hunt коментує:

        Thought this may be the case. Tried hacking it but whatever I do seems to keep other scripts from working. Would be interested in any suggestions. Great work!

      • Fedik коментує:

        if I right remember, in the Calendar script need remove alert() that show this error, and initialize Calendar again after page loaded via AJAX

  7. Андрій коментує:

    Тобто, спочатку потрібно підключити цю функцію в FULLAJAX плагіні, а потім визивати через модуль, який не працює?

    • Fedik коментує:

      ні, не зовсім :)
      в плагіні потрібно розкоментувати:

      FLAX.Html.onall('load', function(options){
      	window.fireEvent('domready');
      });

      якщо нічого не запрацює то замість window.fireEvent('domready'); потрібно вписати код ініціалізації для модуля/скрипту який не працює

      • Андрій коментує:

        На жаль, не працює, а який вигляд буде мати код інціалізації??

      • Fedik коментує:

        все залежить від фантазії розробника того скрипту, що не працює :)
        якщо не знайомий з JavaScript то тут буде складно …
        можеш спробувати подивитись в браузері код сторінки на якій модуль працює (завантаженої без AJAX), там має буди щось ;)

  8. Dan коментує:

    Hello again,

    I am the guy having problems running fullajax along the gallery module “showplus”, since the latter won’t start with fullajax enabled.

    I’ve put

    window.fireEvent('showplus');

    before

    });

    but it still doesn’t work.

    I’d really appreciate if you could look into this. Both are very nice plug-ins, which I’d love to use.

    Thanks in advance,
    Dan

    • Fedik коментує:

      no, it`s wrong ;)
      need code for initialization instead

      window.fireEvent('domready');

      if it not works …

      for “showplus” try:

      window.fireEvent('load');

Напишіть відгук

Ваша пошт@ не публікуватиметься. Обов’язкові поля позначені *

Можна використовувати XHTML теґи та атрибути: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>