Математика в JS
Есть вот такая верстка
<style> body { font-family: monospace; font-size: .8rem; } main { max-width: 720px; margin: 0 auto; } section{ max-width: 480px; margin: 0px auto 0px; } .total_all { margin: 40px 0px 40px 0px; font-size: 2rem; } .summa__1 { margin: 40px 0px 0px 0px; font-size: 1.2rem; } .number_1 { padding: 0px 0px 0px 20px; } .summa__2 { margin: 40px 0px 0px 0px; font-size: 1.2rem; } .number_2 { padding: 0px 0px 0px 20px; } .summa__3 { margin: 40px 0px 0px 0px; font-size: 1.2rem; } .number_3 { padding: 0px 0px 0px 20px; } .summa__4 { margin: 40px 0px 0px 0px; font-size: 1.2rem; } .number_4 { padding: 0px 0px 0px 20px; } </style> <body> <section> <div class="total_all">32 000</div> <div class="summa__1"> <label class="container">8 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_1"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_1"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_1"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_1"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="summa__2"> <label class="container">8 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_2"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_2"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_2"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_2"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="summa__3"> <label class="container">8 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_3"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_3"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_3"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_3"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="summa__4"> <label class="container">8 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_4"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_4"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_4"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_4"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> </section> <script> const num = parseInt(document.querySelector('.total_all').innerHTML.replace(/\s/g, '')); const summa__1 = parseInt(document.querySelector('.summa__1>.container').innerHTML.replace(/\s/g, '')); const number_1 = parseInt(document.querySelector('.number_1>.container').innerHTML.replace(/\s/g, '')); </script> </body> |
То есть у меня цифры из блока должны плюсоваться или минусоваться в зависимости от того в каком состоянии чекбокс, если он выбран то его плюсуют если не выбран то он минусуется
К примеру есть четыре блока по 2 000 в сумме 8 000 если убрать у кого то чекбокс то будет минус 2 000 И есть четыре блока по 8 000 в сумме 32 000 если убрать чекбок у блока где 8 000 то и от 32 000 сминусуется. |
суммирование выбранного
Сергей Ракипов,
если ещё изменить разметку, то код можно будет сократить. <!DOCTYPE HTML> <html> <head> <title>Untitled</title> </head> <body> <style> body { font-family: monospace; font-size: .8rem; } main { max-width: 720px; margin: 0 auto; } section { max-width: 480px; margin: 0px auto 0px; } .total_all { margin: 40px 0px 40px 0px; font-size: 2rem; } .summa { margin: 40px 0px 0px 0px; font-size: 1.2rem; } .number { padding: 0px 0px 0px 20px; } .summa>.container { margin-left: 20px; } .summa>.container input { margin-left: 15px; } </style> <body> <section> <div class="total_all"></div> <div class="summa"> <label class="container"> <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> </div> <div class="summa"> <label class="container"> <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> </div> <div class="summa"> <label class="container"> <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> </div> <div class="summa"> <label class="container"> <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> </div> </section> <script> const section = document.querySelector('section'); const total = document.querySelector('.total_all'); const digits = n => n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ") section.addEventListener('change', function() { let num = 0; for (const div of document.querySelectorAll('.summa')) { const checked = div.querySelector('input:first-child').checked; let n = [...div.querySelectorAll('.number :checked')].reduce((n, { previousSibling }) => n + +previousSibling.data.replace(/\s/g, ''), 0) for (const el of div.querySelector(':first-child').childNodes) if (el.nodeType === 3) el.remove() div.querySelector(':first-child').prepend(digits(n)); if (checked) num += n } total.textContent = digits(num); }) let event = new Event("change"); section.dispatchEvent(event); </script> </body> </body> </html> |
Спасибо! От всего сердце спасибо.
Цитата:
|
Цитата:
<span class="num">2000...8000</span> |
рони,
А как сделать что бы когда я 8 000 убираю чекбокс что бы и у нижних 2 000 тоже убирались. А то выглядит так что 8 000 убрал а внизу чекбоксы остались |
Цитата:
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style> body { font-family: monospace; font-size: .8rem; } main { max-width: 720px; margin: 0 auto; } section { max-width: 480px; margin: 0px auto 0px; } .total_all { margin: 40px 0px 40px 0px; font-size: 2rem; } .sum label { display: block; width: 150px; text-align: right; } .sum { font-size: 1.2rem; display: flex; flex-direction: column; justify-content: center; } .all .num { color: red; } </style> </head> <body> <section> <div class="total_all"></div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> </section> <script> const section = document.querySelector('section'); const total = document.querySelector('.total_all'); const digits = n => n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ") section.addEventListener('change', function({ target }) { let input = target.closest('input'); if (input) { let all = target.closest('.all input'); if (all) target.closest('.sum').querySelectorAll('.number input').forEach(input => (input.checked = all.checked)) else if (target.checked) target.closest('.sum').querySelector('.all input').checked = true; else target.closest('.sum').querySelector('.all input').checked = target.closest('.sum').querySelector('.number :checked') } let num = 0; for (const div of document.querySelectorAll('.sum')) { const checked = div.querySelector('.all input').checked; let n = [...div.querySelectorAll('.number')].reduce((n, label) => { let input = label.querySelector('input'); let up = +label.querySelector('.num').textContent.replace(/\s/g, ''); return input.checked ? n + up : n } , 0) div.querySelector('.all .num').textContent = digits(n); if (checked) num += n } total.textContent = digits(num); }) let event = new Event("change"); section.dispatchEvent(event); </script> </body> </html> |
рони,
Красота!!! |
рони,
А получается что если мне нужно два section на одной странице оно не будет работать, можно как то сделать что если я два section использую на оной странице они работают не зависимо. можно не section а какой то класс то есть если у них общий класс то это и будут границы работы этого скрипта |
рони,
То есть я могу сделать это, но код просто в два раза увеличится, так как я просто поменяю название переменных и классов. |
Цитата:
заменить на for в строку 132, и уточнить переменные согласно этому циклу - строка 133 и подобные, и всё. |
Цитата:
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style> body { font-family: monospace; font-size: .8rem; } main { max-width: 720px; margin: 0 auto; } .calculation { max-width: 480px; margin: 0px auto 0px; display: flex; flex-direction: column; } .total_all { margin: 10px auto; font-size: 2rem; } .sum label { display: block; text-align: right; margin: 0 auto; } .sum { font-size: 1.2rem; display: flex; flex-direction: column; margin: 5px auto; } .all .num { color: red; } </style> </head> <body> <section class="calculation"> <div class="total_all"></div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> </section> <section class="calculation"> <div class="total_all"></div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> </section> <script> const digits = n => n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " "); for(const section of document.querySelectorAll('.calculation')) { const total = section.querySelector('.total_all'); section.addEventListener('change', function({ target }) { let input = target.closest('input'); if (input) { let all = target.closest('.all input'); if (all) target.closest('.sum').querySelectorAll('.number input').forEach(input => (input.checked = all.checked)) else if (target.checked) target.closest('.sum').querySelector('.all input').checked = true; else target.closest('.sum').querySelector('.all input').checked = target.closest('.sum').querySelector('.number :checked') } let num = 0; for (const div of section.querySelectorAll('.sum')) { const checked = div.querySelector('.all input').checked; let n = [...div.querySelectorAll('.number')].reduce((n, label) => { let input = label.querySelector('input'); let up = +label.querySelector('.num').textContent.replace(/\s/g, ''); return input.checked ? n + up : n } , 0) div.querySelector('.all .num').textContent = digits(n); if (checked) num += n } total.textContent = digits(num); }) let event = new Event("change"); section.dispatchEvent(event);} </script> </body> </html> |
рони,
:thanks: спасибо, вы столько раз мне подарили чувства благодарности в течении не одного года, спасибо!! |
Не получается у меня сложить конечный результат.
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style> body { font-family: monospace; font-size: .8rem; } main { max-width: 720px; margin: 0 auto; } .calculation { max-width: 480px; margin: 0px auto 0px; display: flex; flex-direction: column; } .total_all { margin: 10px auto; font-size: 2rem; } .sum label { display: block; text-align: right; margin: 0 auto; } .sum { font-size: 1.2rem; display: flex; flex-direction: column; margin: 5px auto; } .all .num { color: red; } .details{ font-size: .8; color: grey; } </style> </head> <body> <section class="calculation"> <p>С прошлой встречи 10 000</p> <p>Приход</p> <div class="total_all"> </div> <p>Итого</p> <div class="total_minus"> 22 000 </div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">1 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">1 000</span> <input type="checkbox" checked="checked"> </label> </div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">1 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">1 000</span> <input type="checkbox" checked="checked"> </label> </div> </section> <section class="calculation"> <p>Итого 22 000</p> <p>Расходы</p> <div class="total_all"> </div> <div class="total"> </div> Остаток после расходов <div class="total_plus"> 14 000 </div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> Командировка <label class="number"> <span class="num">4 000</span> <input type="checkbox" checked="checked"> </label> <div class="details"> Проезд <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> Проживание <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> </div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">1 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">1 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">1 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">1 000</span> <input type="checkbox" checked="checked"> </label> </div> </section> <script> const digits = n => n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " "); for (const section of document.querySelectorAll('.calculation')) { const total = section.querySelector('.total_all'); section.addEventListener('change', function ({ target }) { console.log("target", target); let input = target.closest('input'); console.log("input", input); if (input) { let all = target.closest('.all input'); console.log("all", all); if (all) { let sum = target.closest('.sum').querySelectorAll('.number input').forEach(input => (input.checked = all.checked)); console.log("sum1", sum) } else if (target.checked) { let sum = target.closest('.sum').querySelector('.all input').checked = true console.log("sum2", sum) } else { let sum = target.closest('.sum').querySelector('.all input') target.closest('.sum').querySelector('.all input').checked = target.closest('.sum').querySelector('.number :checked') console.log("sum3", sum) } } let num = 0; console.log("section", section); for (const div of section.querySelectorAll('.sum')) { const checked = div.querySelector('.all input').checked; let n = [...div.querySelectorAll('.number')].reduce((n, label) => { let input = label.querySelector('input'); let up = Number(label.querySelector('.num').textContent.replace(/\s/g, '')); return input.checked ? n + up : n } , 0) div.querySelector('.all .num').textContent = digits(n); if (checked) num += n } total.textContent = digits(num); }) let event = new Event("change"); section.dispatchEvent(event); } </script> </body> </html> Вот первый блок section он отображает ПРИХОД и если я нажимаю галочки то и в блоке total_minus происходят изменения то есть убираю 2 000 то в total_minus становится 20 000 А во втором блоке тоже самое только если я убираю расходы то в блоке total_plus происходит измение к примеру я убираю галочку 1 000 то и в total_plus становится 15 000 И еще пункт который расписывает так же галочками более подробно то есть командировочные 4 000 в них входит 2 000 проезд и 2 000 проживание измение на галочках так же меняет все цифры. |
Я вроде разорался в коде, и начал делать все правильно. Но ломается, а ошибки нет.
Я заново его написал, с теми задачами которые я поставил. Но он не работает до конца. То есть он не возращает сумму когда поставил галочку. Там конечно нужно дальше код писать, но принцип понятен. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> body{ font-size: 1rem; font-family: 'Courier New', Courier, monospace; } .calculation { margin: 0px auto 0px; max-width: 280px; } .total { margin: 20px 0px 20px 0px; font-size: 1.2rem; } .balance { padding: 5px 0px 5px 0px; } .arrival { padding: 5px 0px 5px 0px; } .total_amount { padding: 5px 0px 5px 0px; } .aumont { margin: 20px 0px 20px 0px; font-weight: 900; } .aumont_title { } .number { } .sum { } .checkbox { } .details_block { padding: 10px 0px 0px 20px; color: grey; font-size: .8rem; font-weight: 400; } .details { padding: 5px 0px 5px 0px; } .description { } </style> </head> <body> <div class="calculation"> <div class="total"> <div class="balance"> <div class="balance_title"> Остаток с прошлого собрания </div> <div class="balance_sum"> 10 000 </div> </div> <div class="arrival"> <div class="arrival_title"> Приход на текущее собрания </div> <div class="arrival_sum"> </div> </div> <div class="total_amount"> <div class="total_amount_title"> Общая сумма </div> <div class="total_amount_sum"> 22 000 </div> </div> </div> <div class="aumont summa"> <div class="aumont_title"> Предстовитель №1 </div> <label class="all_sum number"> <span class="sum"> 6 000 </span> <input type="checkbox" checked="checked" class="checkbox"> </label> <div class="details_block"> <div class="details"> <label class="number_details"> <span class="sum_details">3 000</span> <input type="checkbox" checked="checked" class="checkbox"> </label> <div class="description"> Проезд </div> </div> <div class="details"> <label class="number_details"> <span class="sum_details">3 000</span> <input type="checkbox" checked="checked" class="checkbox"> </label> <div class="description"> Проживание </div> </div> </div> </div> <div class="aumont summa"> <div class="aumont_title"> Предстовитель №2 </div> <label class="all_sum number"> <span class="sum"> 4 000 </span> <input type="checkbox" checked="checked" class="checkbox"> </label> <div class="details_block"> <div class="details"> <label class="number_details"> <span class="sum_details">2 000</span> <input type="checkbox" checked="checked" class="checkbox"> </label> <div class="description"> Проезд </div> </div> <div class="details"> <label class="number_details"> <span class="sum_details">2 000</span> <input type="checkbox" checked="checked" class="checkbox"> </label> <div class="description"> Проживание </div> </div> </div> </div> <div class="aumont summa"> <div class="aumont_title"> Предстовитель № 3 </div> <label class="all_sum number"> <span class="sum"> 2 000 </span> <input type="checkbox" checked="checked" class="checkbox"> </label> <div class="details_block"> <div class="details"> <label class="number_details"> <span class="sum_details">1 000</span> <input type="checkbox" checked="checked" class="checkbox"> </label> <div class="description"> Проезд </div> </div> <div class="details"> <label class="number_details"> <span class="sum_details">1 000</span> <input type="checkbox" checked="checked" class="checkbox"> </label> <div class="description"> Проживание </div> </div> </div> </div> </div> <script> const balanceSum = document.querySelector(".balance_sum"); // const arrivalSum = document.querySelector(".arrival_sum"); const totalAmountSum = document.querySelector(".total_amount_sum"); // const calculation = document.querySelectorAll(".calculation"); const sum = document.querySelectorAll(".sum"); const sumDetails = document.querySelectorAll(".sum_details"); const digits = n => n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " "); for (const calculation of document.querySelectorAll('.calculation')) { const arrivalSum = document.querySelector(".arrival_sum"); calculation.addEventListener('change', function ({ target }) { let input = target.closest('input'); if (input) { let all_sum = target.closest('.all_sum input'); if (all_sum) target.closest('.summa').querySelectorAll('.number input').forEach(input => (input.checked = all_sum.checked)) else if (target.checked) target.closest('.summa').querySelector('.all_sum input').checked = true; else target.closest('.summa').querySelector('.all_sum input').checked = target.closest('.summa').querySelector('.number :checked') } let sum = 0; for (const div of calculation.querySelectorAll('.summa')) { const checked = div.querySelector('.all_sum input').checked; let n = [...div.querySelectorAll('.number')].reduce((n, label) => { let input = label.querySelector('input'); let up = + label.querySelector('.sum').textContent.replace(/\s/g, ''); return input.checked ? n + up : n } , 0) div.querySelector('.all_sum .sum').textContent = digits(n); if (checked) sum += n } arrivalSum.textContent = digits(sum); }) let event = new Event("change"); calculation.dispatchEvent(event); } </script> </body> </html> Почему сумма не возвращается когда поставил галочку? |
Все решил проблему, разбираюсь дальше
|
Сергей Ракипов,
:victory: |
Вот я все понимаю как оно работает и знаю из за чего у меня не получается. Но не получается сложить математику.
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style> body { font-family: monospace; font-size: 1rem; } main { max-width: 720px; margin: 0 auto; } section { max-width: 480px; margin: 0px auto 0px; } .total_all { margin: 40px 0px 40px 0px; font-size: 2rem; } .sum label { display: block; width: 150px; text-align: right; } .sum { display: flex; flex-direction: column; justify-content: center; padding: 0px 0px 0px 0px; } .all { padding: 10px 0px 10px 0px; } .all .num {} .color { color: rebeccapurple; } .podrobnee { padding: 0px 0px 0px 20px; } .razdel { padding: 30px 0px 30px 0px; } </style> </head> <body> <section class="section"> <div class="total_all"></div> <div class="sum razdel"> <label class="all color"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">4 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">4 000</span> <input type="checkbox" checked="checked"> </label> </div> <div class="sum"> <label class="all color"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <div class="podrobnee"> <label class="number"> <span class="num">3 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">3 000</span> <input type="checkbox" checked="checked"> </label> </div> </div> </div> </section> <script> const section = document.querySelector('.section'); const total = document.querySelector('.total_all'); const digits = n => n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ") section.addEventListener('change', function ({ target }) { let input = target.closest('input'); if (input) { let all = target.closest('.all input'); if (all) target.closest('.sum').querySelectorAll('.number input').forEach(input => (input.checked = all.checked)) else if (target.checked) target.closest('.sum').querySelector('.all input').checked = true; else target.closest('.sum').querySelector('.all input').checked = target.closest('.sum').querySelector('.number :checked') } let num = 0; for (const div of document.querySelectorAll('.sum')) { const checked = div.querySelector('.all input').checked; let n = [...div.querySelectorAll('.number')].reduce((n, label) => { let input = label.querySelector('input'); let up = +label.querySelector('.num').textContent.replace(/\s/g, ''); return input.checked ? n + up : n } , 0) div.querySelector('.all .num').textContent = digits(n); if (checked) num += n } total.textContent = digits(num); }) let event = new Event("change"); section.dispatchEvent(event); </script> </body> </html> То есть у меня all лишний раз складывает. Итоговая сумма должна быть 16 000 но получается 22 000 из за того что all лишний раз сложился. И я пробую по разному но у меня не получается правильно сложить. |
Сергей Ракипов,
слишком много зависимостей ... :( |
Цитата:
|
Сергей Ракипов,
да другой код, другой подход. некий объект например, и отображать его "текущее дерево состояний" |
Вот такая структура будет нормальная, тут просто структура верстки.
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style> body { font-size: 1.2rem; font-family: 'Courier New', Courier, monospace; font-weight: 900; } .calculator { max-width: 320px; margin: 0px auto 0px; display: flex; flex-direction: column; } .total_amount { max-width: 320px; margin: 20px auto 20px; color: #F288B4; } .level_one { color: #946FF2; padding: 10px 0px 10px 10px; margin: 0px 0px 20px 0px; border-left: solid 1px #946FF2; } .sum_all_level_one { display: block; padding: 0px 0px 2px 0px; } .num_level_one {} .level_two { color: #F47B5E; display: flex; flex-direction: column; padding: 0px 0px 0px 10px; border-left: solid 1px #F47B5E; } .num_level_two {} .level_three { color: #F2C463; display: flex; flex-direction: column; padding: 0px 0px 0px 10px; border-left: solid 1px #F2C463; } </style> </head> <body> <div class="total_amount"> 16 000 </div> <div class="calculator"> <div class="level_one"> <label class="sum_all_level_one"> <span class="num_level_one"> 8 000 </span> <input type="checkbox" checked="checked" class="checkbox level__1"> </label> <div class="level_two"> <label class="number"> <span class="num_level_two"> 4 000 </span> <input type="checkbox" checked="checked" class="checkbox level__2"> </label> <label class="number"> <span class="num_level_two"> 4 000 </span> <input type="checkbox" checked="checked" class="checkbox level__2"> </label> </div> </div> <div class="level_one"> <label class="sum_all_level_one"> <span class="num_level_one"> 8 000 </span> <input type="checkbox" checked="checked" class="checkbox level__1"> </label> <div class="level_two"> <label class="number"> <span class="num_level_two"> 2 000 </span> <input type="checkbox" checked="checked" class="checkbox level__2"> </label> </div> <div class="level_two"> <label class="number"> <span class="num_level_two sum_all_level_two"> 6 000 </span> <input type="checkbox" checked="checked" class="checkbox level__2"> </label> <div class="level_three"> <label class="number"> <span class="num_level_two"> 3 000 </span> <input type="checkbox" checked="checked" class="checkbox level__3"> </label> <label class="number"> <span class="num_level_two"> 3 000 </span> <input type="checkbox" checked="checked" class="checkbox level__3"> </label> </div> </div> </div> </div> <script> const calculator = document.querySelector('.calculator'); const levelOne = document.querySelector('.level_one'); calculator.addEventListener('change', function ({ target }) { console.log(target); console.log(target.className); if(target.classList.contains("level__1")){ console.log("Клик level_one"); let levelOneChildren = target.querySelectorAll(".level_two") // let levelOneChildren = levelOne.childNodes // let levelOneChildren = levelOne.children console.log(levelOneChildren) } }) </script> </body> </html> |
И как при клике на чекбокс вывести имена детей
|
Сергей Ракипов,
let levelOneChildren = target.closest('.level_one').querySelectorAll(".level_two") |
рони,
А почему так? <!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style> body { background-color: #27405C; font-size: 15px; font-family: 'Courier New', Courier, monospace; font-weight: bold; } label{ display: flex; align-items: center; justify-content: space-between; } .calculator { max-width: 110px; margin: 0px auto 0px; display: flex; flex-direction: column; } .total_amount { max-width: 220px; margin: 20px auto 20px; color: #946FF2; } .level_one { color: #2189FF; padding: 10px 0px 10px 10px; margin: 0px 0px 10px 0px; border-left: solid 1px #2189FF; } .sum_all_level_one { padding: 0px 0px 2px 0px; } .num_level_one {} .level_two { color: #1D76DB; display: flex; flex-direction: column; padding: 0px 0px 0px 10px; border-left: solid 1px #1D76DB; } .num_level_two {} .level_three { color: #619DE1; display: flex; flex-direction: column; padding: 0px 0px 0px 10px; border-left: solid 1px #619DE1; } </style> </head> <body> <div class="total_amount"> 21 000 </div> <div class="calculator"> <div class="level_one"> <label class="sum_all_level_one"> <span class="num_level_one"> 8 000 </span> <input type="checkbox" checked="checked" class="checkbox level__1"> </label> <div class="level_two"> <label class="number"> <span class="num_level_two"> 3 000 </span> <input type="checkbox" checked="checked" class="checkbox level__2"> </label> <label class="number"> <span class="num_level_two"> 5 000 </span> <input type="checkbox" checked="checked" class="checkbox level__2"> </label> </div> </div> <div class="level_one"> <label class="sum_all_level_one"> <span class="num_level_one"> 13 000 </span> <input type="checkbox" checked="checked" class="checkbox level__1"> </label> <div class="level_two"> <label class="number"> <span class="num_level_two"> 4 000 </span> <input type="checkbox" checked="checked" class="checkbox level__2"> </label> </div> <div class="level_two"> <label class="number"> <span class="num_level_two sum_all_level_two"> 9 000 </span> <input type="checkbox" checked="checked" class="checkbox level__2"> </label> <div class="level_three"> <label class="number"> <span class="num_level_two"> 1 500 </span> <input type="checkbox" checked="checked" class="checkbox level__3"> </label> <label class="number"> <span class="num_level_two"> 7 500 </span> <input type="checkbox" checked="checked" class="checkbox level__3"> </label> </div> </div> </div> </div> <script> const calculator = document.querySelector('.calculator'); const levelOne = document.querySelector('.level_one'); calculator.addEventListener('change', function ({ target }) { console.log(target.className); if(target.classList.contains("level__1")){ console.log("Click: level_1"); let levelOneChildren = target.closest('.level_one').querySelectorAll(".level_two label.number") // let levelOneChildren = levelOne.childNodes // let levelOneChildren = levelOne.children console.log(levelOneChildren); } if(target.classList.contains("level__2")){ console.log("Click: level_2"); let levelTwoChildren = target.closest('.level_two').querySelectorAll(".level_three label.number") // let levelOneChildren = levelOne.childNodes // let levelOneChildren = levelOne.children console.log(levelTwoChildren); } }) </script> </body> </html> При клике level__1 где 13 000 я получаю 4 детей а по идее мне нужно 2 детей level_two label.number где 4 000 и 9 000 а по итогу получаю 4 детей где 4 000 9 000 1 500 7 500 |
Потому, что querySelectorAll получает не детей, а всех потомков, которые вложены в элемент.
|
Цитата:
|
Сергей Ракипов,
идти по кратчайшему к нужным элементам! let levelOneChildren = target.closest('.level_one').querySelectorAll(".le vel_two > label.number") |
Цитата:
|
Вот отмечание чек боксов работает так как нужно, но там ошибка и я ее не понимаю
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style> body { background-color: #27405C; font-size: 15px; font-family: 'Courier New', Courier, monospace; font-weight: bold; } label{ display: flex; align-items: center; justify-content: space-between; } .calculator { max-width: 110px; margin: 0px auto 0px; display: flex; flex-direction: column; } .total_amount { max-width: 220px; margin: 20px auto 20px; color: #946FF2; } .level_one { color: #2189FF; padding: 10px 0px 10px 10px; margin: 0px 0px 10px 0px; border-left: solid 1px #2189FF; } .sum_all_level_one { padding: 0px 0px 2px 0px; } .num_level_one {} .level_two { color: #1D76DB; display: flex; flex-direction: column; padding: 0px 0px 0px 10px; border-left: solid 1px #1D76DB; } .num_level_two {} .level_three { color: #619DE1; display: flex; flex-direction: column; padding: 0px 0px 0px 10px; border-left: solid 1px #619DE1; } </style> </head> <body> <div class="total_amount"> 21 000 </div> <div class="calculator"> <div class="level_one"> <label class="all__1 sum_all_level_one"> <span class="num_level_one"> 8 000 </span> <input type="checkbox" checked="checked" class="checkbox level__1"> </label> <div class="level_two"> <label class="number"> <span class="num_level_two"> 3 000 </span> <input type="checkbox" checked="checked" class="checkbox level__2"> </label> <label class="number"> <span class="num_level_two"> 5 000 </span> <input type="checkbox" checked="checked" class="checkbox level__2"> </label> </div> </div> <div class="level_one"> <label class="all__1 sum_all_level_one"> <span class="num_level_one"> 13 000 </span> <input type="checkbox" checked="checked" class="checkbox level__1"> </label> <div class="level_two"> <label class="number"> <span class="num_level_two"> 4 000 </span> <input type="checkbox" checked="checked" class="checkbox level__2"> </label> </div> <div class="level_two"> <label class="all__2 number"> <span class="num_level_two sum_all_level_two"> 9 000 </span> <input type="checkbox" checked="checked" class="checkbox level__2"> </label> <div class="level_three"> <label class="number"> <span class="num_level_three"> 1 500 </span> <input type="checkbox" checked="checked" class="checkbox level__3"> </label> <label class="number"> <span class="num_level_three"> 7 500 </span> <input type="checkbox" checked="checked" class="checkbox level__3"> </label> </div> </div> </div> </div> <script> const totalAmount = document.querySelector('.total_amount'); const calculator = document.querySelector('.calculator'); const levelOne = document.querySelector('.level_one'); const levelTwo = document.querySelector('.level_two'); const levelThree = document.querySelector('.level_three'); calculator.addEventListener('change', function ({ target }) { let input = target.closest('input'); console.log(input) if (input) { let all__1 = target.closest('.all__1 input'); if (all__1) target.closest('.level_one').querySelectorAll('.number input').forEach(input => (input.checked = all__1.checked)); else if (target.checked) target.closest('.level_one').querySelector('.all__1 input').checked = true; else target.closest('.level_one').querySelector('.all__1 input').checked = target.closest('.level_one').querySelectorAll('.number :checked'); } if (input) { let all__2 = target.closest('.all__2 input'); if (all__2) target.closest('.level_two').querySelectorAll('.number input').forEach(input => (input.checked = all__2.checked)); else if (target.checked) target.closest('.level_two').querySelector('.all__2 input').checked = true; else target.closest('.level_two').querySelector('.all__2 input').checked = target.closest('.level_two').querySelectorAll('.number :checked'); } if(target.classList.contains("level__1")){ console.log("Click: level_1"); let levelOneChildren = target.closest('.level_one').querySelectorAll(".level_two .num_level_two") console.log(levelOneChildren); } if(target.classList.contains("level__2")){ console.log("Click: level_2"); let levelTwoChildren = target.closest('.level_two').querySelectorAll(".level_three .num_level_three") console.log(levelTwoChildren); } }) </script> </body> </html> |
<!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, время: 14:04. |