jquery Бесконечная прокрутка ленты с загрузкой контента Ajax-ом -- появление футера, отслеживание события пример кода
Primary tabs
Как будем реализовывать
Всё просто - у нас будет:
- некий html элемент, которой в своих data атрибутах будет все необходимое для получения очередной порции контента.
- JS скрипт который используя изначальные данные элемента подгружает ленту, и останавливает подгрузку, если сервер указывает это передав res.finished = true (см. далее)
Управляющий элемент HTML
Предположим, что какую-то порцию контента мы грузим при открытии страницы, тогда управляющий элемент может выглядеть как-то так (здесь для присвоения значений использован синтаксис Smarty -- не пугайтесь, смысл в том, что вы можете установить эти значения при загрузке страницы каким-либо способом, не обязательно через данный шаблонизатор, в после же загрузки мы будем работать с ними через JS и менять их если нужно тоже средствами JS):
<div style="display: none"
id="loader-manager"
data-url="/load_projects_by_ajax/"
data-limit="{$ProjectsLimit}"
data-offset="{$ProjectsLimit}"
<!-- далее список дополнительных парамертов,
необходимых для подгрузки конкретных данных -->
data-parent-id="{$ParentId}"
data-year="{$ProjectsLoadYear}"
data-parent-path="{$ParentPath}">
<a href="#" class="link-new wide">тут можно что-то написать, если управлять по клику,
но у нас элемент невидимый</a>
</div>
Скрипт подгрузки ленты
var projectsContainerId = '#projects-container'; // контейнер, в который добалять вновь загруженные данные
var distanceFromBottomToStartLoad = 500; // в пикселях -- за сколько пикселей до конца страницы начинать загрузку
/* Элемент руководящей загрузкой - в его полях содержим все опции необходимые
для выборки очередной порции данных или прекращения загрузки */
var loaderManagerElementId = '#loader-manager'; // элемент, руководящий загрузкой
$(document).ready(function()
{
initScrollingLoad(); // инициаллизируем обработчик прокрутки и фоновую загрузку
});
var loadAjax = false; // индикатор выполняения запроса подгрузки ленты
function initScrollingLoad() {
$loadManager = $(loaderManagerElementId);
$(window).scroll(function() {
// Проверяем пользователя, находится ли он в нижней части страницы
if (($(window).scrollTop() + $(window).height() > $(document).height() - distanceFromBottomToStartLoad) && !loadAjax) {
console.log('infinit load event!!');
// Идет процесс
loadAjax = true;
// Сообщить пользователю что идет загрузка данных
// $this.find('.loading-bar').html('Загрузка данных');
// Запустить функцию для выборки данных с установленной задержкой
// Это полезно, если у вас есть контент в футере
setTimeout(function() {
var url = $loadManager.data('url');
var limit = $loadManager.data('limit');
var offset = $loadManager.data('offset');
var year = $loadManager.data('year');
var parentPath = $loadManager.data('parent-path');
var parentId = $loadManager.data('parent-id');
$loadManager.data('offset', offset + limit); // сразу выставляем новое смещение для следующего запроса
var loadOptions = {
'limit': limit ,
'offset': offset,
'year': year,
'parent-path': parentPath,
'parent-id': parentId
}
sendAjax(url, loadOptions); // передаём необходимые данные функции отправки запроса
}, 30);
}
});
}
function sendAjax(url, data)
{
// showLoaderIdenity(); // показываем идентификатор загрузки
$.ajax({ // сам запрос
type: 'POST',
url: url,
data: data, // данные которые передаём серверу
dataType: "json" // предполоижтельный формат ответа сервера
}).done(function(res) { // если успешно
// hideLoaderIdenity(); // скрываем идентификатор загрузки
appendHtml(res.html) // добавляем скаченные данные в конец ленты
if (res.finished) { // если получили признак завершения прокрутки
stopLoadTrying();
}
loadAjax = false; // укажем, что данный цикл загрузки завершён
console.log('Ответ получен: ', res);
if (res.success) { // если все хорошо
console.log('ОК!)');
} else { // если не нравится результат
console.log('Пришли не те данные!');
alert(res.message);
}
}).fail(function() { // если ошибка передачи
//hideLoaderIdenity();
loadAjax = false;
console.log('Ошибка выполнения запроса!');
});
}
/**
* Добавим подгруженные данные в ленту
*
* @param {type} html
* @returns {undefined}
*/
function appendHtml(html) {
$(projectsContainerId).append(html);
}
function stopLoadTrying() {
$(window).off('scroll'); // отвязываем обработку прокрутки от окна
}
Примечания
- В скрипте выше мы обошлись без идентификатора загрузки (закомментирован), но если необходимо вы можете использовать это простое решение.
Источники:
(при написании в том числе использовались заметки):
- Бесконечная прокрутка страницы с записями, средствами jQuery: http://xozblog.ru/2013/01/infinite-scroll/
- Log in to post comments
- 10640 reads