Saya ingin menjumlahkan angka ketika kotak centang dicentang di javascript

Saya ingin menjumlahkan angka-angka dan mencetaknya dalam rentang waktu tersebut, saya mencoba dengan innerHTML tetapi karena ini adalah string saya tidak bisa, saya mencoba parseInt, parseFloat, Number dan tidak ada. Untuk semua kotak centang yang dicentang saya ingin jumlah nilainya ke dalam rentang dan mereka yang tidak dicentang saya tidak ingin mereka mendapatkan jumlah dalam rentang tersebut

(saya mengurangi tabel dan banyak angkanya karena panjang sekali untuk dimasukkan ke sini, jadi bayangkan saya ingin menjumlahkan banyak angka totalnya)

const offersCheckbox = document.querySelectorAll("#checkbox-offers");
const recalculateText = document.querySelector(".recalculate-text");
const checkboxTotal = document.querySelectorAll("#checkbox-total");
let total = 0;

for (let i = 0; i < offersCheckbox.length; i++) {
  offersCheckbox[i].addEventListener("click", (e) => {
    if (offersCheckbox[i].checked === true) {
      recalculateText.innerHTML = "recalculate invoice total";
    } else {
      recalculateText.innerHTML = "";
    }
  });
}
<table>
  <tr>
    <tr>
      <td>
        <input type="checkbox" name="checkbox" id="checkbox-offers" value="2,434.38" />
        <td>
          <div class="price-container text-bold" id="checkbox-total">
            <b>$</b>2,434.38
          </div>
        </td>
    </tr>

    <tr>
      <td>
        <input type="checkbox" name="checkbox" id="checkbox-offers" value="76.69" />
      </td>
      <td>
        <div class="price-container text-bold" id="checkbox-total">
          <b>$</b>76.69
        </div>
      </td>
    </tr>
</table>

<span class="recalculate-text text-right text-underline"></span>


person Simon    schedule 03.03.2021    source sumber
comment
Apa yang kamu coba? SO bukanlah layanan penulisan atau evaluasi kode gratis, bagikan pencapaian Anda dan kami akan memperbaikinya. Buat juga contoh minimal yang dapat direproduksi dengan menekan tombol ‹› di editor dan membuat cuplikan, ini akan sangat meningkatkan peluang Anda mendapatkan jawaban. Sekadar menunjukkan, SEMUA yang perlu Anda ketahui tentang cara melakukan ini sudah terjawab di sini atau di Google. Jadi berusahalah untuk mengajukan pertanyaan dan mencoba menyelesaikannya. Selamat datang di SO,   -  person ikiK    schedule 03.03.2021
comment
Id elemen HTML HARUS unik, Anda perlu mengubah atribut id di setiap kolom input   -  person AGE    schedule 04.03.2021
comment
saya mengubah id untuk kelas, tetapi itu tidak menyelesaikan masalah saya, adakah cara untuk melakukannya?   -  person Simon    schedule 04.03.2021
comment
itu karena pemilih jquery Anda salah, ada beberapa jawaban yang dapat Anda pertimbangkan   -  person AGE    schedule 04.03.2021


Jawaban (4)


Saya tidak mengubah terlalu banyak dari kode asli Anda. Lihat komentar untuk memahami perubahan yang saya buat dan jangan ragu untuk berkomentar jika Anda memiliki pertanyaan tambahan.

const recalculateText = document.querySelector(".recalculate-text");
const checkboxContainer = document.querySelector("#checkbox-container");
let total = 0;

// Create a number formatter to print out on the UI - this is a better approach than regex IMO.
const formatter = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD'
});

