Ленивая загрузка изображений как - PullRequest
11 голосов
/ 27 октября 2010

Я занимаюсь разработкой интернет-магазина. На странице продуктов, основанной на категории, я добавил фильтрацию на основе JavaScript.Однако возникает проблема, если в категории много товаров.Эта ссылка имеет нечто подобное, что я делаю ... http://www.snowandrock.com/sunglasses/snowboard/fcp-category/list?resetFilters=true

Как бы ни была эта страница мучительно медленная и занимает более 2 МБ !!!

Каждому продукту для меня требуется пол килобайта, но изображениепроблема .. Так что я смотрю, как лениво загружать изображения .. Так как моя страница имеет нумерацию страниц в отличие от этого сайта, я думаю, что загрузка изображений, которые видны только странице, является решением. Однако пробная задача заключается в том, как это сделать, чтобыработать как для javascript, так и для людей, не поддерживающих javscript. Единственное решение, которое я, хотя - это сохранение ссылки на класс css изображения для невидимых продуктов и, если показывается после фильтрации изменений через javascript, изображение src ... Пользователи не javascriptу вас нет этой проблемы, так как нажатие на фильтр приведет к их переходу на другую страницу ...

Есть еще идеи?

Ответы [ 6 ]

7 голосов
/ 27 октября 2010

Четыре варианта:

Вот три варианта для вас:

Использовать фоновое изображение

Фоновый ответ Кангкана имеет это.

Если это не работает для вас, я предполагаю, что вам нужна только помощь с поддержкой JavaScript, поскольку вы сказали, что пользователи, не поддерживающие JavaScript, увидят другую страницу.

Использовать плагин

Выполнение пейджинга сделано . Вы сказали в комментарии, что используете jQuery. Существует множество плагинов jQuery для пейджинга. Найдите тот, который вам нравится, и используйте его. Они будут разного качества, так что вы захотите протестировать их и просмотреть их код, но я уверен, что есть приличное качество.

Пейджинг на стороне сервера

Здесь главная страница загружается либо без каких-либо продуктов, либо только с первой страницей продуктов. Обычно вы кладете все продукты в контейнер, например так:

<ul id='productList'>
</ul>

Тогда у вас будут обычные элементы управления пользовательским интерфейсом для перемещения по страницам результатов. У вас будет серверный ресурс, который возвращает фрагменты HTML или данные в формате JSON, которые можно использовать для заполнения этого списка. Я буду использовать HTML для простоты (хотя я, вероятно, буду использовать JSON в производственном приложении, так как он будет меньше). Каждая запись продукта представляет собой отдельный блок:

<li id='product-001'>
  <div>This is Product 001</div>
  <img src='http://www.gravatar.com/avatar/88ca83ed97a129596d6e8dd86deef994?s=32&d=identicon&r=PG'>
  <div>Blurb about Product 001</div>
</li>

... и затем страница возвращает столько, сколько вы считаете подходящим. Вы запрашиваете страницу с помощью Ajax и обновляете список продуктов с помощью JavaScript. Поскольку вы сказали, что используете jQuery, это может быть тривиально просто:

$('#productList').load("/path/to/paging/page?start=X&count=Y");

Вот пример прототипа (не рабочий код); он подделывает Ajax, потому что JSBin давал мне проблемы с Ajax.

Одна большая загрузка страницы, затем клиентская страничка JavaScript

Я не уверен, как вы выполняете фильтрацию, но если у вас есть элемент, содержащий информацию о продукте, вы можете сохранить URL-адрес изображения в атрибуте data-xyz:

<div id='product-123' data-image='/images/foo.png'>

Затем, когда ваш код сделает это видимым, вы можете легко добавить к нему img:

var prod, imgsrc, img;
prod = document.getElementById('product-123');
prod.style.display = 'block'; // Or whatever you're doing to show it
imgsrc = prod.getAttribute('data-image');
if (imgsrc) {
    img = document.createElement('img');
    img.src = imgsrc;
    prod.appendChild(img); // You'd probably put this somewhere else, but you get the idea
    prod.removeAttribute('data-image');
}

Редактировать В другом комментарии вы сказали, что используете jQuery. Если это так, перевод вышеприведенного может выглядеть следующим образом:

