2012-01-06 2 views
0

Я сделал предварительный загрузчик для загрузки в каком-либо содержимом таблиц и пользовательских полос прокрутки, в то время как загрузка Div покрывает область. После того, как это будет завершено, load div должен исчезнуть.Мой сценарий предварительной загрузки не работает полностью

По какой-то причине предварительная загрузка исчезает до завершения загрузки содержимого.

Если попробовать этот demo и нажмите кнопку на самом верху что говорит место, вы можете заметить, что он полностью не ждать, чтобы все было сконфигурировано до нагрузки Див пропадает. Некоторые люди могут даже увидеть старый контент на секунду или два.

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

jQuery(document).delegate(".topCanBeActive", "click", function(e) { 
    e.preventDefault(); 

    // this just handles the css class of buttons 
    jQuery(".topCanBeActive").removeClass("topActive"); 

    // this just handles the css class of buttons 
    jQuery(this).addClass("topActive"); 

    var pageToLoad = ''; 
    switch(this.id) { 
     case 'all_events_button': 
      $('#partypreloader').fadeIn('fast', function() { 
       pageToLoad = 'events.html'; 
       configureEvents(); 
      }); 
      break; 
     case 'all_venues_button': // this is the venues button 
      // fade in 'loading' div 
      $('#partypreloader').fadeIn('fast', function() { 
       pageToLoad = 'venues.html'; 

       // configure tables etc 
       configureVenues(); 
      }); 
      break; 
     case 'event_finder_button': 
      pageToLoad = 'search.html'; 
      break; 
    } 
    if('' !== pageToLoad){ 
     // just in case, I added the same function 
     // to load the preload div here 
     $('#partypreloader').fadeIn('fast', function() { 
      // load the chosen content in desired div 
      $('#whole-ajax-content-one').load(pageToLoad, function() { 
       // fade out the preload div 
       configureFadeOut(); 
      }); 
     }); 
    } 
}); 

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

function configureEvents() { 
    window.setTimeout(function() { 
     $('#whole-ajax-content-one').load('events.html', function() { 

      // configure table 
      $("#myTable").tablesorter({ 
       headers: { 
        0: { sorter: false } 
       }, 
       widgets: ['zebra'] 
      }); 

      window.setTimeout(function() { 
       // Configure scrollbar 
       $('.scroll-pane').jScrollPane(); 

       // Configure table again - I had issues with this 
       // so I did it twice 
       $("#myTable").tablesorter({ 
        headers: { 
         0: { sorter: false } 
        }, 
        widgets: ['zebra'] 
       }); 

       // Set CSS class for buttons 
       jQuery("#all_events_button").addClass("topActive"); 
       jQuery("#today_button").addClass("timeframeActive"); 
      }, 150); 
     }); 

     // Preload div fades out 
     $("#partypreloader").fadeOut("slow"); 
    }, 200); 
} 

Я пересмотрел код, чтобы сделать предварительную нагрузку до таких уровней, что код такой же сложный, как и он. Если вы заметите что-то, что кажется выключенным, сообщите мне. Спасибо большое всем :)

+0

Вы пытались поместить '$ (" # partypreloader "). FadeOut (" slow ");' внутри обратного вызова 'load()'? –

+0

Привет Šime, но это в основном то, что 'configureFadeOut();' делает, поскольку он тоже помещается в обратный вызов 'load()'. – pufAmuf

+0

Он находится в обратном вызове 'load()'? Я не вижу этого ... –

ответ

1

Это ваш текущий код:

function configureEvents() { 

    window.setTimeout(function() { 

     $('#whole-ajax-content-one').load('events.html', function() { 
      // other code 
     }); 

     $("#partypreloader").fadeOut("slow"); 

    }, 200); 

} 

Как вы можете видеть, fadeOut вызов вне от load() обратного вызова, что означает, что замирания выход происходит сразу - это Безразлично Дождаться события load.

Попробуйте положить его внутриload обратного вызова (в конце):

function configureEvents() { 

    window.setTimeout(function() { 

     $('#whole-ajax-content-one').load('events.html', function() { 
      // other code 

      $("#partypreloader").fadeOut("slow"); 
     });   

    }, 200); 

} 

Btw, что тайм-аут для?

+0

О, так очень верно. Пропустил это в моем ответе. – freakish

+0

Что смешно, так это то, что я этого не замечал до тех пор, пока причудливые не упомянули об этом. Таймаут был идеей «поддельной нагрузки», чтобы дать коду немного больше времени для загрузки. Тем не менее, я заметил, что проблема в том, что моя загрузка кода функции переключения не работает, потому что я также заметил, что я дважды использую функцию '.load'. Однажды в функции переключателя и один раз в 'configureEvents' и' configureVenues' функция ... и удаление '.load' из' configureVenues' фактически останавливает контент от загрузки - это означает, что загрузка функции коммутатора нарушена. Хорошо, вернемся к чертежной доске :) – pufAmuf

+0

Я сейчас немного посплю и вернусь к нему, как только проснусь. Спасибо Šime! :) – pufAmuf

1

Это ваш текущий код? Тогда, может быть, груз в if (сразу после switch) быстрее, чем этот очень сложный configureEvents? Таким образом, сначала запускается configureFadeOut (кстати: зачем вы загружаете одни и те же данные дважды?). Если это так, тогда содержимое загружается, но не настроено так, как мы его видим. А поскольку данные кеширования браузеров, то это происходит только один раз.

Так какой у меня совет? Обновите этот код. Прежде всего, каждая кнопка в меню должна иметь свой собственный контент - уникальный div. Вы загрузите данные в div. Используя jQuery .data, вы установите div на loaded, чтобы каждый другой клик не вызывал ajax (если только не было причин для этого, как очень динамические данные). Затем щелчок между кнопками изменяет только css display (или огонь fadeIn - fadeOut).

Следующее: почему вы используете delegate? Прежде всего это устарело (используйте on), а во-вторых: меняется ли меню во время его жизни? Если это не так, то нет смысла.

И наконец: избавиться от них setTimeouts. Напишите простой код:

show preloader --> on fadeIn callback load data --> 
--> on load callback do some stuff --> 
--> hide preloader 

Это все, что я могу сказать на данный момент. Надеюсь, это поможет. Если это не так, я могу только пожелать вам удачи! :)

+0

Привет, странный, спасибо, я доберусь до него! Но, чтобы быть уверенным, поскольку каждый контент будет иметь свой собственный div - я загружаю их все при загрузке страницы или после нажатия кнопки? Во-вторых, если все они загружены при загрузке страницы - разве это не замедлит работу браузера? – pufAmuf

+0

Нет, нет. Каждый 'div' пуст в начале (в противном случае нет смысла использовать ajax вообще :)). Вы выполняете код обработки и в '$ (document) .ready (..)' вы искусственно запускаете щелчок по элементу меню по умолчанию (поэтому содержимое первого div загружается на всю загрузку страницы). Вот как я это сделал и, например, на вкладках пользовательского интерфейса jQuery, это делается так (таким образом, я считаю, что это хорошая практика). Но главная проблема заключается в том, что одна и та же загрузка называется дважды! – freakish

+0

Я только что просмотрел свой код и заметил тупую вещь, которую я сделал, что вы упомянули. Так что я сделал, что я удалил функцию '.load' в' configureVenues' и заметил, что содержимое * Venues * больше не загружается. Я думаю, что я просто переделаю код в соответствии с тем, что вы и Симе сказали, и посмотрите, что из этого выйдет :) – pufAmuf

Смежные вопросы