Цитата:
заменить на 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 лишний раз сложился. И я пробую по разному но у меня не получается правильно сложить. |
Сергей Ракипов,
слишком много зависимостей ... :( |
Цитата:
|
Часовой пояс GMT +3, время: 19:10. |