50 lines
1.6 KiB
JavaScript
50 lines
1.6 KiB
JavaScript
(function() {
|
|
let currentPage = window.currentPage || 1;
|
|
let totalPages = window.totalPages || 1;
|
|
let loading = false;
|
|
const container = document.getElementById('projects-container');
|
|
const spinner = document.getElementById('loading-spinner');
|
|
|
|
if (!container || currentPage >= totalPages) return;
|
|
|
|
function shouldLoad() {
|
|
if (loading) return false;
|
|
const scrollPosition = window.scrollY + window.innerHeight;
|
|
const threshold = document.documentElement.scrollHeight - 300;
|
|
return scrollPosition >= threshold;
|
|
}
|
|
|
|
function loadNextPage() {
|
|
if (!shouldLoad()) return;
|
|
|
|
loading = true;
|
|
if (spinner) spinner.style.display = 'block';
|
|
|
|
const nextPage = currentPage + 1;
|
|
fetch(`?page=${nextPage}`, {
|
|
headers: { 'X-Requested-With': 'XMLHttpRequest' }
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
if (data.html) {
|
|
container.insertAdjacentHTML('beforeend', data.html);
|
|
currentPage = nextPage;
|
|
}
|
|
if (spinner) spinner.style.display = 'none';
|
|
loading = false;
|
|
if (currentPage >= totalPages) spinner?.remove();
|
|
})
|
|
.catch(error => {
|
|
console.error('Ошибка загрузки:', error);
|
|
if (spinner) spinner.style.display = 'none';
|
|
loading = false;
|
|
});
|
|
}
|
|
|
|
let timer;
|
|
window.addEventListener('scroll', () => {
|
|
clearTimeout(timer);
|
|
timer = setTimeout(loadNextPage, 150);
|
|
});
|
|
window.addEventListener('load', loadNextPage);
|
|
})(); |