Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Оптимизация JS и HTML DIV блока
Форумы портала PHP.SU » » Вопросы новичков » Оптимизация JS и HTML DIV блока

Страниц (1): [1]
 

1. pantela - 02 Октября, 2015 - 13:52:59 - перейти к сообщению
Имеются 6 AJAX функции, все вызываются при открытии страницы $(document).ready(function()

При вызове функции использую вывод div блока с loading.gif анимацией...
CODE (html):
скопировать код в буфер обмена
  1. <div class="ajax-loader" style="display: none;">
  2.         <img src="/Public/content/images/loading.gif">
  3. </div>


В функциях, при вызове в начале пишу $('.ajax-loader').show(); и $('.ajax-loader').hide();, но т.к. DIV блок у меня общий для всех, у меня происходит проблема, когда напр. функция №1 до конца загрузилось и закончилось с $('.ajax-loader').hide();, но т.к. другие функции не успевают загружаться, получается у них DIV блок пропадает...

Какое решение есть...
Тупо делать для каждой функции свой DIV блок как-то не хочется, т.к. дублирование кода получается...
2. DelphinPRO - 02 Октября, 2015 - 14:45:35 - перейти к сообщению
Открываем jQuery API, смотрим какие есть методы у модуля ajax.

Подсказка: там есть два нужных вам метода, в одном вы будете показывать лоадер-анимацию, во втором прятать.
3. pantela - 02 Октября, 2015 - 18:32:03 - перейти к сообщению
спс, почитаю... т.е. тупо перед $.ajax мне не надо будет выводить $('.ajax-loader').show(); и $('.ajax-loader').hide();? Наверное до запуска AJAX запроса буду выводить и при удачном случае...? Но вроде проблема всё равно будет т.к. DIV блок у меня ведь общий... Откуда он будет понимать какой AJAX функция запускает его и закрывает...
4. DelphinPRO - 03 Октября, 2015 - 14:00:23 - перейти к сообщению
Мимо...
API не читал..
5. pantela - 03 Октября, 2015 - 14:55:17 - перейти к сообщению
Ну вроде ajaxStart() и ajaxStop() Закатив глазки

Но вроде не поможет... Представь себе запускаются одновременно 2 функции, выводиться DIV блок, №1 функция закончила загрузку и спратала DIV блок, а вторая ещё не знакончила, но DIV блок она уже не имеет...

Или с помощью ajaxStart() и ajaxStop() можно отследить все действия AJAX функции на странице которые?
т.е. у меня ведь общий DIV блок для всех...
6. Deonis - 03 Октября, 2015 - 16:43:30 - перейти к сообщению
pantela пишет:
Имеются 6 AJAX функции, все вызываются при открытии страницы
Для меня такой подход навечно останется загадкой. Почему бы не сделать один запрос, на сервере выполнить сценарии, которые вы собирались выполнять для всех шести? Ну да ладно... Если ближе к вопросу, то есть такой метод, как $[dot]ajaxSetup() (хоть и не очень рекомендованный), в котором можно установить параметры beforeSend и complete для всех ajax-запросов. Т.е. в beforeSend вы открываете прелоадер, а в complete - скрываете. Однако, скрывать в complete не подойдет, т.к. прелоадер будет скрыт после завершения первого же запроса. Для таких целей подойдут "Обещания" (Promise). В jQuery для таких целей есть объект Deferred со своими методами. Вот простой пример.

CODE (javascript):
скопировать код в буфер обмена
  1. var log = $('div'),
  2.     loader = $('span'); // это как бы ваш элемент с loading.gif
  3. $.ajaxSetup({
  4.     beforeSend: function(){
  5.         loader.show();
  6.     },
  7.     success: function(d){
  8.         log.append('<p>' + d + ' завершен</p>');
  9.     }
  10. });
  11. function foo1(){
  12.     return $.ajax({
  13.         url: '/echo/html/',
  14.         type: 'POST',
  15.         data: {delay: 3, html: 'Запрос 1'}
  16.     });
  17. }
  18. function foo2(){
  19.     return $.ajax({
  20.         url: '/echo/html/',
  21.         type: 'POST',
  22.         data: {delay: 5, html: 'Запрос 2'}
  23.     });
  24. }
  25. function foo3(){
  26.     return $.ajax({
  27.         url: '/echo/html/',
  28.         type: 'POST',
  29.         data: {delay: 1, html: 'Запрос 3'},
  30.     });
  31. }
  32.  
  33. $.when(foo1(), foo2(), foo3()).then(function(r1, r2, r3){
  34.     log.append('<strong>Все запросы завершены! Скрываем лоадер </strong>');
  35.     loader.fadeOut(3000);
  36. });
7. DelphinPRO - 03 Октября, 2015 - 17:12:50 - перейти к сообщению
pantela пишет:
Ну вроде ajaxStart() и ajaxStop()

Бинго! Улыбка

Первая будет вызвана, если на странице ЕЩЕ не выполняется НИ ОДИН запрос.
Вторая будет вызвана, когда на странице УЖЕ закончится ПОСЛЕДНИЙ запрос.

Это то что вам нужно.
(Добавление)
Deonis ajaxStart и ajaxStop делают то же самое "из коробки" ;)
8. pantela - 04 Октября, 2015 - 21:08:57 - перейти к сообщению
Ну через ajaxSetup можно использовать для определение всех функции, а через ajaxStart и ajaxStop надо писать для каждой функции вроде да...или...?

спс.Ув.

 

Powered by ExBB FM 1.0 RC1