//Notice the use of event delegation here - meaning I only added 1 single event handler to a single DOM element
//Read this blog for more on event delegation and why it's useful: https://davidwalsh.name/event-delegate
checkboxContainer.addEventListener('change', e => {
  //Also notice that I am listening for the change event, instead of the click event.
  //See here: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event
  if (e.target.tagName == "INPUT") {
    const floatValue = parseFloat(e.target.value);
    if (e.target.checked) {
      total += floatValue;
    } else {
      total -= floatValue;
    }
  }

  recalculateText.innerHTML = formatter.format(total);
});
<!-- Notice I added a parent div to enable use to use event delegation technique -->
<!-- Also notice I removed element id attributes where they were not needed. Also be sure
to always use unique id values for every element - duplicate ids are not allowed, it will 
lead to bugs. If elements need to be considered part of the same "group" then you should use
the class attribute. -->
<div id="checkbox-container">
  <table>
    <tr>
      <tr>
        <td>
          <!-- Notice I removed the comma from the value attribute -->
          <input type="checkbox" name="checkbox" value="2434.38" />
          <td>
            <div class="price-container text-bold">
              <b>$</b>2,434.38
            </div>
          </td>
      </tr>

      <tr>
        <td>
          <input type="checkbox" name="checkbox" value="76.69" />
        </td>
        <td>
          <div class="price-container text-bold">
            <b>$</b>76.69
          </div>
        </td>
      </tr>
  </table>
</div>
<span class="recalculate-text text-right text-underline"></span>

person Tom O.    schedule 03.03.2021
comment
Saya tidak mengubah terlalu banyak dari kode asli Anda. Nah, Anda harus mengatasi jika tidak ada lagi duplikat id yang sama... Ada document.querySelectorAll("#checkbox-offers"); di id, itu duplikat... Dan querySelectorAll lebih tepatnya. Jadi kodenya salah dan perlu ditangani. - person ikiK; 04.03.2021
comment
Ini berhasil bagi saya, alih-alih menggunakan formatter itu, saya menggunakan split(,).join() dan melakukan pendengar acara pada input bukan pada wadah div. Terimakasih semuanya - person Simon; 04.03.2021

Sesuai memperbaiki kode yang sudah Anda miliki:

  1. id itu unik, jadi gunakan checkbox-offers sebagai kelas dan querySelectorAll karena Anda sudah memiliki loop untuk itu
  2. Nomor Js tidak memiliki , di dalamnya sehingga Anda perlu menghapusnya untuk mendapatkan nomor yang mampu melakukan fungsi matematika
  3. di loop Anda, Anda memiliki (e) penyihir menunjukkan acara, jadi gunakan e.target untuk menargetkan event itu dan mengajukan dan mengambil value-nya.
  4. dengan offersCheckbox[i] Anda hanya addEventListener dan sejak saat itu Anda menggunakan e.target
  5. Anda perlu mengonversi nilai menjadi angka dengan parseFloat(num)
  6. Saat memasukkan nilai, Anda perlu memperhitungkan nilai yang sudah ditambahkan jika ada, jika tidak diurai sebagai 0, jika ada, diurai sebagai angka dan tambahkan tambahan ke dalamnya:
  7. jika Anda ingin menambahkan kembali, sebagai pemisah keseribu hasil, yang memiliki banyak jawaban di sini di SO, cari saja.

recalculateText.innerHTML = (parseFloat(recalculateText.innerHTML || 0) + angka2)

const offersCheckbox = document.querySelectorAll(".checkbox-offers");
const recalculateText = document.querySelector(".recalculate-text");

let total = 0;

for (let i = 0; i < offersCheckbox.length; i++) {
  offersCheckbox[i].addEventListener("click", (e) => {
   
    let num = e.target.value.split(",").join("")
    let num2 = parseFloat(num)

    if (e.target.checked === true) {
      recalculateText.innerHTML = (parseFloat(recalculateText.innerHTML || 0) + num2)
    } else {
      recalculateText.innerHTML = "";
    }
  });
}
<table>
  <tr>
    <tr>
      <td>
        <input type="checkbox" class="checkbox-offers" name="checkbox" value="2,434.38" />
        <td>
          <div class="price-container text-bold" id="checkbox-total">
            <b>$</b>2,434.38
          </div>
        </td>
    </tr>

    <tr>
      <td>
        <input type="checkbox" class="checkbox-offers" name="checkbox" value="76.69" />
      </td>
      <td>
        <div class="price-container text-bold" id="checkbox-total">
          <b>$</b>76.69
        </div>
      </td>
    </tr>
