{% else-1 %}
Текст не мой*
Сколько я себя помню, веб-разработчики всегда обращались к старой-доброй пагинации в случае, когда им необходимо было отобразить большое количество контента. Не поймите меня неправильно, пагинация до сих пор является эффективным способом отображения контента, но в этой статье мы поговорим о другом подходе - “ленивой” прокрутке, также известной под названием “бесконечной прокрутки” и “отказом от пагинации”. С помощью этой техники подгрузка контента производится с помощью AJAX, когда пользователь прокручивает страницу до места, где загруженный контент заканчивается. Ленивая прокрутка используется некоторыми гигантами интернета, такими как Facebook и Pinterest. В этом посте мы попробуем реализовать свой плагин для ленивой загрузки на jQuery.

                        
Преимущества и недостатки

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

Ленивая загрузка эффективна не во всех ситуациях. Например, в случаях, когда пользователь переходит по ссылке, а затем хочет вернуться на предыдущую страницу с помощью истории браузера, он теряет позицию в той части, которая была подгружена с помощью AJAX. Одним из способов решения подобной проблемы - открывать все ссылки в новом окне или вкладке.

Недостаток, который следует из вышесказанного - у пользователя нет возможности запомнить свою позицию в части документа, которая была подгружена с помощью AJAX. Представим, что вы хотите поделиться чем-нибудь со страницы с ленивой подгрузкой со своим другом по электронной почте. Вы не сможете этого сделать, так как ссылка приведет вас обратно к вашей изначальной позиции. Так что, прежде чем бросаться внедрять ленивую загрузку на вашем сайте, подумайте о юзабилити такого решения иненно в рамках вашего сайта.

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

Начинаем

Начнем с наброска очень простой страницы. Самые важные части страницы показаны в коде ниже. Полные файлы можно посмотреть в исходниках.

HTML

01
<div id="data-container">
02
<div class="data-item">
03
Привет! Я - первый элемент
04
</div>
05
<div class="data-item">
06
Привет! Я - второй элемент
07
</div>
08
<div class="data-item">
09
Привет! Я - третий элемент
10
</div>
11
<div class="data-item">
12
Итак, это становится скучным...
13
</div>
14
<div class="data-item">
15
Попробуем кое-что новенькое
16
</div>
17
<div class="data-item">
18
Как насче того, чтобы загрузить еще элементов посредством AJAX
19
</div>
20
<div class="data-item">
21
Нажмите на кнопку ниже, чтобы загрузить больше элементов
22
</div>
23
</div>
24
<div id="button-more" onclick="lazyload.load()">
25
загрузить еще
26
</div>
27
<div id="loading-div">
28
загружаю дополнительные элементы
29
</div>
CSS

01
#data-container {
02
margin: 10px;
03
}
04

05
#data-container .data-item {
06
background-color: #444444;
07
border-radius: 5px;
08
-moz-border-radius: 5px;
09
-webkit-border-radius: 5px;
10
padding: 5px;
11
margin: 5px;
12
color: #fff;
13
}
14

15
#loading-div {
16
display: none;
17
}
18

19
#button-more{
20
cursor: pointer;
21
margin: 0 auto;
22
background-color: #aeaeae;
23
color: #fff;
24
width: 200px;
25
height: 50px;
26
line-height: 50px;
27
}
Основные замечания

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

необходимо сделать запрос на URL, который вернет нам список элементов, которые необходимо будет вставить на странице
этот процесс должен повторяться каждый раз, как будет нажата кнопка, но в результате должны возвращаться новые посты
новые посты должны выдаваться на каждый запрос до тех пор, пока есть, что возвращать
когда больше не осталось постов, необходимо сообщить пользователю, что он достиг конца
Шаблоны ответа AJAX

В идеале необходимо объявить переменную, в которой мы будем хранить номер страницы, и с помощью этого номера определять URL, на который мы будем отправлять запрос. В нашем демонстрационном примере у нас будут три таких страницы: 2.html, 3.html и пустая страница 4.html.

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

1
$(buttonId).hide();
2
$(loadingId).show();
Добавляем полученные данные на страницу

Сначала вернем обратно те изменения, которые мы проделали, пока запрос еще выполнялся, то есть, показать кнопку “загрузить еще”, и спрятать информационный текст. Во-вторых, необходимо вставить полученные данные на страницу, после тех элементов, что уже есть на странице. Заметьте, что для упрощения в этом примере мы получаем данные HTML сразу, как результат запроса. Можно отсылать ответ в формате JSON, добавив в него дополнительные переменные, как статус или сообщение. Код ставки данных представлен ниже:

1
$(buttonId).show();
2
$(loadingId).hide();
3
$(response).appendTo($(container));
4
page += 1;
Обрабатываем вариант, когда данные закончились

Как только вы достигнете последнего поста, вам нужно показать пользователю, что больше постов нет. Сделать это можно различными способами. Можно отсылать статус в виде встроенного в ответ кода или сообщения. Так как мы напрямую используем разметку HTML в этом примере, то пустой ответ в нашем случае будет говорить о том, что данные закончились.

01
$.ajax({
02
...
03
success: function(response) {
04
// Действие при пустом ответе
05
if (response.trim() == "") {
06
$(buttonId).fadeOut();
07
$(loadingId).text("No more entries to load!");
08
return;
09
}
10
// Если ответ верный
11
},
12
...
13
});
Заключение

В данном демонстрационном примере мы привели очень базовый вариант обработки ленивой загрузки. Конечно же, можно сделать гораздо лучше, если постараться. Для начала, можно вообще избавиться от кнопки, и отправлять запрос, когда пользователь прокрутит страницу до конца. Это избавит пользователя от дополнительной необходимости нажимать кнопку, и в целом ускоряет процесс просмотра информации. Во-вторых, можно просто отсылать чистые данные в формате JSON, а разметку создавать налету, используя jQuery, например:

1
$.each(response.items, function(index, value) {
2
$("<div />", {
3
"class" : "data-item",
4
"text" : value
5
});
6
});
1 27 0
Без комментариев...