2014-02-08 1 views
0

Что я пытаюсь сделать?Погрузчик .gif преждевременно скрывается

Я пытаюсь показать изображение загрузчика, пока изображения вытаскиваются с серверов Flickr в карусель водяного колеса. После того, как набор изображений будет загружен в аккордеон и водяное колесо, изображение загрузчика будет скрыто.

В чем проблема?

Изображение загрузчика скрывается преждевременно, что приводит к тому, что пользователь не указывает, что изображения по-прежнему загружаются. Изображения занимают от 6 до 10 секунд для загрузки внутри каждого раздела аккордеона, что достаточно для того, чтобы пользователь мог покинуть страницу.

Я видел проблему, возникающую как в Firefox, так и в Chrome. Как ни странно, были некоторые очень редкие случаи, когда изображение загрузчика фактически оставалось до тех пор, пока изображения не были полностью загружены.

Что я наделал?

Я экспериментировал с расположением $("#loader").hide(); внутри моих двух функций JavaScript.

  1. Внутри функции обратного вызова, но после вызова плагина водяного колеса с настройками конфигурации.
  2. Внешняя функция обратного вызова, но внутри displayContent().
  3. Нигде. Наверное, я надеялся, что он автоматически скроется после загрузки изображений ...: P

Вы можете просмотреть фотогалерею и разметку/скрипты here. Ниже приведен главный сценарий и разметка.

HTML

<!-- lines 348-364 --> 
<!-- Tabs --> 
<ul id="tabs"> 
    <li><a href="#" name="tab1">Glass Windows</a></li> 
    <li><a href="#" name="tab2">Lampshades</a></li> 
    <li><a href="#" name="tab3">Metal and Glass Sculptures</a></li> 
    <li><a href="#" name="tab4">Pi&ntilde;atas</a></li> 
    <li><a href="#" name="tab5">Wood Sculptures</a></li> 
</ul> 
<!-- Content in the accordion --> 
<div id="content"> 
    <img src="images/loader.gif" id="loader"/> 
    <div id="tab1" class="thumbs"></div> 
    <div id="tab2" class="thumbs"></div> 
    <div id="tab3" class="thumbs"></div> 
    <div id="tab4" class="thumbs"></div> 
    <div id="tab5" class="thumbs"></div> 
</div> 

JavaScript

// lines 264-293 
// 
$('#' + tabName).jflickrfeed({ 
    limit: 20, 
    qstrings: { 
     set: photoSet, 
     nsid: '[email protected]' 
    }, 
    useTemplate: false, 
    itemCallback: function(item){ 
      $(this).append("<a href='" + item.link + "' target='" + "_blank'" + ">" 
         + "<img src='" + item.image_n + "' alt=''/></a>"); 
    } 
}, function (data) { 

    // Special carousel stuff to make the 
    // showcase look spiffy 
    // 
    $('#' + tabName).waterwheelCarousel({ 
     speed: 500, 
     separation: 200, 
     flankingItems: 3 
    }).css('position', ''); 

    // Once the waterwheel is finished loading 
    // we can hide the loader 
    // 
    $("#loader").hide(); 
}); 

ПРИМЕЧАНИЕ: Сайт все еще находится в стадии происходит "отзывчивый" тестирование, так что вещи могут выглядеть немного шероховатой на другой экран размеры ...

+0

Вы уверены, что изображения по-прежнему загружаются, когда погрузчик исчезает? возможно, плагин с водяным колесом вызывает задержку появления изображений, я попытался использовать некоторые разрывы кода, и похоже, что изображения добавляются к функции itemCallback и после загрузки всех изображений (вы можете видеть, что они отображаются на одном время) загрузчик скрыт. Я бы пошел с проблемой плагина водяного колеса здесь – arieljuod

+0

@arieljuod Определенно правдоподобно, хотя мне очень странно, что легкий плагин займет так много времени, чтобы организовать все эти изображения ... – Rob

+0

У меня есть идея, проверьте мой ответ – arieljuod

ответ

0

Полностью проигнорирована функция complete в объектах изображения. Похоже, что это работает, хотя в Opera и Safari он немного глючит, поэтому причина для всего «скрытого» кода происходит в условном блоке внизу.