</table>

<span class="recalculate-text text-right text-underline"></span>

Tautan yang berguna:

Apa yang dikembalikan oleh metode querySelectorAll dan getElementsBy*?

Cara mencetak angka dengan koma sebagai pemisah ribuan dalam JavaScript

Properti apa yang dapat saya gunakan dengan event.target?

Bagaimana cara mengonversi string menjadi integer di JavaScript?

person ikiK    schedule 03.03.2021

Harap dicatat bahwa Anda perlu memanfaatkan sistem event handler bidang masukan, dalam hal ini onchange di mana setiap bidang masukan menangani modifikasi nilai yang disimpan dari jumlah setiap harga.

Saya memang menulis mata uang ke penormal angka melalui regex, namun saya tidak menulis angka ke format mata uang, untuk memformat ulang jumlah total kembali ke mata uang. Anda harus menanganinya sendiri.

let sum = 0;

let addPrice = (elem) => {
  let value = parseFloat(elem.value.replace(/\$|,/g, ''), 2);
  
  elem.checked ? (sum += value) : (sum -= value);

  document.getElementById('result').innerHTML = sum;
};
<table>
  <tr>
    <tr>
      <td>
        <input type="checkbox" name="price" value="2,434.38" onchange="addPrice(this)" />
        <td>
          <div class="price-container text-bold">
            <b>$</b>2,434.38
          </div>
        </td>
    </tr>

    <tr>
      <td>
        <input type="checkbox" name="price" value="76.69" onchange="addPrice(this)" />
      </td>
      <td>
        <div class="price-container text-bold">
          <b>$</b>76.69
        </div>
      </td>
    </tr>
</table>

<div class="recalculate-text text-right text-underline">Total: <span id="result">0</span></div>

person AGE    schedule 03.03.2021
comment
mengapa demi Tuhan Anda menambahkan jquery di cuplikan hanya untuk sisipan terakhir itu?!? Dan jquery tidak disebutkan di mana pun dalam pertanyaan;) - person ikiK; 04.03.2021
comment
@ikiK hmm baris jQuery dapat diubah dengan mudah menjadi document.getElementById, pembaruan dilakukan untuk konsistensi - person AGE; 04.03.2021
comment
tentu saja bisa, dan memang seharusnya begitu :) Menurutku itu lucu sekali. Lagipula semuanya di vanilla js, masukkan dengan jquery, tidak masuk akal. - person ikiK; 04.03.2021
comment
Saya mengerti, poin yang bagus - person AGE; 04.03.2021
comment
Terima kasih, tapi saya suka pendekatan Anda menggunakan regex untuk ini, tetapi Anda tidak akan pernah menemukan saya melakukannya untuk hal-hal sederhana seperti ini. Split.join adalah cara saya untuk pergi. Namun demikian, contoh yang bagus. ada juga replaceAll. Untuk membuatnya lebih mubazir - person ikiK; 04.03.2021
comment
Saya mengerti maksud Anda. Pemformat mata uang adalah rintangan implementasi lain yang harus dipecahkan oleh orang yang mengajukan pertanyaan, saya dapat memberikan jawaban yang sangat bagus untuk itu karena saya sendiri telah membuat banyak, tetapi batasannya biasanya jauh lebih ketat di sini (karenanya regex langsung). Masalah dengan pertanyaan itu sendiri adalah hal yang penting di sini. - person AGE; 04.03.2021
comment
Tentu saja, itu hanya 2 sen saya, tepuk tangan. - person ikiK; 04.03.2021

person    schedule
comment
Meskipun jawaban seperti ini dapat menyelesaikan masalah, mereka tidak diterima di SO, mereka memerlukan penjelasan agar OP dapat belajar sesuatu dari mereka untuk lain waktu. - person ikiK; 04.03.2021