Fabienne: Alle Checkboxen auswählen

Hi zusammen,

ich doktore gerade ein eine Script herum.
Diese soll mehrere Checkboxen gleichzeitig aktivieren.
Problem dabei: Es handelt sich um ein mehrdimensionales (2) Array, wobei jeweils nur die Spalten aktiviert werden sollen.
Das Arry "benutzer_array" sieht folgendermaßen aus:

benutzer_array[BENUTZER_ID][SPALTENNUMMER]

Und ich möchte gerne eine ganze Spalte markieren, bzw. ent-markieren.

<script type="text/javascript">
function change_checkbox_col(btn,frm,col_number)
{

btn.checked=!btn.checked;

box=frm['rechte_array[]'];
// Zeile für Zeile bzw. Benutzer für Benutzer durchgehen
  for(var i=0;i<box.length;i++)
  {
  box[i][col_number].checked=btn.checked;
  }

return true;
}

</script>

<input type="checkbox" onclick="change_checkbox_col(this,document.form1,SPALTENNUMMER);return true;" name="col_button[SPALTENNUMMER]" value="">

Hier noch der Eintrag für den einzelnen User und die einzele Spalte:
<input type="checkbox" name="rechte_array[BENUTEZR_ID][SPALTENNUMMER]" value="1">

Mein Problem:
Die Markierung der ganzen Spalte funktioniert nicht.
Aber noch viel besser: Nicht einmal die Key-Checkbox "col_button" kann ich aktiv- bzw. deaktivieren.

Hat jemand eine Idee, bzw. wo stehe ich auf dem Schlauch?

