Autor Zpráva
pajadvorak
Profil
Ahoj, mám kód (viz níže), který mi sčítá počet označených checkboxů v tabulce. Funguje, jedinou vadu na kráse má v tom, že mi to nefunguje, když je tam 1 řádek.
Chápu, že podmínka for (var i=0; i<Count; i++) to nedovolí. Ale při změně na i<=Count to přestane fungovat.

Kdo si s tím ví rady? Moc děkuji.


function pocet(form)
{
  // Celkový počet CheckBoxů
  Count = form.elements['oznacit_faktury[]'].length;

  // Počet zaškrtnutých položek
  CheckedCount = 0;
  
  CheckedKcs = 0;
    alert (Count);
  // Zjištění počtu zaškrtnutých položek
  for (var i=0; i<Count; i++){
    if (form.elements['oznacit_faktury[]'][i].checked)
    CheckedCount++;
    
    
    
    if (form.elements['oznacit_faktury[]'][i].checked)
    {
      kcs = form.elements['kcs[]'][i].value;
      CheckedKcs = parseFloat(CheckedKcs) + parseFloat(kcs);
    }
    
  }

  document.getElementById("kcs_checkbox").value = CheckedKcs;
  
  document.getElementById("pocet_checkbox").value = CheckedCount;

}
Radek9
Profil
pajadvorak:
Chápu, že podmínka for (var i=0; i<Count; i++) to nedovolí
Proč by neměla? 0 je přeci menší než 1, takže projde. Prosím o odkaz na živou ukázku.
pajadvorak
Profil
Radek9:
Ahoj :-) snad jsem to tam zkopíroval všechno

Zde je ukázka:
Živá ukázka
Radek9
Profil
pajadvorak:
Aha. Netušil jsem, jak přesně se chová ta elements kolekce. Pokud má dané name jen jeden prvek, tak je tam pouze ten prvek a nikoli jednoprvková kolekce. Použij querySelectorAll a bude se to chovat standardně: Živá ukázka
pajadvorak
Profil
Radek9:
Super, moc děkuji :-) ale bohužel jsem netušil, že se to až tak změní.. tudíž jsem neuvedl i součet ceny, kterou to má zobrazovat... a to původní již není platné...
zapsal jsem ji do ukázky "CheckedKcs.......???"

Ukázka:
Živá ukázka


A ještě, je někde návod jak vložit tu živou ukázku jako máš ty? :-)

Děkuji
pajadvorak
Profil
Radek9:
Nakonec vyřešeno takto:

function pocet(form) {
  var checkboxes = form.querySelectorAll('[name="oznacit_faktury[]"]');
  var kcs = form.querySelectorAll('[name="kcs[]"]');
  
  var count = checkboxes.length;

  var checkedCount = 0;
  var CheckedKcs = 0;
  
  for (var i = 0; i < count; i++) {
    if (checkboxes[i].checked)
      {checkedCount++;}
     
    if (checkboxes[i].checked)
    { 
      CheckedKcs = parseFloat(CheckedKcs) + parseFloat(kcs[i].value);
    }
  }
  
  document.getElementById("kcs_checkbox").value = CheckedKcs;
  document.getElementById("pocet_checkbox").value = checkedCount;
}
Radek9
Profil
pajadvorak:
Doporučoval bych lépe si nastudovat JS. Potom ti tyhle úpravy přijdou triviální. Ještě tam máš pár absurdností. Např. dvakrát kontroluješ checked, stačí jen jednou. parseFloat používej jen na ty stringové hodnoty, ne na součet:

  for (var i = 0; i < count; i++) {
    if (checkboxes[i].checked) {
      checkedCount++;
      CheckedKcs += parseFloat(kcs[i].value);
    }
  }
pajadvorak
Profil
Radek9:
2x kontrola checked - toho jsem si všiml těsně co jsem to sem přidal a hned opravil :-)

a to druhé je jasné... já jsem to ani neřešil a použil to původní, co jsem tam měl... :-)

Moc děkuji za pomoc.

PS: máš nějaký zdroj informace o JS na netu?

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0