20.05.2023, 11:15
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,753
|
|
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style>
body {
background-color: #27405C;
font-size: 16px;
font-family: 'Courier New', Courier, monospace;
font-weight: bold;
}
.calculator {
max-width: 200px;
margin: 0px auto 0px;
}
label{
display: flex;
align-items: center;
justify-content: space-between;
}
.total_amount {
font-size: 1.5em;
margin: 20px auto 20px;
color: #946FF2;
}
.sum {
margin-top: 8px;
}
.sum>.number,
.sum>.sum {
margin-left: 15px;
}
</style>
</head>
<body>
<div class="sum calculator">
<div class="total total_amount">
<span class="value"></span>
</div>
<div class="sum">
<label class="total">
<span class="value"></span>
<input type="checkbox" checked="checked">
</label>
<label class="number">
<span class="value">3 000</span>
<input type="checkbox" checked="checked">
</label>
<label class="number">
<span class="value">5 000</span>
<input type="checkbox" checked="checked">
</label>
</div>
<div class="sum">
<label class="total">
<span class="value"></span>
<input type="checkbox" checked="checked">
</label>
<label class="number">
<span class="value">4 000</span>
<input type="checkbox" checked="checked">
</label>
<div class="sum">
<label class="total">
<span class="value"></span>
<input type="checkbox" checked="checked">
</label>
<label class="number">
<span class="value">1 500</span>
<input type="checkbox" checked="checked">
</label>
<label class="number">
<span class="value">7 500</span>
<input type="checkbox" checked="checked">
</label>
</div>
</div>
</div>
<script>
const digits = n => n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ");
const getValue = (elem) => {
if (elem.classList.contains('number')) {
return elem.querySelector('input').checked
? +elem.querySelector('.value').textContent.replace(/\s/g, '')
: 0
} else if (elem.classList.contains('sum')) {
sum(elem);
const total = elem.querySelector(':scope>.total');
return total.querySelector('input').checked
? +total.querySelector('.value').textContent.replace(/\s/g, '')
: 0
}
}
const sum = (elem) => {
const total = elem.querySelector('.total');
const sumElems = [...elem.querySelectorAll(':scope>.sum,:scope>.number')];
const s = sumElems.reduce((a, el) => a + getValue(el), 0);
total.querySelector('.value').textContent = digits(s);
}
const setCheckedSum = (elem, checked) => {
const total = elem.querySelector('.total');
const elems = [...elem.querySelectorAll(':scope>.sum,:scope>.number')];
if (total) {
total.querySelector('input').checked = checked;
}
elems.forEach (el => {
if (el.classList.contains('number')) {
el.querySelector('input').checked = checked;
} else if (el.classList.contains('sum')) {
setCheckedSum(el, checked);
}
})
}
const testChecked = (elem) => {
if (elem.classList.contains('number'))
return elem.querySelector('input').checked;
const total = elem.querySelector('.total');
const elems = [...elem.querySelectorAll(':scope>.sum,:scope>.number')];
const checked = elems.reduce ((ch, el) => testChecked(el) || ch, false)
const input = total.querySelector('input');
if (input) input.checked = checked;
return checked;
}
const calculator = document.querySelector('.calculator');
sum(calculator);
calculator.addEventListener('change', ev => {
const {target} = ev;
const el = target.closest('.total');
if (el) {
const sum = el.closest('.sum');
setCheckedSum(sum, target.checked);
} else {
testChecked(calculator);
}
sum(calculator);
})
</script>
</body>
</html>
|
|
20.05.2023, 12:05
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,129
|
|
voraa,
|
|
20.05.2023, 12:09
|
Профессор
|
|
Регистрация: 01.06.2010
Сообщений: 668
|
|
voraa,
я же правильно понял что она работает по принципу
<!-- общая сумма sum > sum > sum -->
|
|
20.05.2023, 13:03
|
Профессор
|
|
Регистрация: 01.06.2010
Сообщений: 668
|
|
Я тут не много дописал код и у меня вопрос
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style>
body {
background-color: #27405C;
font-size: 16px;
font-family: 'Courier New', Courier, monospace;
font-weight: bold;
}
.history_plus{
font-size: 1.5em;
margin: 20px auto 20px;
color: #946FF2;
}
.future_plus{
font-size: 1.5em;
margin: 20px auto 20px;
color: #946FF2;
}
.history_minus{
font-size: 1.5em;
margin: 20px auto 20px;
color: #946FF2;
}
.future_minus{
font-size: 1.5em;
margin: 20px auto 20px;
color: #946FF2;
}
.calculator {
max-width: 200px;
margin: 0px auto 0px;
}
label {
display: flex;
align-items: center;
justify-content: space-between;
}
.total_amount {
font-size: 1.5em;
margin: 20px auto 20px;
color: #946FF2;
}
.sum {
margin-top: 8px;
}
.sum>.number,
.sum>.sum {
margin-left: 15px;
}
</style>
</head>
<body>
<div class="sum calculator">
<div class="history_minus">
38 000
</div>
<div class="total total_amount">
<span class="value"></span><!-- общая сумма sum > sum > sum -->
</div>
<div class="future_minus">
<!-- 17 000 -->
</div>
<div class="sum">
<label class="total">
<span class="value"></span><!-- общая сумма -->
<input type="checkbox" checked="checked">
</label>
<label class="number">
<span class="value">3 000</span>
<input type="checkbox" checked="checked">
</label>
<label class="number">
<span class="value">5 000</span>
<input type="checkbox" checked="checked">
</label>
</div>
<div class="sum">
<label class="total">
<span class="value"></span><!-- общая сумма sum > sum -->
<input type="checkbox" checked="checked">
</label>
<label class="number">
<span class="value">4 000</span>
<input type="checkbox" checked="checked">
</label>
<div class="sum">
<label class="total">
<span class="value"></span><!-- общая сумма sum -->
<input type="checkbox" checked="checked">
</label>
<label class="number">
<span class="value">1 500</span>
<input type="checkbox" checked="checked">
</label>
<label class="number">
<span class="value">7 500</span>
<input type="checkbox" checked="checked">
</label>
</div>
</div>
</div>
<script>
const historyPlus = document.querySelector(".history_plus");
const historyMinus = document.querySelector(".history_minus");
const futurePlus = document.querySelector(".future_plus");
const futureMinus = document.querySelector(".future_minus");
const totalAmount = document.querySelector(".total_amount");
const digits = n => n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ");
const getValue = (elem) => {
if (elem.classList.contains('number')) {
return elem.querySelector('input').checked
? +elem.querySelector('.value').textContent.replace(/\s/g, '')
: 0
} else if (elem.classList.contains('sum')) {
sum(elem);
const total = elem.querySelector(':scope>.total');
return total.querySelector('input').checked
? +total.querySelector('.value').textContent.replace(/\s/g, '')
: 0
}
}
const sum = (elem) => {
const total = elem.querySelector('.total');
const sumElems = [...elem.querySelectorAll(':scope>.sum,:scope>.number')];
const s = sumElems.reduce((a, el) => a + getValue(el), 0);
total.querySelector('.value').textContent = digits(s);
}
const setCheckedSum = (elem, checked) => {
const total = elem.querySelector('.total');
const elems = [...elem.querySelectorAll(':scope>.sum,:scope>.number')];
if (total) {
total.querySelector('input').checked = checked;
}
elems.forEach(el => {
if (el.classList.contains('number')) {
el.querySelector('input').checked = checked;
} else if (el.classList.contains('sum')) {
setCheckedSum(el, checked);
}
})
}
const testChecked = (elem) => {
if (elem.classList.contains('number'))
return elem.querySelector('input').checked;
const total = elem.querySelector('.total');
const elems = [...elem.querySelectorAll(':scope>.sum,:scope>.number')];
const checked = elems.reduce((ch, el) => testChecked(el) || ch, false)
const input = total.querySelector('input');
if (input) input.checked = checked;
return checked;
}
const calculator = document.querySelector('.calculator');
sum(calculator);
calculator.addEventListener('change', ev => {
const { target } = ev;
const el = target.closest('.total');
if (el) {
const sum = el.closest('.sum');
setCheckedSum(sum, target.checked);
} else {
testChecked(calculator);
}
sum(calculator);
const result = Number(historyMinus.textContent.replace(/\s/g, '')) - Number(totalAmount.textContent.replace(/\s/g, ''));
futureMinus.textContent = digits(result);
})
</script>
</body>
</html>
Не большую часть которая просто минусует суммы.
Как мне сделать так что бы блок futureMinus сразу же отображался при загрузки старинцы, а не ждал пока кликнут на чекбокс
|
|
20.05.2023, 13:48
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,753
|
|
Я не могу что то делать и обдумывать, когда задача ставится по кускам.
Только начинаешь понимать и придумываешь алгоритм, как оказывается надо еще что то, к чему данный алгоритм не очень подходит.
Да и постановку задачи надо излагать четче.
Я так и не понял, что должно быть в futureMinus
Я просто на данном примере показал, как с помощью querySelectorAll искать непосредственно детей (через :scope>)
И то что для данной задачи, где одинаковые блоки информации вложены друг в друга нужна рекурсия.
Последний раз редактировалось voraa, 20.05.2023 в 13:51.
|
|
20.05.2023, 13:54
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,129
|
|
voraa,
есть некая базовое число -- вычисленные суммы должны вычитаться из этого числа.
|
|
20.05.2023, 14:00
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,753
|
|
Сообщение от рони
|
вычисленные суммы должны вычитаться из этого числа.
|
сумм ы или сумм а?
|
|
20.05.2023, 14:04
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,129
|
|
voraa,
строка 149
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style>
body {
background-color: #27405C;
font-size: 16px;
font-family: 'Courier New', Courier, monospace;
font-weight: bold;
}
.history_plus {
font-size: 1.5em;
margin: 20px auto 20px;
color: #946FF2;
}
.future_plus {
font-size: 1.5em;
margin: 20px auto 20px;
color: #946FF2;
}
.history_minus {
font-size: 1.5em;
margin: 20px auto 20px;
color: #946FF2;
}
.future_minus {
font-size: 1.5em;
margin: 20px auto 20px;
color: #946FF2;
}
.calculator {
max-width: 200px;
margin: 0px auto 0px;
}
label {
display: flex;
align-items: center;
justify-content: space-between;
}
.total_amount {
font-size: 1.5em;
margin: 20px auto 20px;
color: #946FF2;
}
.sum {
margin-top: 8px;
}
.sum>.number,
.sum>.sum {
margin-left: 15px;
}
</style>
</head>
<body>
<div class="sum calculator">
<div class="history_minus">
38 000
</div>
<div class="total total_amount">
<span class="value"></span>
<!-- общая сумма sum > sum > sum -->
</div>
<div class="future_minus">
<!-- 17 000 -->
</div>
<div class="sum">
<label class="total">
<span class="value"></span><!-- общая сумма -->
<input type="checkbox" checked="checked">
</label>
<label class="number">
<span class="value">3 000</span>
<input type="checkbox" checked="checked">
</label>
<label class="number">
<span class="value">5 000</span>
<input type="checkbox" checked="checked">
</label>
</div>
<div class="sum">
<label class="total">
<span class="value"></span><!-- общая сумма sum > sum -->
<input type="checkbox" checked="checked">
</label>
<label class="number">
<span class="value">4 000</span>
<input type="checkbox" checked="checked">
</label>
<div class="sum">
<label class="total">
<span class="value"></span><!-- общая сумма sum -->
<input type="checkbox" checked="checked">
</label>
<label class="number">
<span class="value">1 500</span>
<input type="checkbox" checked="checked">
</label>
<label class="number">
<span class="value">7 500</span>
<input type="checkbox" checked="checked">
</label>
</div>
</div>
</div>
<script>
const historyPlus = document.querySelector(".history_plus");
const historyMinus = document.querySelector(".history_minus");
const futurePlus = document.querySelector(".future_plus");
const futureMinus = document.querySelector(".future_minus");
const totalAmount = document.querySelector(".total_amount");
const numHistoryMinus = Number(historyMinus.textContent.replace(/\s/g, ''));
const digits = n => n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ");
const getValue = (elem) => {
if (elem.classList.contains('number')) {
return elem.querySelector('input').checked ?
+elem.querySelector('.value').textContent.replace(/\s/g, '') :
0
} else if (elem.classList.contains('sum')) {
sum(elem);
const total = elem.querySelector(':scope>.total');
return total.querySelector('input').checked ?
+total.querySelector('.value').textContent.replace(/\s/g, '') :
0
}
}
const sum = (elem) => {
const total = elem.querySelector('.total');
const sumElems = [...elem.querySelectorAll(':scope>.sum,:scope>.number')];
const s = sumElems.reduce((a, el) => a + getValue(el), 0);
total.querySelector('.value').textContent = digits(s);
futureMinus.textContent = digits(numHistoryMinus - s);
}
const setCheckedSum = (elem, checked) => {
const total = elem.querySelector('.total');
const elems = [...elem.querySelectorAll(':scope>.sum,:scope>.number')];
if (total) {
total.querySelector('input').checked = checked;
}
elems.forEach(el => {
if (el.classList.contains('number')) {
el.querySelector('input').checked = checked;
} else if (el.classList.contains('sum')) {
setCheckedSum(el, checked);
}
})
}
const testChecked = (elem) => {
if (elem.classList.contains('number'))
return elem.querySelector('input').checked;
const total = elem.querySelector('.total');
const elems = [...elem.querySelectorAll(':scope>.sum,:scope>.number')];
const checked = elems.reduce((ch, el) => testChecked(el) || ch, false)
const input = total.querySelector('input');
if (input) input.checked = checked;
return checked;
}
const calculator = document.querySelector('.calculator');
sum(calculator);
calculator.addEventListener('change', ev => {
const {
target
} = ev;
const el = target.closest('.total');
if (el) {
const sum = el.closest('.sum');
setCheckedSum(sum, target.checked);
} else {
testChecked(calculator);
}
sum(calculator);
})
</script>
</body>
</html>
|
|
20.05.2023, 14:06
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,753
|
|
Ну сделать функцию
const substract = () => {
const result = Number(historyMinus.textContent.replace(/\s/g, '')) - Number(totalAmount.textContent.replace(/\s/g, ''));
futureMinus.textContent = digits(result);
}
И вызывать ее после строк 189 и200
Ну можно и так - впихнуть это в sum.
|
|
20.05.2023, 18:06
|
Профессор
|
|
Регистрация: 01.06.2010
Сообщений: 668
|
|
voraa,
А как пофиксить вот этот
то есть когда 9 000 выбирается то итоговой сумме не видны изменения
Снять все галочки и нажать только на 9 000
https://postimg.cc/9R6HwvWF
почему то через img картинка не вставилась, прямая ссылка на картинку
Последний раз редактировалось Сергей Ракипов, 20.05.2023 в 18:09.
|
|
|
|