getelementbyGROUP
kantana
- javascript
Guden.
Wie kann ich folgendes Problem lösen.
ich hab ne checkbox als master (checboxen nachfolgend als # erkennbar)
und eine für gruppen und dann die einzelnen sätze mit auch jeweils einer checkbox für die spätere verarbeitung
also
# - Gruppe I | ID='group_1'
# - Satz I.1 | ID='child_1'
# - Satz I.2 | ID='child_1'
# - Satz I.3 | ID='child_1'
# - Gruppe II | ID='group_2'
# - Satz II.1 | ID='child_2'
# - Satz II.2 | ID='child_2'
# - Satz II.3 | ID='child_2'
# - Gruppe III | ID='group_3'
# - Satz III.1 | ID='child_3'
# - Satz III.2 | ID='child_3'
# - Satz III.3 | ID='child_3'
Wenn ich eines der Group-Checkboxen anklicke sollen nur die jeweiligen Child gecheckt werden.
also dachte ich ich mach das mal so:
function checkgroup(ad)
{
child = "child_" + ad;
document.getElementById(child).checked = true;
}
aber so checkt der immer nur das erste bekannte element
# - Gruppe III | ID='group_3' <-- klick!
# - Satz III.1 | ID='child_3' <-- wurde gecheckt
# - Satz III.2 | ID='child_3' <-- wurde nicht gecheckt
# - Satz III.3 | ID='child_3' <-- wurde nicht gecheckt
wie mache ich das denn jetzt?
kantana
wie mache ich das denn jetzt?
Das geht nicht über die ID, sondern du musst hier den Namen verwenden (es kann immer nur eine ID geben) und dann über diese Collection laufen und die Boxen ankreuzen. Du kannst daneben noch einige Dinge benutzen um das Skript flexibler zu machen, indem du erstmal nur this übergibst
function checkgroup(el) {
var num = name.substr(el.name.length-1, 1 );
var group = el.form.elements['child_' + num];
for(var i = 0; i < group.length; i++) group[i].checked = el.checked;
}
<form action="#" method="get">
<p>Group 1:
<input type="checkbox" name="group_1" onclick="checkgroup(this)">
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_1">
<br>Group 2:
<input type="checkbox" name="group_2" onclick="checkgroup(this)">
<input type="checkbox" name="child_2">
<input type="checkbox" name="child_2">
<input type="checkbox" name="child_2">
</form>
Struppi.
hi,
das ist schlecht weil:
<p>Group 1:
<input type="checkbox" name="group_1" onclick="checkgroup(this)">
<input type="checkbox" name="child_1">
NAME="group[]"
<input type="checkbox" name="child_1">
NAME="group[]"
<input type="checkbox" name="child_1">
NAME="group[]"
<br>Group 2:
<input type="checkbox" name="group_2" onclick="checkgroup(this)">
<input type="checkbox" name="child_2">
NAME="group[]"
<input type="checkbox" name="child_2">
NAME="group[]"
<input type="checkbox" name="child_2">
NAME="group[]"
aber ein guter denkanstoß.. ich denke so lässt sich was basteln ;)
das ist schlecht weil:
Das ist natürlich schlecht, wenn man nur einen Teil der Anforderungen gezeigt bekommt.
Struppi.
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_2">
<input type="checkbox" name="child_2">
<input type="checkbox" name="child_2">
Und wie sollen später die einzelnen Elemente unterschieden werden, wenn sie alle den gleichen Namen haben?
Und wie sollen später die einzelnen Elemente unterschieden werden, wenn sie alle den gleichen Namen haben?
So wie immer bei Gruppen von Formularelemente, sie kommen in der Reihenfolge an in der sie im Fomrular stehen, bzw. haben sie evtl. sogar unterschiedliche Values.
Struppi.
Und wie sollen später die einzelnen Elemente unterschieden werden, wenn sie alle den gleichen Namen haben?
So wie immer bei Gruppen von Formularelemente, sie kommen in der Reihenfolge an in der sie im Fomrular stehen,
Nur kann man bei
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_2">
<input type="checkbox" name="child_2">
<input type="checkbox" name="child_2">
in gewissen Fällen nicht mehr unterscheiden, welches Element gemeint ist. Wenn z. B. beim Anklicken der zweiten Zeile <input type="checkbox" name="child_1"> per Javascript irgend etwas anderes als beim Anklicken der dritten Zeile passieren soll, ist das so über den Elementnamen nicht mehr möglich. Wenn die Eingaben serverseitig ausgewertet werden sollen, wird es so ebenfalls schwierig.
bzw. haben sie evtl. sogar unterschiedliche Values.
Un dann? Soll über Prüfung von Werten entschieden werden, welcher Schlüssel gesetzt ist? Und wenn zwei Schlüssel gleiche Werte haben können?
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_1"><input type="checkbox" name="child_2">
<input type="checkbox" name="child_2">
<input type="checkbox" name="child_2">in gewissen Fällen nicht mehr unterscheiden, welches Element gemeint ist. Wenn z. B. beim Anklicken der zweiten Zeile <input type="checkbox" name="child_1"> per Javascript irgend etwas anderes als beim Anklicken der dritten Zeile passieren soll, ist das so über den Elementnamen nicht mehr möglich.
Keine Ahnung was du damit meinst. Wieso sollte es nicht mehr möglich sein?
Wenn die Eingaben serverseitig ausgewertet werden sollen, wird es so ebenfalls schwierig.
wieso? Die Auswertung ist einfach.
Struppi.
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_1"><input type="checkbox" name="child_2">
<input type="checkbox" name="child_2">
<input type="checkbox" name="child_2">in gewissen Fällen nicht mehr unterscheiden, welches Element gemeint ist. Wenn z. B. beim Anklicken der zweiten Zeile <input type="checkbox" name="child_1"> per Javascript irgend etwas anderes als beim Anklicken der dritten Zeile passieren soll, ist das so über den Elementnamen nicht mehr möglich.
Keine Ahnung was du damit meinst. Wieso sollte es nicht mehr möglich sein?
Ok, wie änderst Du bei Anklicken der zweiten Zeile die Hintergrundfarbe der Seite zur ot, bei der dritten Zeile zu blau, und das über die Elementnamen.
Wenn die Eingaben serverseitig ausgewertet werden sollen, wird es so ebenfalls schwierig.
wieso? Die Auswertung ist einfach.
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">
Gruppe 1 sind verschiedene Elemente (Name, Vorname, Adresse), die später angezeigt oder nicht angezeigt werden sollen. Erste und dritte Zeile ausgewählt, d. i. Name und Adresse sollen angezeigt werden. Und nun Deine einfache serverseitige Auswertung.
Keine Ahnung was du damit meinst. Wieso sollte es nicht mehr möglich sein?
Ok, wie änderst Du bei Anklicken der zweiten Zeile die Hintergrundfarbe der Seite zur ot, bei der dritten Zeile zu blau, und das über die Elementnamen.
onclick="document.body.style.backgroundColor = 'red'
onclick="document.body.style.backgroundColor = 'blue'
Wieso über die Elementnamen die brauch ich in dem Fall gar nicht.
Wenn die Eingaben serverseitig ausgewertet werden sollen, wird es so ebenfalls schwierig.
wieso? Die Auswertung ist einfach.
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">Gruppe 1 sind verschiedene Elemente (Name, Vorname, Adresse), die später angezeigt oder nicht angezeigt werden sollen. Erste und dritte Zeile ausgewählt, d. i. Name und Adresse sollen angezeigt werden. Und nun Deine einfache serverseitige Auswertung.
var @show = CGI::param('child_1');
var $show_name = $show[0];
var $show_v_name = $show[0];
var $show_adresse = $show[0];
Struppi.
Keine Ahnung was du damit meinst. Wieso sollte es nicht mehr möglich sein?
Ok, wie änderst Du bei Anklicken der zweiten Zeile die Hintergrundfarbe der Seite zur ot, bei der dritten Zeile zu blau, und das über die Elementnamen.
onclick="document.body.style.backgroundColor = 'red'
onclick="document.body.style.backgroundColor = 'blue'
Wieso über die Elementnamen die brauch ich in dem Fall gar nicht.
Das ist jetzt rausgemogelt. Das geht natürlich auch über einen Eventhandler. Als Bedingung hatte ich aber genannt über den Namen. Vielleicht war mein Beispiel auch blöd gewählt. Dann eben irgend eine andere Funktion, die nicht über einen Eventhandler aufgerufen werden soll, sondern wo intern bei der Javascript-Auswertung entschieden werden soll, welche Checkboxen innerhalb der Gruppe gesetzt sind.
Wenn die Eingaben serverseitig ausgewertet werden sollen, wird es so ebenfalls schwierig.
wieso? Die Auswertung ist einfach.
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">Gruppe 1 sind verschiedene Elemente (Name, Vorname, Adresse), die später angezeigt oder nicht angezeigt werden sollen. Erste und dritte Zeile ausgewählt, d. i. Name und Adresse sollen angezeigt werden. Und nun Deine einfache serverseitige Auswertung.
var @show = CGI::param('child_1');
var $show_name = $show[0];
var $show_v_name = $show[0];
var $show_adresse = $show[0];
>
Ich weiß ja nicht, wie das in Perl ist, in PHP werden nur aktivierte Checkboxen übertragen. Deshalb sollten sie unterschiedliche Namen haben (oder ein indiziertes Feld darstellen), es sei denn, eine Auswertung wäre über singuläre Werte möglich wie bei <input type="checkbox" name="child\_1" value="name">, <input type="checkbox" name="child\_1" value="vorname">.
sondern wo intern bei der Javascript-Auswertung entschieden werden soll, welche Checkboxen innerhalb der Gruppe gesetzt sind.
kein Problem: formular.elements['child_1'][index];
Wenn die Eingaben serverseitig ausgewertet werden sollen, wird es so ebenfalls schwierig.
wieso? Die Auswertung ist einfach.
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">Gruppe 1 sind verschiedene Elemente (Name, Vorname, Adresse), die später angezeigt oder nicht angezeigt werden sollen. Erste und dritte Zeile ausgewählt, d. i. Name und Adresse sollen angezeigt werden. Und nun Deine einfache serverseitige Auswertung.
var @show = CGI::param('child_1');
var $show_name = $show[0];
var $show_v_name = $show[0];
var $show_adresse = $show[0];
> >
> Ich weiß ja nicht, wie das in Perl ist, in PHP werden nur aktivierte Checkboxen übertragen.
Oh stimmt, ich bin davon ausgegangen dass alle übertragen werden, du hast Recht, so eine Struktur macht zumindest serverseitig nur Sinn, wenn man mit Hilfe der Werte eine Auswertung machen möchte.
~~~html
<p>Welchen Pizzabelag wollen Sie:
<input type="checkbox" name="belag" value="Salami">
<input type="checkbox" name="belag" value="Schinken">
<input type="checkbox" name="belag" value="Käse">
...
Struppi.
sondern wo intern bei der Javascript-Auswertung entschieden werden soll, welche Checkboxen innerhalb der Gruppe gesetzt sind.
kein Problem: formular.elements['child_1'][index];
Hast recht. Mit document.forms[0].elements['child_1'][index].checked kann man den Zustand überprüfen. Habe schon lange nichts mehr mit Javascript gemacht. Trotzdem halte ich diese Konzeption allein wegen der Unmöglichkeit/ der unnötigen Verkomplizierung der serverseitigen Auswertung für verfehlt. Sinnvoller ist m. E., entweder die child als indiziertes Feld zu kreieren oder ihnen verschiedene Namen zu geben.
Übrigens muß es lauten
function checkgroup(el) {
var num = el.name.substr(el.name.length-1, 1 ); // 'el.' fehlte
var group = el.form.elements['child_' + num];
for(var i = 0; i < group.length; i++) group[i].checked = el.checked;
}
kein Problem: formular.elements['child_1'][index];
Hast recht. Mit document.forms[0].elements['child_1'][index].checked kann man den Zustand überprüfen. Habe schon lange nichts mehr mit Javascript gemacht. Trotzdem halte ich diese Konzeption allein wegen der Unmöglichkeit/ der unnötigen Verkomplizierung der serverseitigen Auswertung für verfehlt. Sinnvoller ist m. E., entweder die child als indiziertes Feld zu kreieren oder ihnen verschiedene Namen zu geben.
wie gesagt man kann es serverseitig auswerten, wie in dem HTML Beispiel eben gezeigt, es muss natürlich einen sinn ergeben, für dein Beispiel ist so ein Code natürlich nicht sinnvoll.
In dem Pizza Beispiel wären aber verschiedene Namen sehr unpraktisch.
Was ist denn ein indiziertes Feld?
Struppi.
wie gesagt man kann es serverseitig auswerten, wie in dem HTML Beispiel eben gezeigt, es muss natürlich einen sinn ergeben, für dein Beispiel ist so ein Code natürlich nicht sinnvoll.
In dem Pizza Beispiel wären aber verschiedene Namen sehr unpraktisch.
Ja, aber nur wenn die Werte singulär sind.
Was ist denn ein indiziertes Feld?
Hä? Ein Feld mit fortlaufendem Index => element[0]; element[1]; element[3]...
Assoziativ => element['name']; element['vorname'] ...
serialisiert => z. B. 10;Mustermann;4;Hans; ...
wie gesagt man kann es serverseitig auswerten, wie in dem HTML Beispiel eben gezeigt, es muss natürlich einen sinn ergeben, für dein Beispiel ist so ein Code natürlich nicht sinnvoll.
In dem Pizza Beispiel wären aber verschiedene Namen sehr unpraktisch.Ja, aber nur wenn die Werte singulär sind.
wie gesagtm, genau dann machen gleichnamige Checkboxen einen Sinn.
Was ist denn ein indiziertes Feld?
Hä? Ein Feld mit fortlaufendem Index => element[0]; element[1]; element[3]...
D.h. du benennst die Felder jeweils verschieden?
Das halte ich für extrem ungünstig (und nur PHP ist da anderer Meinung) da du dann eben nicht mehr in JS auf eine Collection zugreifen kannst was die Arbeit oft erleichtert und auch in anderen Sprachen passiert bei der Auswertung eines solchen Formulares auch etwas anderes.
Struppi.
D.h. du benennst die Felder jeweils verschieden?
Das halte ich für extrem ungünstig (und nur PHP ist da anderer Meinung) da du dann eben nicht mehr in JS auf eine Collection zugreifen kannst was die Arbeit oft erleichtert und auch in anderen Sprachen passiert bei der Auswertung eines solchen Formulares auch etwas anderes.
Wieso denn nicht?
<input type="checkbox" name="child[0]">
<input type="checkbox" name="child[1]">
Über document.forms[0].elements['child[index]'] kannst Du darauf zugreifen. document.forms[0].elements['child[0]'].ckecked zeigt Dir den Zustand der ersten Checkbox. Das hat mit PHP nichts zu tun.
<input type="checkbox" name="child[0]">
<input type="checkbox" name="child[1]">
Das ist dann keine Collection mehr, so kannst du nur umständlich rausfinden welche Checkboxen zusammengehören.
Struppi.
<input type="checkbox" name="child[0]">
<input type="checkbox" name="child[1]">Das ist dann keine Collection mehr, so kannst du nur umständlich rausfinden welche Checkboxen zusammengehören.
Struppi.
Aber sicher doch. So, wie Du es schon halb hattest
<input type="checkbox" name="child_1[0]">
<input type="checkbox" name="child_1[1]">
<input type="checkbox" name="child_1[2]">
<input type="checkbox" name="child_2[0]">
<input type="checkbox" name="child_2[1]">
<input type="checkbox" name="child_2[2]">
wobei das erste die gid ist. Oder als verschachteltes Feld
<input type="checkbox" name="child[1][0]">
bzw.
<input type="checkbox" name="child[2][0]">
Unter Umständen würde ich sogar ein assoziatives Feld nehmen
<input type="checkbox" name="child[1][name]">
<input type="checkbox" name="child[1][vorname]">
Und Felder lassen sich dann mit den passenden Schleifen problemlos als Kollektion durchlaufen. Felder sind ja nichts anderes als Kollektionen und genau dazu entwickelt worden, zusammengehörige Daten zusammenzufassen.
Aber sicher doch. So, wie Du es schon halb hattest
Aber sicher nicht
<input type="checkbox" name="child_1[0]">
Das Element heißt 'child_1[0]'
<input type="checkbox" name="child_1[1]">
Das Element heißt 'child_1[1]'
<input type="checkbox" name="child_1[2]">
und das Das Element heißt 'child_1[2]'
Was ich meine ist, wenn die Felder alle gleich heißen:
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_1">
kannst mit JS auf formular.elements['child_1'][index] zugreifen, mit deiner Variante nicht.
Und Felder lassen sich dann mit den passenden Schleifen problemlos als Kollektion durchlaufen. Felder sind ja nichts anderes als Kollektionen und genau dazu entwickelt worden, zusammengehörige Daten zusammenzufassen.
Nein du kannst eben nicht Problemlos in einer Schleife darauf zugreifen, zumindest nicht in JS.
Struppi.
Also m. M. n. war Knut schon sehr nah dran, und es bedarf nur einer sehr kleinen Änderung um sowohl in JS als auch in PHP die Daten als Kollektion zu verarbeiten und zwar wäre mein Lösungsvorschlag folgender:
<input type="checkbox" name="child_1[]" />
<input type="checkbox" name="child_1[]" />
<input type="checkbox" name="child_1[]" />
Wie in PHP üblich muss KEIN(!) Index bei Arrays angegeben werden, sondern es wird automatisch inkrementiert, durch die gleichen Namen ist es ebenso in JS möglich die Daten zu verarbeiten.
Gruß!
<input type="checkbox" name="child_1[]" />
<input type="checkbox" name="child_1[]" />
<input type="checkbox" name="child_1[]" />Wie in PHP üblich muss KEIN(!) Index bei Arrays angegeben werden, sondern es wird automatisch inkrementiert, durch die gleichen Namen ist es ebenso in JS möglich die Daten zu verarbeiten.
Genau, und das ist eine auf PHP beschränkte Schreibweise und an sich nicht nötig. Wie schon geschrieben in Perl braucht man die eckigen Klammern z.b. nicht, hat dadurch aber nicht die Möglichkeit mehrere Tiefen einzubauen, was offensichtlich in PHP geht (mangels Kenntnisse weiß ich das aber nicht)
Struppi.
Das Element heißt 'child_1[0]'
Das ist schon richtig. Aber Du kannst es in Javascript genau wie ein Feld behandeln. In PHP kommt es dann auch als echtes Feld an.
Was ich meine ist, wenn die Felder alle gleich heißen:
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_1">
kannst mit JS auf formular.elements['child_1'][index] zugreifen,
... und in der anderen Variante mit document.forms[0].elements['child[index]'].
Wir hatten uns doch darauf geeinigt, keine gleichen Namen zu vergeben (andernfalls wäre es nach Deiner Variante leichter, das ist richtig). Also geht doch nur noch nach Deiner Variante sowas
<input type="checkbox" name="child_1_1">
<input type="checkbox" name="child_1_2">
Wo siehst Du programmiertechnisch den großen Unterschied zu einem (unechten) Feld?
Und Felder lassen sich dann mit den passenden Schleifen problemlos als Kollektion durchlaufen. Felder sind ja nichts anderes als Kollektionen und genau dazu entwickelt worden, zusammengehörige Daten zusammenzufassen.
Nein du kannst eben nicht Problemlos in einer Schleife darauf zugreifen, zumindest nicht in JS.
Doch das geht. Mit ein wenig Zusatzaufwand, zugegeben. Du mußt Dir halt die Elemente über substr zusammensuchen und kannst darüber auch die Feldlänge bestimmen.
Die serverseitigen Probleme mit gleichen Namen lassen sich nicht umgehen, da nicht-aktivierte Checkboxen nicht im Http übertragen werden. Daran ist nicht zu rütteln. Gleiche Namen funktionieren eben nur bei singulären Werten. Dann kannst Du es so machen, um mit geringstem Aufwand zum Ziel zu kommen, sonst nicht.
Was ich meine ist, wenn die Felder alle gleich heißen:
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_1">
<input type="checkbox" name="child_1">
kannst mit JS auf formular.elements['child_1'][index] zugreifen,... und in der anderen Variante mit document.forms[0].elements['child[index]'].
Schön und woher weißt du wieviele Elemente du hast?
in der üblichne Variante mit formular.elements['child_1'].length
Wir hatten uns doch darauf geeinigt, keine gleichen Namen zu vergeben (andernfalls wäre es nach Deiner Variante leichter, das ist richtig). Also geht doch nur noch nach Deiner Variante sowas
<input type="checkbox" name="child_1_1">
<input type="checkbox" name="child_1_2">Wo siehst Du programmiertechnisch den großen Unterschied zu einem (unechten) Feld?
gar keinen, wobei ich nicht weiß ob wir uns geeinigt haben, es kommt darauf an welchen Zweck das ganze haben soll.
Nein du kannst eben nicht Problemlos in einer Schleife darauf zugreifen, zumindest nicht in JS.
Doch das geht. Mit ein wenig Zusatzaufwand, zugegeben. Du mußt Dir halt die Elemente über substr zusammensuchen und kannst darüber auch die Feldlänge bestimmen.
Du musst durch alle Elemente des Formulares laufen und bei jedem Index überprüfen ob es vorhanden ist, das halte ich für bedeutet umständlicher.
Gleiche Namen funktionieren eben nur bei singulären Werten. Dann kannst Du es so machen, um mit geringstem Aufwand zum Ziel zu kommen, sonst nicht.
Das hatten wir schon, es kommt eben auf den Zweck des ganzen an, ob eine Checkboxgroup Sinn macht oder nicht.
Struppi.
Schön und woher weißt du wieviele Elemente du hast?
in der üblichne Variante mit formular.elements['child_1'].length
Mit ein wenig Aufwand kann man das rauskriegen.
Wir hatten uns doch darauf geeinigt, keine gleichen Namen zu vergeben (andernfalls wäre es nach Deiner Variante leichter, das ist richtig). Also geht doch nur noch nach Deiner Variante sowas
<input type="checkbox" name="child_1_1">
<input type="checkbox" name="child_1_2">Wo siehst Du programmiertechnisch den großen Unterschied zu einem (unechten) Feld?
gar keinen, wobei ich nicht weiß ob wir uns geeinigt haben, es kommt darauf an welchen Zweck das ganze haben soll.
Das hatten wir schon, es kommt eben auf den Zweck des ganzen an, ob eine Checkboxgroup Sinn macht oder nicht.
Ja, genau, darauf hatten wir uns ja auch verständigt?
Ich denke, es hat sich jetzt eine optimale Lösung (zumindest für PHP) herauskristallisiert:
<input type="checkbox" name="child_1[]" />
<input type="checkbox" name="child_1[]" />
<input type="checkbox" name="child_1[]" />
»»
Wie in PHP üblich muss KEIN(!) Index bei Arrays angegeben werden, sondern es wird automatisch inkrementiert, durch die gleichen Namen ist es ebenso in JS möglich die Daten zu verarbeiten.
Perfekt für Javascript. Nichts gegen Perl, aber das ist ein klarer Vorteil von PHP.
Genau, und das ist eine auf PHP beschränkte Schreibweise und an sich nicht nötig.
Leider doch, zumindest in manchen Fällem, das hatten wir doch schon. Sonst kannst Du bei gleichen Werten nicht entscheiden, welche Checkbox aktiviert wurde.
Wie schon geschrieben in Perl braucht man die eckigen Klammern z.b. ...
manchmal
nicht
hat dadurch aber nicht die Möglichkeit mehrere Tiefen einzubauen,
was um so bedauerlicher ist und man sie irgendwie doch braucht. Also kannst Du dir auch nur über den Namen ein künstliches Feld zusammenbauen.
Schön und woher weißt du wieviele Elemente du hast?
in der üblichne Variante mit formular.elements['child_1'].lengthMit ein wenig Aufwand kann man das rauskriegen.
sage ich doch die ganze Zeit.
gar keinen, wobei ich nicht weiß ob wir uns geeinigt haben, es kommt darauf an welchen Zweck das ganze haben soll.
Das hatten wir schon, es kommt eben auf den Zweck des ganzen an, ob eine Checkboxgroup Sinn macht oder nicht.
Ja, genau, darauf hatten wir uns ja auch verständigt?
Ich denke, es hat sich jetzt eine optimale Lösung (zumindest für PHP) herauskristallisiert:
<input type="checkbox" name="child_1[]" />
<input type="checkbox" name="child_1[]" />
<input type="checkbox" name="child_1[]" />
»»
Wie in PHP üblich muss KEIN(!) Index bei Arrays angegeben werden, sondern es wird automatisch inkrementiert, durch die gleichen Namen ist es ebenso in JS möglich die Daten zu verarbeiten.Perfekt für Javascript. Nichts gegen Perl, aber das ist ein klarer Vorteil von PHP.
wie gesagt das macht Perl in dem Falle auch ob mit oder ohne eckigen Klammern ein klarer Vorteil für Perl und es ist natürlich problemlos möglich eine solche Variante selber zu programmieren, es würde mich wundern wenn es dafür kein passendes Modul gibt.
Genau, und das ist eine auf PHP beschränkte Schreibweise und an sich nicht nötig.
Leider doch, zumindest in manchen Fällem, das hatten wir doch schon. Sonst kannst Du bei gleichen Werten nicht entscheiden, welche Checkbox aktiviert wurde.
Arghl, der Punkt ist doch, warum soll es mehrere checkboxen geben, die den gleichen Wert und den gleichen Namen haben? Da, wie du ja bereits festgestellt hast, nicht angeklickte Checboxen nicht übertragen werden, bringt auch deine PHP Lösung nichts, da auch PHP nicht erraten kann welche Box angekreuzt wurde.
Wie schon geschrieben in Perl braucht man die eckigen Klammern z.b. ...
manchmal
Man braucht sie immer nicht um gleichnamige Felder auszuwerten.
nicht
hat dadurch aber nicht die Möglichkeit mehrere Tiefen einzubauen,
was um so bedauerlicher ist und man sie irgendwie doch braucht. Also kannst Du dir auch nur über den Namen ein künstliches Feld zusammenbauen.
Etwas anderes ist das ja in PHP auch nicht und wie gesagt ich vermute das es bestimmt für solch einen Zweck ein Modul gibt (und wenn nicht ist sowas in 5 Minuten zusammengebaut).
Struppi.
Lieber Struppi,
wir hatten doch gesagt, es gibt zwei Varianten: gleicher Name und unterschiedlicher Wert, gleicher (Feld-!)Name und gleicher Wert. Das letzte hört sich nur im ersten Moment paradox, die Auflösung folgt unten. Aber genau damit startete der Thread. Wenn Du nun beide Varianten immer wieder durcheinander schmeißt, für die ganz unterschiedliche Prämissen gelten, verstehen wir uns irgendwann gar nicht mehr.
Ich rekapituliere kurz: Variante 1 ist völlig unproblematisch für Javascript, serverseitig nur mit ein bißchen Aufwand verbunden, anhand von Werten statt Indizes zu entscheiden, welche Checkbox aktiviert wurde. Stimmen wir soweit überein? Können wir den Fall im weiteren endlich außen vor lassen?
Schön und woher weißt du wieviele Elemente du hast?
in der üblichne Variante mit formular.elements['child_1'].lengthMit ein wenig Aufwand kann man das rauskriegen.
sage ich doch die ganze Zeit.
Dem habe ich doch auch nie widerpsrochen.
Perfekt für Javascript. Nichts gegen Perl, aber das ist ein klarer Vorteil von PHP.
wie gesagt das macht Perl in dem Falle auch ob mit oder ohne eckigen Klammern ein klarer Vorteil für Perl und es ist natürlich problemlos möglich eine solche Variante selber zu programmieren, es würde mich wundern wenn es dafür kein passendes Modul gibt.
Das macht Perl nicht. Kann es auch gar nicht, woher soll es wissen, welche Checkbox bei Fall 2 gemeint ist.
Arghl, der Punkt ist doch, warum soll es mehrere checkboxen geben, die den gleichen Wert und den gleichen Namen haben?
»»
Weil genau das die Ausgangslage war, ich erinnere an Deinen Code, den ich ergänzte
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">
Wenn die drei Zeilen für unterschiedliche Dinge (Name, Vorname, Adresse) stehen, dann kannst Du das nur über unterschiedliche Namen
<input type="checkbox" name="vorname" value="zeigen">
bzw.
<input type="checkbox" name="child_1_0" value="zeigen">
oder Felder unterscheiden
<input type="checkbox" name="child_1[0]" value="zeigen">
Wenn Du völlig unterschiedliche Namen wie
<input type="checkbox" name="vorname" value="zeigen">
<input type="checkbox" name="adresse" value="zeigen">
wird es schwierig, die Funktion "alle Felder per Klick selektieren" mittels Javascript zu verwirklichen, noch dazu wenn die Gruppe 2 dieselben Einträge aufweist. Nicht unmöglich, aber absolut kompliziert. Also bleiben nur (unechte!) Felder. Für Perl ist das, entgegen Deiner Behauptung, absolut zwingend, sonst kommen nur gleiche Namen und Werte an, und das wäre tatsächlich der gröbste Unfug.
Wie schon geschrieben in Perl braucht man die eckigen Klammern z.b. ...
manchmal
Man braucht sie immer nicht um gleichnamige Felder auszuwerten.
nicht
Man braucht sie im Fall 2 immer.
Weil genau das die Ausgangslage war, ich erinnere an Deinen Code, den ich ergänzte
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">Wenn die drei Zeilen für unterschiedliche Dinge (Name, Vorname, Adresse) stehen, dann kannst Du das nur über unterschiedliche Namen
Genau, das ist das Mißverständniss, für mich bedeutet so ein Konstrukt:
<input type="checkbox" name="child_1[0]" value="zeigen">
<input type="checkbox" name="child_1[1]" value="zeigen">
<input type="checkbox" name="child_1[2]" value="zeigen">
immer ein unterschiedlicher Feldname. Wie gesagt das ist eine PHP Eigenart diese Namen als Array auszuwerten, geht natürlich mit Perl auch, wenn man möchte.
Wie schon geschrieben in Perl braucht man die eckigen Klammern z.b. ...
manchmal
Man braucht sie immer nicht um gleichnamige Felder auszuwerten.
nicht
Man braucht sie im Fall 2 immer.
Nein, nur PHP braucht sie um daraus ein Array zu machen, wie gesagt so eine Funktion ist in 5 Minuten geschrieben, bzw. die eines vorhandenen Moduls ergänzt.
Struppi.
Genau, das ist das Mißverständniss, für mich bedeutet so ein Konstrukt:
<input type="checkbox" name="child_1[0]" value="zeigen">
<input type="checkbox" name="child_1[1]" value="zeigen">
<input type="checkbox" name="child_1[2]" value="zeigen">immer ein unterschiedlicher Feldname.
Für HTML und Javascript sind das unterschiedliche Namen. Aber da sie die Struktur eines Feldes haben, lassen sie sich in Javascript wie Felder behandeln.
Wie gesagt das ist eine PHP Eigenart diese Namen als Array auszuwerten, geht natürlich mit Perl auch, wenn man möchte.
Das ist nicht nur eine PHP-Eigenart, auch in anderen Sprachen kommst Du nicht darum. Wie auch immer Du es anstellst, bei gleichen Werten mußt Du unterschiedliche Namen haben. In Perl müßtest Du dir aus den Namen ein Feld zusammenbauen. PHP ist so nett und macht das automatisch.
Wie schon geschrieben in Perl braucht man die eckigen Klammern z.b. ...
manchmal
Man braucht sie immer nicht um gleichnamige Felder auszuwerten.
nicht
Man braucht sie im Fall 2 immer.
Nein, nur PHP braucht sie um daraus ein Array zu machen, wie gesagt so eine Funktion ist in 5 Minuten geschrieben, bzw. die eines vorhandenen Moduls ergänzt.
In Fall 1 brauchst Du sie nicht, in Fall 2 schon. Ich muß gleich weg, aber fünf Minuten habe ich noch. Dann mal los.
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">
1 und 3 aktiviert =>
action="wasauchimmer.skript" method="get"
wasauchimmer.skript?child_1=zeigen&child_1=zeigen
Zeig mir mal, wie Du das in Perl löst. Bin gespannt.
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">1 und 3 aktiviert =>
action="wasauchimmer.skript" method="get"
wasauchimmer.skript?child_1=zeigen&child_1=zeigen
Zeig mir mal, wie Du das in Perl löst. Bin gespannt.
Ich sagte doch die Felder müssen in so einem Fall unterschiedlich heissen, ob sie child_1_1, child_1_a oder , child_1[1] spielt keine Rolle, nur PHP ist, wegen mir, so freundlich dir aus child_1[index] ein Array zu basteln, das kannst du natürlich auch in Perl machen.
Struppi.
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">1 und 3 aktiviert =>
action="wasauchimmer.skript" method="get"
wasauchimmer.skript?child_1=zeigen&child_1=zeigen
Zeig mir mal, wie Du das in Perl löst. Bin gespannt.
Ich sagte doch die Felder müssen in so einem Fall unterschiedlich heissen, ob sie child_1_1, child_1_a oder , child_1[1] spielt keine Rolle, nur PHP ist, wegen mir, so freundlich dir aus child_1[index] ein Array zu basteln, das kannst du natürlich auch in Perl machen.
Struppi.
Ok, ich glaube, jetzt haben wir uns endlich verstanden. Können wir uns dann auch noch darauf einigen, daß unterschiedliche Namen, die Felder nachahmen, am sinnvollsten sind? Und daß es eben nicht mit echten "Kollektionen" geht und deshalb ein ein wenig komplizierter Javascript-Code als anfangs gespostet nötig ist? Und natürlich kann Perl, ja, muß sogar das Gleiche können. Ich will auch gar nicht Perl herabsetzen. Der eine bevorzugt eben PHP, der andere Perl, der dritte Ruby. Das ist Geschmackssache. Mir ging es nur darum zu zeigen, der eingangs gepostete Javascript-Code funktioniert in gewissen Situationen so nicht, wenn er noch serverseitig ausgewertet werden muß.
Ok, ich glaube, jetzt haben wir uns endlich verstanden. Können wir uns dann auch noch darauf einigen, daß unterschiedliche Namen, die Felder nachahmen, am sinnvollsten sind? Und daß es eben nicht mit echten "Kollektionen" geht und deshalb ein ein wenig komplizierter Javascript-Code als anfangs gespostet nötig ist? Und natürlich kann Perl, ja, muß sogar das Gleiche können. Ich will auch gar nicht Perl herabsetzen. Der eine bevorzugt eben PHP, der andere Perl, der dritte Ruby. Das ist Geschmackssache. Mir ging es nur darum zu zeigen, der eingangs gepostete Javascript-Code funktioniert in gewissen Situationen so nicht, wenn er noch serverseitig ausgewertet werden muß.
Kein Problem ich hab nie was anderes gesagt ;-)
Mir ging es lediglich darum wie man die Fragestellung die zu diesem Zeitpunkt ja nicht vollständig war gelöst werden könnte, was damit passiert war gar nicht mein Thema.
Struppi.
Weil genau das die Ausgangslage war, ich erinnere an Deinen Code, den ich ergänzte
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">
<input type="checkbox" name="child_1" value="zeigen">
Dieser Code ist serverseitig - egal mit welcher Skriptsprache - nicht mehr sinnvoll auszuwerten! Jedenfalls wenn es darum geht, zu ermitteln, welche Checkboxen _exakt_ gewählt wurden.
Angenommen, es ist genau eine Checkbox ausgewählt, dann schickt der Browser: "child_1=zeigen".
Welche Checkbox war gewählt? Die erste, die zweite oder die dritte?
Zwei Fälle lassen sich natürlich trotzdem eindeutig auswerten:
1. Keine Checkbox ist gewählt - das klappt immer.
2. Alle Checkboxen sind gewählt - sofern man weiß, wieviele es insgesamt sind.
Aber jegliche Kombination aus "nur ein Teil der Checkboxen ist gewählt" wird scheitern, weil nicht ausgewählte Checkboxen eben vom Browser (standardgemäß!) überhaupt nicht in den Formulardaten auftauchen, man also nicht die Lücken der Checkboxen erhält, sondern nur die Summe der ausgewählten.
Um Checkboxen unterscheiden zu können, müssen sich also mindestens der Name _oder_ der Wert unterscheiden.
Und wenn's darum geht, funktional identische Checkboxen (hier: alle aktivieren die Anzeige der ihnen zugeordneten Spalte) zu benutzen, dann hat der Boxwert "ja" keine unterscheidungskräftige Aussage und kann problemlos zur Kennzeichnung des Spaltennamens verwendet werden.
Das wiederum erlaubt, den Checkboxen wirklich identische (im Sinne von HTML, Javascript, Perl, PHP, $whatever) Namen zu geben, um mit Javascript diese Boxgruppe als Array verarbeiten zu können.
Jede andere Lösung erscheint mir als extrem unsinnig, weil viel umständlicher. Bedingt sie doch Aussagen wie "Wenn's da noch nichts gibt, kann man es ja schnell schreiben" - ein Mehraufwand gegenüber den schon existierenden Lösungen.
- Sven Rautenberg
Ich kann dich nicht leiden.
Hi,
Ich kann dich nicht leiden.
Ist das "Kidz-Speech" für "Treffer! Versenkt!"?
Gruß, Cybaer
Hi,
wie mache ich das denn jetzt?
Ich verwende für so etwas das Attribut GID (für group id) und frage es den Inhalt ab, oder, wenn es valide zu den W3C-Standards sein soll, vergebe IDs mit einer fortlaufenden Nummer, und frage dann den Teil davor ab, oder vergebe Klassen, und nutze eine Funktion getElementsByClass().
Gruß, Cybaer
klingt intereesant.. haste auch n kleinen code schnipsel? google spuckt zuviel quatsch aus bei dem stichwort..
kantana
Hi,
klingt intereesant.. haste auch n kleinen code schnipsel? google spuckt zuviel quatsch aus bei dem stichwort..
In toggle() verwende ich per Default GID, und optional "standardkonforme" Attribute (wie z.B. ID).
Und auf getelementsby.com findest Du u.a. auch getElementsByClass()-Funktionen ...
Gruß, Cybaer