Подтвердить что ты не робот

Загружать определенное изображение перед чем-либо еще

Я создаю экран загрузки для веб-сайта, который я делаю. Веб-сайт загружает много изображений, скриптов и т.д. Часть HTML и CSS отлично, но мне нужен способ гарантировать, что изображение "загрузка..." будет загружено раньше всего.

Я использую jQuery, и все начато в $(function () { ... });. Я предполагаю, что код для этого нужно будет вызывать перед/вне этого блока, а код для удаления экрана загрузки будет вызываться в самом конце этого блока. В настоящее время загрузочное изображение задается как фон DIV, который я предпочитаю. Однако, если это полностью необходимо, я соглашусь на тег IMG.

Обновление: (решение)

Я смог ответить на свой вопрос, используя комбинацию ответов Робин и Влад. Оба были очень хорошими и отличными ответами, однако проблема в том, что они были нацелены на загрузку изображения перед другим изображением, а не на загрузку изображения раньше всего. (CSS, JS и т.д.)

Вот грязная версия того, что я придумал:

var files = [new Image(), document.createElement('link'), document.createElement('script')];
files[0].setAttribute('src', 'images/loading.gif');
files[1].setAttribute('rel', 'stylesheet');
files[1].setAttribute('type', 'text/css');
files[1].setAttribute('href', 'test.css');
files[2].setAttribute('type', 'text/javascript');
files[2].setAttribute('src', 'js/jquery-1.5.1.min.js');
window.onload = function (e) {
    document.getElementsByTagName('head')[0].appendChild(files[1]);
    document.getElementsByTagName('head')[0].appendChild(files[2]);
}

Взглянув на последовательность загрузки на вкладке "Сеть" консоли разработчика Chrome, сначала загрузится "loading.gif", затем 4 фиктивных изображения, затем "test.css", а затем "jquery.1.5.1. min.js. Файлы CSS и JS не загружаются, пока они не будут вставлены в главный тег. Это именно то, что я хочу.

Я предсказываю, что у меня могут возникнуть некоторые проблемы, однако, когда я начну загружать список файлов. Chrome сообщает, что сначала загружается файл JS, но в большинстве случаев загружается файл CSS. Это не проблема, только когда я начинаю добавлять файлы для загрузки, мне нужно будет убедиться, что jQuery загружен перед файлом script, который использует jQuery.

Если у кого-то есть решение для этого или способ обнаружить, когда файлы CSS/JS закончены, используйте этот метод, пожалуйста, прокомментируйте. Хотя, я не уверен, что это будет проблемой. Возможно, мне придется задать новый вопрос в будущем, если я начну сталкиваться с проблемами.

Спасибо всем, кто помог с этой проблемой.

Обновление: (исправление с ошибкой)

У меня возникло много проблем с этим методом, потому что файлы script загружались асинхронно. Если бы я очистил кеш браузера, а затем загрузил страницу, он сначала завершил загрузку файлов, зависящих от jquery. Тогда, если я обновил страницу, это сработает, потому что jquery был загружен из кеша. Я решил это, установив массив загружаемых файлов, а затем добавив нагрузку script в функцию. Затем я перехожу через каждый элемент массива, используя этот код:

element.onload = function() { 
    ++i; _step();
}
element.onreadystatechange = function() { 
    if (("loaded" === element.readyState || "complete" === element.readyState)) { ++i; _step(); }
}
4b9b3361

Ответ 1

Пока изображение "загрузка..." помещается перед любыми другими элементами html, оно должно загружаться первым. Это, конечно, зависит от размера изображения. Вы можете поместить загрузочный div сразу после тега и поместить его, используя "position: absolute". Что касается кода для удаления экрана загрузки, один из способов заключается в следующем.

  • Поместите все изображения, скрипты, которые необходимо загрузить в скрытый div (display: none)
  • Настройте переменную, которая будет содержать общее количество загружаемых изображений/скриптов.
  • Настройка переменной счетчика
  • Прикрепите к каждому изображению / script событие "onload"
  • Каждый раз, когда запускается событие "onload", он вызывает функцию, которая будет увеличивать счетную переменную и проверять, соответствует ли значение счетчика общей переменной
  • Если все ресурсы были загружены, запустите специальное событие, которое покажет div с изображениями, и скройте div с экраном загрузки.

Код ниже - это не тестеры, поэтому он может не работать. Надеюсь, что это поможет.

var totalImages = 0;
var loadCounter = 0;

function incrementLoadCounter() {
   loadCounter++;
   if(loadCounter === totalImages) {
      $(document).trigger('everythingLoaded');
   }
}

function hideLoadingScreen() {
   $('#loadingScreen').hide();
   $('#divWithImages').show();
}

$(document).ready(function(e) {
    $('#loadingScreen').bind('everythingLoaded', function(e) {
        hideLoadingScreen();
    });
    var imagesToLoad = $('img.toLoad');
    totalImages = imagesToLoad.length;

    $.each(imagesToLoad, function(i, item) {
        $(item).load(function(e) {
           incrementLoadCounter();
        })
    });
})

Ответ 2

Я не уверен, что это возможно.

Если это так, попробуйте добавить это в head-tag:

<script type="text/javascript">
    if(document.images)
        (new Image()).src="http://www.image.com/example.png";
</script>

В теории, которая может загружать и кэшировать это изображение раньше всего.

Ответ 3

Вы можете повторно использовать поддержку браузера предварительного кодирования ресурсов.

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

Сначала определите в заголовке, какой ресурс вы хотите предварительно загрузить и определить приоритет ресурса

<link rel="preload" href="link-to-image" as="image"> 

или

<link rel="preload" href="link-to-image">

Вторая строка позволяет увеличить приоритет загрузки по всем типам объектов (скрипты/изображения/стили). Первая строка - только через изображения.

Затем определите в теле ссылку на изображение как обычно:

<img src="link-to-image" alt="">

Вот мой рабочий пример https://jsfiddle.net/vadimb/05scfL58/

Ответ 4

Я думаю, что если вы поместите тег IMG в верхнюю часть своего тела html, он будет загружен первым. Если вы не хотите перемещать свой div, просто используйте копию тега изображения. После загрузки изображений он будет отображаться в каждом теге изображения, который показывает одно и то же изображение.

Ответ 5

Или вы можете использовать spin.js для загрузки изображения. Он отображает это "изображение цикла загрузки" через javascript.

Проверьте это: http://fgnass.github.com/spin.js/