Checkbox rekursiv markieren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Checkbox rekursiv markieren

    Hallo miteinander!

    Ich habe n'Problem was Checkboxen und Javascript angeht.
    Ich habe eine Hauptkategorie, verschiedene Unterkategorien dann nochmal verschiedene Unterkategorien der Unterkategorie.
    Sieht etwa so aus:
    -Hauptkategorie NAME=905 ID=990
    ---Unterkategorie NAME=990 ID=991
    ------Unter-Unterkategorie NAME=991 ID=992
    ------Unter-Unterkategorie NAME=991 ID=993
    ------Unter-Unterkategorie NAME=991 ID=994
    ------Unter-Unterkategorie NAME=991 ID=995
    ---Unterkategorie NAME=990 ID=996
    ---Unterkategorie NAME=990 ID=997
    -Hauptkategorie NAME=905 ID=998
    ---Unterkategorie NAME=998 ID=999
    ---Unterkategorie NAME=998 ID=1000
    ------Unter-Unterkategorie NAME=1000 ID=1001
    ------Unter-Unterkategorie NAME=1000 ID=1002
    ------Unter-Unterkategorie NAME=1000 ID=1003

    Wenn ich eine Kategorie auswähle, möchte ich, dass alle darunterliegenden (egal wieviele Ebenen) Kategorien auch angehackt werden.
    Kann mir hier irgendjemand helfen?
    Mit einer festen Anzahl an Unterebenen würde ich das glaube ich selber schaffen, aber die Funktion sollte selbst gucken ob noch eine Unterkategorie vorhanden ist oder nicht...
    greetz,
    seitz

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von seitz ()

  • Funktioniert...
    hier der code, falls es noch jemand brauchen kann:

    Quellcode

    1. function checkPages(checkId)
    2. {
    3. var field = document.getElementById(checkId);
    4. if(field.checked == true)
    5. checkAllPages(checkId);
    6. else
    7. uncheckAllPages(checkId);
    8. }
    9. function uncheckAllPages(checkId)
    10. {
    11. var fields = document.getElementsByName(checkId);
    12. if(fields.length > 0)
    13. for(var i = 0; i <= fields.length; i++)
    14. if(fields[i] != undefined)
    15. {
    16. fields[i].checked = false;
    17. uncheckAllPages(fields[i].getAttribute('id'));
    18. }
    19. }
    20. function checkAllPages(checkId)
    21. {
    22. var fields = document.getElementsByName(checkId);
    23. if(fields.length > 0)
    24. for(var i = 0; i <= fields.length; i++)
    25. if(fields[i] != undefined)
    26. {
    27. fields[i].checked = true;
    28. checkAllPages(fields[i].getAttribute('id'));
    29. }
    30. }
    Alles anzeigen


    im onClick-Event wird die Funktion "checkPages" mit der aktuellen ID als Parameter aufgerufen...
    Diese ruft dann entweder die "checkAllPages" oder die "uncheckAllPages" auf und die erledigt dann den rest ;)
    greetz,
    seitz
  • Ok, hat sich leider doch noch nicht erledigt...
    Der Internet Explorer mag nämlich gar nicht :(

    Es sind rekursive Funktionen und im Firefox beendet die Funktion ganz regulär und der Internet Explorer macht weiter und weiter und weiter bis es knallt...
    Kennt von euch jemand eine Lösung dazu oder eine Internetseite, auf der Internet Explorer Lösungen/Workarounds wegen Javascript Fehlern beschrieben werden?
    Ich bin noch am verzweifeln...

    Und hier noch der aktuelle Code:

    Quellcode

    1. function checkPages(checkId)
    2. {
    3. var field = document.getElementById(checkId);
    4. counter = 0;
    5. if(field.checked == true)
    6. checkAllPages(checkId);
    7. else
    8. uncheckAllPages(checkId);
    9. }
    10. function uncheckAllPages(checkId)
    11. {
    12. var fields = document.getElementsByName(checkId);
    13. if(fields.length > 0)
    14. {
    15. for(var i = 0; i <= fields.length; i++)
    16. if(fields[i] != undefined)
    17. {
    18. fields[i].checked = false;
    19. var id = fields[i].getAttribute('id') + '-hidden';
    20. removeElement(id);
    21. uncheckAllPages(fields[i].getAttribute('id'));
    22. }
    23. }
    24. else
    25. removeElement(checkId + '-hidden');
    26. }
    27. function checkAllPages(checkId)
    28. {
    29. var fields = "";
    30. fields = document.getElementsByName(checkId);
    31. if(fields.length > 0)
    32. {
    33. for(var i = 0; i <= fields.length; i++)
    34. if(fields[i] != undefined)
    35. {
    36. fields[i].checked = true;
    37. var newInput = document.createElement('input');
    38. newInput.type = 'hidden';
    39. newInput.id = fields[i].getAttribute('id')+'-hidden';
    40. newInput.name = 'uid[]';
    41. newInput.value = fields[i].getAttribute('id');
    42. fields[i].parentNode.insertBefore(newInput, fields[i]);
    43. checkAllPages(fields[i].getAttribute('id'));
    44. }
    45. }
    46. else
    47. {
    48. document.getElementById(checkId).checked = true;
    49. var newInput = document.createElement('input');
    50. newInput.type = 'hidden';
    51. newInput.id = checkId + '-hidden';
    52. newInput.name = 'uid[]';
    53. newInput.value = checkId;
    54. document.getElementById(checkId).parentNode.insertBefore(newInput, document.getElementById(checkId));
    55. }
    56. }
    57. function removeElement(id) {
    58. var element = document.getElementById(id);
    59. element.parentNode.removeChild(element);
    60. }
    Alles anzeigen


    Zur Info: Die HTML Elemente erzeuge ich wegen des weiteren Vorgehens in der Anwendung... Die Werden gepostet und anhand der erzeugten Elemente kann ich weiter machen... ;)
    greetz,
    seitz
  • Also ob es so wirklich richtig ist, was ich gemacht habe weiß ich nicht.
    Allerdings habe ich festgestellt, dass ich nen Workaround für den IE brauchte, weil der eine for-Schleife nicht richtig verarbeitet:

    Quellcode

    1. for(var i = 0; i <= fields.length; i++)

    Das hier kann der IE bei mir nicht. Die Variable i wird hier definitiv nicht hochgezählt. Für den IE habe ich es dann so gemacht:

    Quellcode

    1. var j = 0;
    2. for(var i = 0; i <= fields.length; j++)
    3. {
    4. i++;
    5. <restlicher Code...>
    6. }


    Jetzt funktioniert auf jeden Fall alles... Ich werds noch validieren lassen und das Script optimieren. Jedoch bin ich wirklich richtig richtig enttäuscht vom IE aber das ist man ja schon gewohnt ;)
    greetz,
    seitz