Загрузка данных
// Создаём 5000 тестовых товаров
let products = [];
for (let i = 1; i <= 5000; i++) {
products.push({ id: i, name: 'Товар ' + i, price: i * 10 });
}
console.log('Всего товаров: ' + products.length);
// Создаём карточку товара
function makeCard(product) {
return '<li><b>' + product.name + '</b><br>' +
'Цена: ' + product.price + ' руб.<br>' +
'<small>Артикул: ' + (100000 + product.id) + '</small></li>';
}
// Показываем все товары сразу
function renderAll() {
let start = performance.now();
let html = '';
for (let i = 0; i < products.length; i++) {
html += makeCard(products[i]);
}
document.getElementById('catalog').innerHTML = html;
document.body.offsetHeight;
let time = performance.now() - start;
console.log('Показано товаров: ' + products.length +
', время: ' + time.toFixed(1) + ' мс');
}
// Постепенная загрузка товаров
let shown = 0;
let pageSize = 50;
function showMore() {
let start = performance.now();
let end = Math.min(shown + pageSize, products.length);
let html = '';
for (let i = shown; i < end; i++) {
html += makeCard(products[i]);
}
document.getElementById('catalog').insertAdjacentHTML('beforeend', html);
shown = end;
document.body.offsetHeight;
let time = performance.now() - start;
console.log('Показано товаров: ' + shown +
', время: ' + time.toFixed(1) + ' мс');
// Показываем количество оставшихся товаров
let remaining = products.length - shown;
if (remaining > 0) {
document.getElementById('btnMore').textContent =
'Показать ещё (осталось ' + remaining + ')';
} else {
document.getElementById('btnMore').style.display = 'none';
}
}
// Кнопка загрузки товаров
document.getElementById('btnMore').addEventListener('click', showMore);
// Автоматическая загрузка при прокрутке
let observer = new IntersectionObserver(function (entries) {
if (entries[0].isIntersecting) {
console.log('Подгрузка при прокрутке');
showMore();
}
}, { rootMargin: '400px' });
observer.observe(document.getElementById('btnMore'));
// Тарифы доставки
let tariffs = {
'Москва': 450,
'Самара': 500,
'Казань': 350,
'Владивосток': 900
};
// Медленный расчёт доставки
function calcDelivery(city) {
let start = Date.now();
while (Date.now() - start < 1000) {}
return tariffs[city];
}
// Создаём кэш
let cache = {};
// Загружаем кэш из localStorage
let saved = localStorage.getItem('deliveryCache');
if (saved !== null) {
cache = JSON.parse(saved);
console.log('Кэш загружен из localStorage');
console.log('Городов в кэше: ' + Object.keys(cache).length);
}
// Расчёт доставки с кэшированием
function calcDeliveryCached(city) {
if (cache[city] !== undefined) {
return cache[city];
}
let price = calcDelivery(city);
cache[city] = price;
// Сохраняем кэш
localStorage.setItem('deliveryCache', JSON.stringify(cache));
return price;
}
// Обработчик расчёта доставки
function onCalc() {
let city = document.getElementById('city').value;
let start = performance.now();
let fromCache = cache[city] !== undefined;
let price = calcDeliveryCached(city);
let time = performance.now() - start;
document.getElementById('delivery').textContent =
'Доставка в город ' + city + ': ' + price + ' руб.' +
(fromCache ? ' (из кэша)' : '');
console.log('Расчёт для города ' + city +
': ' + time.toFixed(0) + ' мс');
}
// Кнопка расчёта доставки
document.getElementById('btnCalc').addEventListener('click', onCalc);
// Очистка кэша
document.getElementById('btnClear').addEventListener('click', function () {
cache = {};
localStorage.removeItem('deliveryCache');
console.log('Кэш очищен');
});
// Запуск каталога
showMore();