var prod, imgsrc, img;
prod = $('#product-123');
prod.show();
imgsrc = prod.attr('data-image');
if (imgsrc) {
    $("<img/>").attr('src', imgsrc).appendTo(prod); // You'd probably put this somewhere else, but you get the idea
    prod.removeAttr('data-image');
}

Нет необходимости удалять его снова при скрытии, поскольку изображение уже будет отображаться, поэтому я удаляю атрибут, как только мы его используем.

Причиной, по которой я использовал префикс data-, является проверка: начиная с HTML5, вы можете определить свои собственные data-xyz атрибуты, и ваши страницы все равно будут проходить проверку. В более ранних версиях HTML вам не разрешалось определять свои собственные атрибуты (хотя на практике браузер не заботился об этом), и поэтому, если вы использовали для этого свой собственный атрибут, страница не прошла бы проверку.

Ссылки (w3.org):

Не по теме, но лот этого материала становится намного проще, если вы используете библиотеку JavaScript, такую ​​как jQuery , Closure , Прототип , YUI или любой из нескольких других для сглаживания неровностей для вас. (Вы уже сказали, что используете jQuery. )

4 голосов
/ 27 октября 2010

Если вы просто хотите медленно загрузить изображения, а остальная часть страницы загружается первой, вы можете поместить изображения в качестве фона и не использовать тег <img>.Если вы используете тег <img>, изображение загружается во время загрузки страницы, поэтому загрузка страницы замедляется.Однако фоновые изображения загружаются после того, как страница показывается пользователю.Пользователь может прочитать текст и увидеть изображения, загружающиеся через некоторое время.

1 голос
/ 22 октября 2013

Я написал следующий код для своего сайта.Я использовал JQuery: 1. Назовите все классы, где вы хотите ленивую загрузку с тем же именем, скажите «async» 2. Скопируйте реальное местоположение изображения из атрибута «src» в «alt» 3. После завершения загрузки страницы мой скрипт будет скопированвсе значения 'alt' в 'src'. Посмотрите на пример.Это полный рабочий пример HTML:

<html> 
<head> 
<script src="http://code.jquery.com/jquery-1.9.1.js"></script> 
<script type="text/javascript">
        $(document).ready(function(){
            $('img.async').each(function(i, ele) {
                 $(ele).attr('src',$(ele).attr('alt'));
            });
        });
        </script> </head> <body> <img class="async" title="Гороскопы" alt="http://virtual-doctor.net/images/horoscopes.jpg" width="135" height="135"/> 
</body>
</html>

Вы можете почувствовать скорость в реальном сайте, где я использовал его http://virtual -doctor.net /

1 голос
/ 05 июня 2013

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

1 голос
/ 27 октября 2010

Я вполне уверен, что в обычном HTML это невозможно без какого-либо вмешательства в Javascript.

В конце концов, если бы было возможно сделать это без сценариев, почему кто-то реализовал бы это в Javascript впервое место?

Мой вопрос: сколько посетителей вы получаете, у которых в эти дни не включен Javascript?Бьюсь об заклад, это очень мало.И в любом случае, эти люди привыкли к тому, что сайты не являются полностью функциональными, когда у них отключен JavaScript;Ваш сайт на самом деле будет лучше, чем большинство, если единственное отличие, которое они должны смириться, это более медленная скорость загрузки.

(ps - я предполагаю, что вы используете плагин Jquery LazyLoad для Javascriptвключенные люди?)

0 голосов
/ 25 июня 2014

РЕДАКТИРОВАТЬ: Я перечитал ваш вопрос и заметил, что вы также хотите, чтобы это работало для людей с отключенным JavaScript! Тогда да, мой ответ не приемлем, но я оставлю его для протокола.

Вот некоторые библиотеки Javascript для Image Lazy Loading.

Они помогают вам загружать изображения, необходимые, когда элементы будут видны, просто изменяя атрибут image src.

Важно : Я все еще изучаю, какую из этих библиотек Javascript лучше всего использовать. Сделай свою домашнюю работу, скажу я, найди время, чтобы найти лучший инструмент для работы. Мои требования обычно: license, dependencies, browser support, device support, weight, community и history.

...