Vielen Dank
Fabienne

  1. Liebe Fabienne,

    Checkboxen können das Attribut "checked" haben, welches man mit dem Wert "checked" befüllen kann - oder eben leer lässt.

    <input type="checkbox" name="mein_wert" value="irgendwas" checked="checked" />

    Jetzt schau einmal selbst, wie Du das in Deinem Script umsetzt:

    btn.checked=!btn.checked;

    Was _genau_ soll diese Zeile bewirken? Wenn Sie etwas umkehren soll, dann doch wohl nur "checked" zu "" und  - naja, eben umgekehrt, oder?

    Mein Vorschlag (ungeprüft!):
    btn.checked = (btn.checked == "") ? "checked" : "";

    box[i][col_number].checked=btn.checked;

    Und hier wird dann der neue Wert für das Attribut "checked" eingetragen... Hoffentlich passt er!

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hi nochmals,

      habe das ganze inzwischen vereinfacht:

      <script type="text/javascript">
      function change_checkbox_col(col_number)
      {
      // Zeile für Zeile bzw. Benutzer für Benutzer durchgehen
        for(var i=0;i<document.form1.rechte_array.length;i++)
        {
            if(document.form1.rechte_array[i][col_number].value!='0')
            {
              document.form1.rechte_array[i][col_number].checked=btn.checked;
            }
        }
      }
      </script>

      Jetzt bemängelt er "nur" noch, dass das Array nicht existiert....
      ???? Ideen??

      Habt Dank!
      Fabienne

      1. Hi nochmals,

        oh weh, das Script macht mich rasend.....

        Jetzt versuche ich schon Basics zu lernen:
        alert( document.form1.rechte_array[15][79].checked );

        Zugegeben: Ich bin kein JS Profi, aber das obere sollte doch zumindest was ausgeben, oder?

        Viele Grüße
        Fa

        1. alert( document.form1.rechte_array[15][79].checked );

          das ist der Name: "rechte_array[15][79]"

          z.B.:

          alert( document.form1["rechte_array[15][79]"].name );

          gruß planB

          1. Hi,

            alert( document.form1["rechte_array[15][79]"].name );

            Wie kann ich die length des "rechte_array" herausbekommen?

            document.form1["rechte_array"].length

            ??

            Viele Grüße
            Fabienne

            1. alert( document.form1["rechte_array[15][79]"].name );

              Wie kann ich die length des "rechte_array" herausbekommen?

              Es gibt kein Array "rechte_array" das Element heißt "rechte_array[15][79]". Die Klammern in dem Namen haben für JS keinerlei Bedeutung sind einfach ein x-beliebiges Zeichen.

              Struppi.

              --
              Javascript ist toll (Perl auch!)
              1. Hi Struppi,

                Es gibt kein Array "rechte_array" das Element heißt "rechte_array[15][79]". Die Klammern in dem Namen haben für JS keinerlei Bedeutung sind einfach ein x-beliebiges Zeichen.

                Klingt logisch, es gibt aber eine unbestimmte Anzahl an Array-Elementen "rechte_array[1][1]" bis "rechte_array[x][y]", wobei x und y unbekannte Zahlen sind.
                Ich will zunächst nur x wissen.

                <input type="checkbox" name="rechte_array[1][1]">
                <input type="checkbox" name="rechte_array[1][2]">
                <input type="checkbox" name="rechte_array[2][1]">

                Gibt es eine Möglichkeit mit JS die Anzahl des x herauszubekommen?

                Grüße Fabienne

                1. hallo,

                  Klingt logisch, es gibt aber eine unbestimmte Anzahl an Array-Elementen "rechte_array[1][1]" bis "rechte_array[x][y]", wobei x und y unbekannte Zahlen sind.
                  Ich will zunächst nur x wissen.

                  suchst du nicht nach input-Elementen, deren Namen mit "rechte_array" beginnt und mit ("["+col_number+"]") endet?

                  gehe also alle Elemente durch und vergleiche ...

                  Gruß planB

                  1. Hi,

                    suchst du nicht nach input-Elementen, deren Namen mit "rechte_array" beginnt und mit ("["+col_number+"]") endet?
                    gehe also alle Elemente durch und vergleiche

                    ok, und genau da liegt der Hund begraben.
                    Wie stelle ich das an?

                    Kann ich da nicht über rechter_array.length drauf zugereifen?

                    Viele Grüße
                    Fabe

                    1. suchst du nicht nach input-Elementen, deren Namen mit "rechte_array" beginnt und mit ("["+col_number+"]") endet?

                      Kann ich da nicht über rechter_array.length drauf zugereifen?

                      als einziges Array steht dir hier nur die <http://de.selfhtml.org/javascript/objekte/elements.htm@title=Elementeliste des Formulars> zur Verfügung. das "rechter_array" verwaltest du auf deinem Server mit php.

                      angenommen du hast nun einen String

                      var tmpname = "rechte_array[15][79]" // (ein Elementname!)

                      würde dir tmpname.split("[") schon fast die gewünschten Infos liefern

                      http://de.selfhtml.org/javascript/objekte/string.htm#split@title=string#split

                      Gruß planB

                      1. Bow wow wow,
                        ich weiß schon, warum ich JS nicht so mag.....

                        Einfachste Lösung:
                        Ich geh einfach mal 99 Zeilen (oder dann auch mehr z.B. 999999) durch (ob die existieren oder nicht, ist mir dabei egal) und markiere alle existierenden Checkboxen.

                        // Zeile für Zeile bzw. Benutzer für Benutzer durchgehen
                        //  for(var i=0;i < document.form1["rechte_array[]"].length;i++)
                          for(var i=0;i < 99;i++)
                          {
                          if(document.form1["rechte_array["+i+"]["+col_number+"]"])document.form1["rechte_array["+i+"]["+col_number+"]"].checked=btn.checked;
                          }

                        Falls jemand noch was besseres einfällt => bitte posten!

                        Viele Grüße
                        Fabienne

                        1. Falls jemand noch was besseres einfällt => bitte posten!

                          OK, die Performance bei 999999 läßt zu wünschen übrig.
                          Daher per PHP vorher die einzelnen Benutzer-IDs zusammensammeln:

                          <script type="text/javascript">
                          function change_checkbox_col(btn,frm,col_number)
                          {

                          // WIRD durch PHP vorausgefüllt: $benutzerarray.=$id.',';
                          // Letztes Element wird ('') dient nur der vereinfachten Array-Komplettierung
                          var benutzer_array=new Array(10,15,16,12,13,11,14,'');
                          // Zeile für Zeile bzw. Benutzer für Benutzer durchgehen
                            for(var i=0;i < benutzer_array.length;i++)
                            {
                            if(document.form1["rechte_array["+benutzer_array[i]+"]["+col_number+"]"])document.form1["rechte_array["+benutzer_array[i]+"]["+col_number+"]"].checked=btn.checked;
                            }
                          }
                          </script>

                          So denn, schönnen Tag noch!

                          1. prima - du weisst dir zu helfen :-)

                            aber dieses Array sieht ja komisch aus: ein Mix aus number und string ?

                            var benutzer_array=new Array(10,15,16,12,13,11,14,'');

                            das wäre meine Alternative gewesen:

                              
                            function change_checkbox_col(btn,col_number){  
                             btn.checked=!btn.checked;  
                              
                             var elem=btn.form.elements;  
                              
                             // Zeile für Zeile bzw. Benutzer für Benutzer durchgehen  
                              for(var e=0;e<elem.length;e++)   {  
                              var tmp=elem[e].name.split("[");  
                              // bsp: rechte_array[15][79]  
                              if (tmp[0]== "rechte_array" ) {  
                               if (tmp[2]==(""+col_number+"]")) elem[e].checked=btn.checked;  
                               }  
                               }  
                             return true;  
                             }  
                            
                            
                        2. ich weiß schon, warum ich JS nicht so mag.....

                          Naja, das Problem liegt eher an PHP, da es diese verkorkste Schreibweise anwendet. Wenn du die Felder einfach 'rechte_array' nennen würdest könntest du, wie von dir gewünscht über Formluar.elements["rechte_array"] auf das Array zu greifen, so musst du rummurksen, aber das liegt wie gesagt an dieser PHP Eigenart.

                          for(var i=0;i < 99;i++)

                          Wenn du den höchsten Index kennst, kannst du natürlich auch hier statt 99 diese Zahl eintragen.

                          Falls jemand noch was besseres einfällt => bitte posten!

                          Ich hab nicht den ganzen Thread im Kopf, wenn du einfach alle checkboxen anwählöen willst, kannst du auch auf .type == 'checkbox' testen.

                          Struppi.

                          --
                          Javascript ist toll (Perl auch!)
                          1. Lieber Struppi,

                            Ich hab nicht den ganzen Thread im Kopf, wenn du einfach alle checkboxen anwählöen willst, kannst du auch auf .type == 'checkbox' testen.

                            das hatte ich vorgeschlagen...

                            Liebe Grüße aus Ellwangen,

                            Felix Riesterer.

                            --
                            ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
                    2. Liebe Fabienne,

                      ok, und genau da liegt der Hund begraben.
                      [...]
                      Kann ich da nicht über rechter_array.length drauf zugereifen?

                      // ungetestet!  
                      (  
                      // anonyme Funktion -> wird gleich ausgeführt  
                      function () {  
                          var alleInputs = document.getElementsbyTagName("input");  
                          var mein_array = new Array();  
                        
                          // Alle Inputs prüfen  
                          for (var i=0; i < alleInputs.length; i++) {  
                              if (alleInputs.type && alle.Inputs[i].type.toLowerCase() == "checkbox") {  
                                  // AHA! Eine Checkbox erwischt!  
                                  if (alleInputs[i].name && alleInputs[i].name.match(/^rechter_array\[\d+\]\[\d+\]$/)) {  
                                      // Eine Checkbox von "rechter_array"!  
                                      var arrX = alleInputs[i].name.replace(/^\D+(\d+)\D+\d+\D*$/, "$1"); // erste Zahl extrahieren  
                                      var arrY = alleInputs[i].name.replace(/^\D+\d+\D+(\d+)\D*$/, "$1"); // zweite Zahl extrahieren  
                        
                                      // Dieses Element in mein_array einhängen:  
                                      var arrI = new Array();  
                                      arrI[arrY] = alleInputs[i];  
                                      mein_array[arrX] = arrI;  
                                  }  
                              }  
                          }  
                        
                          // mein_array ausgeben:  
                          var ausgabe = "mein_array: [";  
                          for (var elm in mein_array) {  
                              for (var index in elm)  
                                  ausgabe += elm + "][" + index + "]: " + typeof(mein_array[elm][index]) + "\n"  
                          }  
                          ausgabe += "]";  
                          alert(ausgabe);  
                      } ()  
                      )
                      

                      Liebe Grüße aus Ellwangen,

                      Felix Riesterer.

                      --
                      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    2. Hallo Felix,

      btn.checked=!btn.checked;

      Was _genau_ soll diese Zeile bewirken? Wenn Sie etwas umkehren soll, dann doch wohl nur "checked" zu "" und  - naja, eben umgekehrt, oder?

      Mein Vorschlag (ungeprüft!):
      btn.checked = (btn.checked == "") ? "checked" : "";

      Gültige Werte für die Eigenschaft "checked" eines Javascript-INPUT-Element-Objekts sind true oder false (Nicht zu verwechseln mit gültigen Werten für das HTML-Attribut, das ist in XHTML nur 'checked' und wenn es nicht checked ist lässt man das ganze Attribut weg.). Beim Elementobjekt ist alles, was nicht false, undefined, 0 oder Null ist, true. Zum Umdrehen der Eigenschaft würde ich Fabiennnes Lösung bevorzugen.

      Gruß Gernot

      1. Hi Ihr zwei,

        Zum Umdrehen der Eigenschaft würde ich Fabiennnes Lösung bevorzugen.

        Ich muss das ja gar nicht umdrehen: das mache ich ja per Hand, wenn ich die Checkbox anklicke.

        Viele Grüße
        Fabienne

  2. hallo,

    wenn du dir den ausgegebenen Code auf Clientseite anguckst, wird es vielleicht klarer.

    dort gibt es nur Elemente wie:

    <input type="checkbox" name="rechte_array[xy][0]" value="1">
    <input type="checkbox" name="rechte_array[xy][1]" value="1">
    ...

    also dürfte dieses Array leer sein.

    box=frm['rechte_array[]'];

    weil keine Elemente mit dem Namen existieren.

    Aber noch viel besser: Nicht einmal die Key-Checkbox "col_button" kann ich aktiv- bzw. deaktivieren.

    das sehe ich momentan auch nicht.

    das liesse sich vereinfachen (hier aber nicht entscheidend):

    function change_checkbox_col(btn,frm,col_number)
    {

    function change_checkbox_col(btn,col_number)
    {
      var frm=btn.form;
    ...

    Gruß planB