function setTotalSum() {
const totalSum = Array.from(document.querySelectorAll('.right-form-calculator__cost'), e => +e.textContent)
.reduce((summ, cost) => summ + cost, 0);
document.querySelector('.right-form-calculator__sum').textContent = `Сумма ${totalSum} руб`;
}
updateActiveMenuItems
. .reduceRight( (f, g) => (() => g(f(...args)))())
.reduceRight( (f, g) => (...args) => g(f(...args)))
А здесь возвращается функция, соответственно она и переходит на следующую итерацию виде аккумулятора f. submitBtn.addEventListener('click', () => {
filterAddBox.innerHTML = '';
checkboxButtons.forEach(checkbox => {
if (!checkbox.checked) return;
const checkboxText = checkbox.nextElementSibling.nextElementSibling.innerText;
const addFilterHTML = document.createElement('div');
addFilterHTML.classList.add('filter__add');
addFilterHTML.textContent = checkboxText;
filterAddBox.appendChild(addFilterHTML);
})
})
entry.forEach((change) => {
change.target.classList.toggle('scroll-on', change.isIntersecting);
change.target.classList.toggle('second-classname', change.isIntersecting);
})
function getKeyByValue(object, value) {Эта функция нигде не используется (консольлог не в счёт). Ну и функции нежелательно объявлять внутри условных конструкций.
res = Object.values(result).filter((item)=>item%2 !==0);А здесь пропало ключевое слово объявления переменной. И res тоже не используется.
childArr.map(item => { // перебираю все карточки в корзине
.map() обычно используется не для простого перебора, а чтобы вернуть перебранный массив. в первом селекте 1 авто а во втором 2В этому случае «перебираются» 2 элемента через этот .map().
но после повторного добавления авто в корзину возвращаются удаленные карточки
let getCars = JSON.parse(localStorage.getItem(LSKeyCars) || "[]");
Это записывается один раз. А после очистки корзины не переписывается, если не перезагружать страницу. Поэтому карточки берутся из этой переменной, а не из обновлённых данных storage.const CARS_LIMIT = 2;
const optionsBlock = document.querySelector('.parent');
const cart = document.querySelector('.info');
const addOptionButton = document.querySelector('.add');
const addToCartButton = document.querySelector('.btn');
const clearCartButton = document.querySelector('.delete-all');
addOptionButton.addEventListener('click', addOption);
addToCartButton.addEventListener('click', addItemToCart);
clearCartButton.addEventListener('click', clearCart);
optionsBlock.addEventListener('click', ({ target }) => {
if (target.closest('.remove')) {
target.parentNode.remove();
}
});
function addOption() {
optionsBlock.insertAdjacentHTML('beforeend',
`<div class="child">
<span class="remove">✖</span>
<input type="text" class="model" placeholder="Введите модель авто">
<select class="amount">
<option value="" disabled selected>Количество</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</div>`)
}
function clearCart() {
localStorage.removeItem('cars');
renderCart();
}
function addItemToCart() {
const currentCarsState = getStorageState() ?? [];
const carInfoOptions = [...document.querySelectorAll('.child')];
const carsAmount = currentCarsState.reduce((acc, { carAmount }) => acc + carAmount, 0);
const { carsData, selectedAmount } = carInfoOptions.reduce((acc, carInfo) => {
const carAmount = +carInfo.querySelector('.amount').value;
const carModel = carInfo.querySelector('.model').value;
const currentCarData = {
id: Math.floor(Math.random() * 100), //плохой вариант, т.к. случайные числа могут повторяться
carModel,
carAmount,
};
acc.carsData.push(currentCarData);
acc.selectedAmount += carAmount;
return acc;
}, { carsData: [], selectedAmount: 0 })
if (carsAmount + selectedAmount > CARS_LIMIT) {
alert('Количество автомобилей превышает количество взрослых');
return;
}
localStorage.setItem('cars', JSON.stringify([...currentCarsState, ...carsData]));
renderCart();
}
function getStorageState() {
return JSON.parse(localStorage.getItem('cars'));
}
function renderCart() {
const cartData = getStorageState();
cart.innerHTML = !cartData ? '' : cartData.map(car => `<div class="item" id="${car.id}">
<div class="title">ЛИЧНЫЙ ТРАНСПОРТ</div>
<div>Модель авто: ${car.carModel}</div>
<div>Количество авто: ${car.carAmount}</div>
</div>`).join('');
}
const accordionButtons = document.querySelectorAll('.accordion');
accordionButtons.forEach(button => {
button.addEventListener('click', switchAccordion);
});
function switchAccordion({target}) {
target.classList.toggle('active');
const panel = target.nextElementSibling;
panel.style.maxHeight = (panel.style.maxHeight) ? null : panel.scrollHeight + 'px';
}
switchAccordion({target: accordionButtons[0]});
if (i === 0) {
acc[i].click();
}
const monthData = allData.reduce((acc, { day, speed, distance, wagons }) => {
const yearMonth = day.match(/\d{4}-\d{2}(?=-\d{2})/)[0];
if (acc[yearMonth]) {
acc[yearMonth].speed += speed;
acc[yearMonth].distance += distance;
acc[yearMonth].wagons += wagons;
} else {
acc[yearMonth] = { speed, distance, wagons };
}
return acc;
}, {})
if (item < 0) return;
const response = await fetch(url, options);
const result = await response.json();
if (result.result === 0) return;
currentItem.push(info);
render([info]);
update();
const parentBlock = document.querySelector('.parent-block');
parentBlock.addEventListener('click', ({target}) => {
if (!target.classList.contains('btn')) return;
const allPageSelects = document.querySelectorAll('select');
allPageSelects.forEach(select => {
console.log(select.options[select.selectedIndex].textContent);
});
})
wife: mother
, т.к. объект mother
ещё не существует. А функция работает с уже созданными объектами:const father = {
name: "John",
}
const mother = {
name: "Ann",
}
father.wife = mother;
mother.husband = father;
const family = {father, mother}
function readMore({ target }) {
const item = target.closest('.reference-body-left-item');
const ellipsis = item.querySelector('.reference-body-left-dots');
const hiddenText = item.querySelector('.reference-body-left-more');
const isHiding = target.textContent === 'Скрыть текст';
target.textContent = isHiding ? 'Читать далее' : 'Скрыть текст';
ellipsis.style.display = isHiding ? 'inline' : 'none';
hiddenText.style.display = isHiding ? 'none' : 'inline';
}
const salaryFilter = document.querySelector('.third__filter-item');
const salaryFilterFrom = salaryFilter.querySelector('.third__filter-from');
const salaryFilterTo = salaryFilter.querySelector('.third__filter-to');
const cvBlocks = document.querySelectorAll('.watch__anceta');
salaryFilter.addEventListener('input', filterBySalary);
function filterBySalary() {
cvBlocks.forEach(cvBlock => {
const salary = +cvBlock.querySelector('.watch__price').textContent.match(/\d+/);
const isInRange = salary >= +salaryFilterFrom.value && salary <= +salaryFilterTo.value;
cvBlock.classList.toggle('hide', !isInRange);
})
}
document.querySelector('.third__filter-btn').addEventListener('click', () => {
const filteringItems = document.querySelectorAll('.filter-man, .filter-woman');
const checkedValue = document.querySelector('.third__filter-radio-input:checked').value;
filteringItems.forEach(item => {
const isPassive = checkedValue !== 'all' && !item.classList.contains(`filter-${checkedValue}`);
item.classList.toggle('passive', isPassive);
})
})
document.addEventListener('click', ({target}) => {
if (target.closest('header .ms ul li a') || !target.closest('.ms')) {
document.getElementById('burger').checked = false;
};
});
function renderItem(cardData) {
const newCard = cardTemplate.cloneNode(true);
const cardTitle = newCard.querySelector('.card__title');
const cardImage = newCard.querySelector('.card__image');
cardImage.src = cardData.link;
cardTitle.textContent = cardData.name;
container.append(newCard);
}
renderItem(); //← поэтому семь
render();
const modalButtons = document.querySelectorAll('.button a');
modalButtons.forEach(button => {
button.addEventListener('click', setModalTitle);
})
function setModalTitle({ target }) {
const titleText = target.closest('.item').querySelector('h2').textContent;
const modalTitle = document.querySelector('.modal h3');
target.title = titleText;
modalTitle.textContent = titleText;
}