Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][JavaScript]Zaznaczenie wielu checkboxów z definiowanym limitem
Forum PHP.pl > Forum > Przedszkole
krzesik
Witam,
mam funkcję która zaznacza mi grupowo checkboxy w formularzu. Niestety nie działa mi ona dobrze. mam zdefiniowany max 20 checkboxów, a zaznacza mi tylko pięć pierwszych. Nie umiem znaleźć błędu.....
Proszę o pomoc w temacie.

  1. <script type="text/javascript">
  2. function checkboxesAll(f,b){
  3. var e = document.forms[f].elements;
  4. for (var z=0;z=<20;z++) {
  5. if (e[z].type=="checkbox") e[z].checked = b;
  6. }
  7. }


w formularzu element z checkboxem:
  1. ......................
  2. <input type="checkbox" value="'.$t[identyfikator].' | '.$t[nr_spr].'" name="identyfikator[]" onclick="all=deaktywacja();pokaz();return all;" />
  3. ......................
trueblue
https://jsfiddle.net/u4dqkcyz/

Swoją drogą warunek w pętli jest niepoprawny, powinno być <=19 (nie =<19, ani nie =<20).
krzesik
Teraz mam tak:

  1. ................
  2. <script type="text/javascript">
  3. function checkboxesAll(f,b){
  4. var e = document.forms[f].elements;
  5. for (var z=0;z<=19;z++) {
  6. if (e[z].type=="checkbox") e[z].checked = b;
  7. }
  8. }
  9.  
  10. <script language="JavaScript">
  11. function sprawdz_ile_zaznaczonych(){
  12. var ile = 0;
  13. for(var i=0; i<document.pozycje.length; i++){
  14. if((document.forms.pozycje.elements[i].type)=="checkbox"){
  15. if(document.forms.pozycje.elements[i].checked) ile++;
  16. }
  17. }
  18. return ile;
  19. }
  20. function deaktywacja(){
  21. if(sprawdz_ile_zaznaczonych()>=20){
  22. for(var i=0; i<document.pozycje.length; i++){
  23. if((document.forms.pozycje.elements[i].type)=="checkbox"){
  24. if(!document.forms.pozycje.elements[i].checked)
  25. document.forms.pozycje.elements[i].disabled=true;
  26. }
  27. }
  28. }
  29. else{
  30. for(var i=0; i<document.pozycje.length; i++){
  31. if((document.forms.pozycje.elements[i].type)=="checkbox")
  32. document.forms.pozycje.elements[i].disabled=false;
  33. }
  34. }
  35. }
  36.  
  37. </script>
  38.  
  39. ...............
  40. ....................
  41.  
  42. <input type="button" class="btn btn-success btn-xs" onclick="checkboxesAll('f',true);" value="Zaznacz wszystkie max 20" />&nbsp; &nbsp; &nbsp;
  43. <input type="button" class="btn btn-info btn-xs" onclick="checkboxesAll('f',false);" value="Odznacz wszystkie" />
  44.  
  45. <table width="100%" align="center" valign="center" border="1">
  46. ....................
  47. <input type="checkbox" value="'.$t[identyfikator].' | '.$t[nr_spr].' | '.$t[data].' | '.$wartosc.' | '.$t[ilosc].'" name="identyfikator[]" onclick="all=deaktywacja();return all;" />
  48.  
  49. ....................


jeśli kliknę na button "Zaznacz max 20" to zaznacza mi tylko dwa pierwsze, jeśli zaznaczę ręcznie do 20 to reszta "szarzeje - tak jak być powinno.
nospor
NO przeciez tu
for (var z=0;z<=19;z++) {
if (e[z].type=="checkbox") e[z].checked = b;
}

lecisz po dwudziestu perwszych elemetnach forma, ale tylko co ktorys jest cehckboxem wiec logicnze ze nie zaznacza ci sie 20 checkboxw.

Albo z forma pobieraj tylko checkboxy, albo pobieraj wszystkie elementy forma ale wowczas lecisz WHILE a nie for i konczyc WHILE gdy 20 checkbox odznaczysz
trueblue
  1. document.forms[f].elements;

Ten fragment zwraca wszystkie elementy formularza. Jeśli więc na początku jest 18 elementów innych niż checkbox, to ominie je w pętli, a zaznaczy 2 ostatnie.

Popróbuj używać metod querySelector, querySelectorAll i dodawać zdarzenia poprzez addEventListener. Obecnie kod wygląda jak z epoki IE6.
krzesik
OK, teraz wygląda to tak:
  1. <script language="JavaScript">
  2. function sprawdz_ile_zaznaczonych()
  3. {
  4. var ile = 0;
  5. for(var i=0; i<document.pozycje.length; i++)
  6. {
  7. if((document.pozycje.elements[i].type)=="checkbox")
  8. {
  9. if(document.pozycje.elements[i].checked) ile++;
  10. }
  11. }
  12. return ile;
  13. }
  14.  
  15. function deaktywacja()
  16. {
  17. if(sprawdz_ile_zaznaczonych()>=40)
  18. {
  19. for(var i=0; i<document.pozycje.length; i++)
  20. {
  21. if((document.pozycje.elements[i].type)=="checkbox")
  22. {
  23. if(!document.pozycje.elements[i].checked)
  24. document.pozycje.elements[i].disabled=true;
  25. }
  26. }
  27. }
  28. else
  29. {
  30. for(var i=0; i<document.pozycje.length; i++)
  31. {
  32. if((document.pozycje.elements[i].type)=="checkbox")
  33. document.pozycje.elements[i].disabled=false;
  34. }
  35. }
  36. }
  37.  
  38. </script>
  39.  
  40. <script type="text/javascript">
  41. function checkboxesAll(f,b){
  42. var e = document.forms[f].elements["identyfikator[]"];
  43. for (var z=0;z<=39;z++) {
  44. if (e[z].type=="checkbox") e[z].checked = b;
  45. }
  46. }
  47.  
  48.  

i już jest prawie dobrze, tylko.
po kliknięciu w button zaznacza mi prawidłową ilość checkboxów, ale kolejne też są możliwe do zaznaczenia. Jeśli zaznaczę (w tym przypadku) 41 to następne są disabled. Docelowo powinno być MAx 40 i brak możliwości zaznaczaenia więcej.
Poproszę o poradę. Dziękuję
nospor
noto odpal deaktywacja() zaraz po tym jak zaznaczysz wszytkie 40 checkbox, wiec albo w funkcji checkboxesAll() albo zaraz za nia
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.