Загружать определенное изображение перед чем-либо еще
Я создаю экран загрузки для веб-сайта, который я делаю. Веб-сайт загружает много изображений, скриптов и т.д. Часть 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(); }
}
Ответы
Ответ 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/