$('#' + tabName).jflickrfeed({ 
     limit: 10, 
     qstrings: { 
      set: photoSet, 
      nsid: '[email protected]' 
     }, 
     useTemplate: false, 
     itemCallback: function(item) { 

     // Where all the action is... 
     // 
     $(this).append("<a class=\"fancybox\" href='" + item.image_b + "' title='(ID# " + item.title + ")'>" + "<img src='" + item.image_n + "' alt='image'/></a>"); 

     // Store the source of the image and convert it 
     // to a string. Keep track of the count too 
     // 
     var img = new Image(); 
     img.src = item.image_n.toString(); 

     photoCount++; 

     // Hide loader gif 
     // 
     if (photoCount == 10 && img.complete === true) { 
      $('#loader').css('visibility', 'invisible'); 
      $('#loader').css('top', 10000).css('left', 10000); 
      $('#loader').hide(); 
     } 
    } 
}); 
0

Я бы попробовать что-то подобное в вашей $('#' + tabName).jflickrfeed({}); функции

itemCallback: function(item){ 
     $("#loader").show(); //Show the loading Icon 
     $(this).append("<a href='" + item.link + "' target='" + "_blank'" + ">" 
        + "<img src='" + item.image_n + "' alt=''/></a>"); 
} 

Тогда держите $("#loader").hide(); в конце сценария Может быть, после первых нагрузок изображения он скрывает загрузчик IMG, но никогда не сработал, чтобы показать, для остальных изображений.

Очевидно, что функция подачи фликкера вызывает каждое изображение один за другим.

+0

Пробовал это, но это не работает. Но я понимаю, что вы говорите. Я заметил, что вы отправили комментарий (но удалили его), что было чем-то вроде создания функции, которая скрывает загрузчика после загрузки раздела содержимого. Эта логика имеет для меня большой смысл, поэтому я собираюсь создать новую функцию и посмотреть, что произойдет. – Rob

1

Я думаю, что знаю, где проблема ... jflickerfeed извлекает данные изображения, но не изображения, поэтому вы добавляете их и только тогда браузер выполняет запрос на фактическое получение изображения. Итак, эта задержка, которую вы видите, - это фактически загруженные изображения с фликер-сервера. Теперь, если это так, вам нужно связать что-то с событием загрузки изображений и подсчитать, сколько у вас есть.Что-то вроде этого:

total_images = 0; 
loaded_images = 0; 
$('#' + tabName).jflickrfeed({ 
    limit: 20, 
    qstrings: { 
     set: photoSet, 
     nsid: '[email protected]' 
    }, 
    useTemplate: false, 
    itemCallback: function(item){ 
      total_images = total_images+1; 
      img = $('<img>').on('load',function(){ 
       loaded_images = loaded_images+1; 
       it (total_images == loaded_images) $('#loader').hide(); 
      }).attr('src',item.image_n); 
      anchor = $('<a>').attr('href',item.link).attr('target','_blank'); 
      anchor.append(img); 
      $(this).append(anchor); 
    } 
}, function (data) { 

    // Special carousel stuff to make the 
    // showcase look spiffy 
    // 
    $('#' + tabName).waterwheelCarousel({ 
     speed: 500, 
     separation: 200, 
     flankingItems: 3 
    }).css('position', ''); 
}); 

Я не уверен, если это проблема, но это имеет смысл: P

EDIT: Вы должны думать, что немного, потому что у вас есть более чем одной вкладки, но вот идея

+0

Имеет смысл то, что вы пытаетесь сделать, но я озадачен условным выражением внутри '$ ('') .on() ...'. Разве это не всегда оценивается как истина? Таким образом, загрузчик может скрыться после загрузки или мигания первого изображения. – Rob

+0

счетчик total_images будет увеличиваться быстрее, чем счетчик загруженных_изображений, так как load_images подсчитываются после запуска события загрузки каждого изображения. – arieljuod

+0

вы можете столкнуться с проблемой состояния гонки, если изображения кэшированы. Я не уверен, что если jflickerfeed дает вам общее количество изображений, полученных в другом месте до запуска элемента itemCallback, если вы можете получить номер в другом месте, который будет лучше – arieljuod