<!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> |
voraa,
:victory: |
voraa,
я же правильно понял что она работает по принципу <!-- общая сумма sum > sum > sum --> |
Я тут не много дописал код и у меня вопрос
<!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 сразу же отображался при загрузки старинцы, а не ждал пока кликнут на чекбокс |
Я не могу что то делать и обдумывать, когда задача ставится по кускам.
Только начинаешь понимать и придумываешь алгоритм, как оказывается надо еще что то, к чему данный алгоритм не очень подходит. Да и постановку задачи надо излагать четче. Я так и не понял, что должно быть в futureMinus Я просто на данном примере показал, как с помощью querySelectorAll искать непосредственно детей (через :scope>) И то что для данной задачи, где одинаковые блоки информации вложены друг в друга нужна рекурсия. |
voraa,
есть некая базовое число -- вычисленные суммы должны вычитаться из этого числа. |
Цитата:
|
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> |
Ну сделать функцию
const substract = () => { const result = Number(historyMinus.textContent.replace(/\s/g, '')) - Number(totalAmount.textContent.replace(/\s/g, '')); futureMinus.textContent = digits(result); } И вызывать ее после строк 189 и200 Ну можно и так - впихнуть это в sum. |
voraa,
А как пофиксить вот этот то есть когда 9 000 выбирается то итоговой сумме не видны изменения Снять все галочки и нажать только на 9 000 https://postimg.cc/9R6HwvWF почему то через img картинка не вставилась, прямая ссылка на картинку |
Часовой пояс GMT +3, время: 04:30. |