Checkbox Group prüfen

SonicBe@m

Erfahrenes Mitglied
Hy leute :)
also ich hab momentan ein javascript welches nicht so will wie ich mir das vorstelle :(

es geht darum das ich ein javascript schreiben möchte bzw angefangen habe was auf einer seite unabhängig davon wieviele checkboxen es gibt und unabhängig wieviele gruppen es davon gibt
jede gruppe darrauf abprüft ob minderstens eine checkbox geklickt wurde

die einzige sache die ich sagen kann was man haben darf ist im html ein weieres attribut bei den checkboxen (group = "xy")

ich paste mal meinen code vom js

PHP:
function checkCheckBoxGroups(){
	docLength = document.getElementsByTagName('input').length;
	questions = new Array();
	question = "";
	for(i=0;i<docLength;i++){
		elem = document.getElementsByTagName('input')[i];
		if(elem.type == "checkbox"){
			if(question != elem.name){
				question = elem.name;
				questions.push(elem);
			}
		}
	}

	groups= new Array();

	for(i=0;i<questions.length;i++){
		if(groups.length == 0)
			groups.push(questions[i].group);
		if(i < questions.length-1){
//			alert(questions[i].name);
			if(questions[i].group != questions[i+1].group){
//				alert(questions[i].group);
				groups.push(questions[i].group);
			}
		}
		if(i+1 == questions.length){
//			alert(questions[i].name);
			if(questions[i].group != questions[i-1].group)
				groups.push(questions[i].group);
		}
	}

	for(i=1;i<=groups.length;i++){
		checkedGroups=0;
		for(j=0;j<questions.length;j++){
			if(questions[j].group == groups[i-1]){
				if(questions[j].checked)
					checkedGroups++;
			}
		}
		if(checkedGroups == 0)
			return false;
	}
	return true;
}

die funktion soll in erster linie nichts anderes machen als die gruppen in ein array zu werfen und diese dann zu überprüfen
kenn ihr ne möglichkeit es einfacher zu gestalten?
mom hab ich nen echtes prob :(

leider werd ich dazu gezwungen da ich etwas in xml xsl machen soll und die groups als string exestieren also nicht vortlaufen sind
das einzige was bei der methode ausgeführt werden soll ist sie selbst und dass ohne argumente
also nur noch
checkBoxen()
und schon gibt er true oder false zurrück je nachdem ob in allen groupen minderstens ein feld angeklickt wurde oder in einer nichts angewählt wurde

um auf das attribut einzugehen
<input type="checkbox" name="xy" value="xy" group="xy">

der name ist immer unterschiedlich nur die groupe kann öfters vorkommen aber muss min 2 boxen enthalten

wäre euch super dankbar wenn ihr mir helfen könntet

in diesem js häng ich leider am ende da irrgend wie nicht das passiert was ich mir vorstelle :(
 
Der Anfang sieht doch schon vielversprechend aus:)
Ich würds aber weniger kompliziert machen....
in der ersten Schleife hast du ja schon alles, was du an Informationen brauchst-den Gruppennamen der Checkbox und ob sie gecheckt ist.
Das kannst du gleich so in einen Array packen.

Praktisch wäre da bspw. ein assoziativer Array, dessen Schlüsselname identisch ist mit dem Gruppennamen.
Dort kannst du dann wiederum in einem Array bei jedem Element zwei Sachen speichern...
1.ist es gecheckt
2.Anzahl der Gruppenelemente.

Beim ersten inkrementierst du, wenn ein Element gecheckt wurde, beim 2. immer.

Da hast du dann zum Schluss nen prima Array mit allem was du brauchst:
Arraykey->Gruppenname
Element1->Anzahl gecheckter Boxes
Element2->Anzahl Boxes gesamt

:)
Code:
<script type="text/javascript">
<!--
function checkCheckBoxGroups()
{
arrGroups=new Array();

//Inputs durchlaufen
for(e=0;e<document.getElementsByTagName('input').length;e++)
    {
    objElem = document.getElementsByTagName('input')[e];

    //Ist input eine Checkbox und hat sie einen Namen?
    if(objElem.type == "checkbox"&&objElem.group)
        {

        //Gibt es noch keinen mit dem Gruppennamen identischen Arraykey?
        if(typeof arrGroups[objElem.group]=='undefined')
            {

            //Nein?...Dann wird dieses Arrayelement erstellt
            arrGroups[objElem.group]=new Array(0,0);
            }

        //Das erste Arrayelement dieses Arrays wird hochgezählt, falls Checkbox gecheckt
        arrGroups[objElem.group][0]+=(objElem.checked):0;

        //Das zweite immer hochzählen
        arrGroups[objElem.group][1]++;
        }
    }

//Array durchlaufen
for(var strGroupName in arrGroups)
    {
    //Wenn sich mehr als 1 Element in der Gruppe befinden und 0 Elemente gecheckt sind....
    if(arrGroups[strGroupName][1]>1&&arrGroups[strGroupName][0]==0)
        {
        return false;
        }
    }
return true;
}

//-->
</script>
 
Sieht 1a aus!
Nur bekomm ich wenn ichs damit teste nen Fehler, das ein Objekt nicht gefunden wird.
Das komische ist das er das im HTML und nicht im Js-file sagt O-o.
Kannste evt. noch dein test.html mit reinpacken?
Du hast recht auf die art ists echt fein gelöst,
ich war nur nun schon *g* 29 stunden wach und bin entsprechend ausgelaugt :(
aber so sauber hätte ichs warscheinlich dennoch nicht gelöst :) *daumenhoch*
 
:-(Merkwürdig..das Board schnippelt da immer was aus'm Code heraus?
Code:
<script type="text/javascript">
<!--
function checkCheckBoxGroups()
{
arrGroups=new Array();

for(e=0;e<document.getElementsByTagName('input').length;e++)
    {
    objElem = document.getElementsByTagName('input')[e];
    if(objElem.type == "checkbox"&&objElem.group)
        {
        if(typeof arrGroups[objElem.group]=='undefined')
            {
            arrGroups[objElem.group]=new Array(0,0);
            }
        arrGroups[objElem.group][0]+=(objElem.checked)?1:0;
        arrGroups[objElem.group][1]++;
        }
    }
for(var strGroupName in arrGroups)
    {
    if(arrGroups[strGroupName][1]>1&&arrGroups[strGroupName][0]==0)
        {
        return false;
        }
    }
return true;
}

//-->
</script>
-->Test
(Funktioniert so nur im IE, da <input> lt.HTML kein group-Attribut hat.. aber du willsts ja mit xml machen...da kannst du das Attribut ja hinzufügen:))
 
Zuletzt bearbeitet:
autsch

Ist das die einzige möglichkeit?
sollte eigentlich schon ne lösung werden die in möglichst vielen Browsers funktioniert
z.b. Mozilla . Opera und IE
wäre echt schade wenns nicht anders geht :(
gäbe es noch eine andere art um das problem zu lösen oder ist das die einzige?

imo muss ich dann wohl doch auf String-parsing umsteigen,
so das der Name berreits die Gruppe und Fragennummer enthält
 
Ich denk, du sollst das in XML machen

Da brauchst dann doch auch einen Parser für selbiges... beim IE ist ab 5.0 einer inklusive... wie es bei Opa und Mozilla aussieht, weiss ich nicht
:(

Das über "name" alleine zu regeln, wäre ne Möglichkeit...

name="xyz_1"... den Namen splitten anhand von "_" ....erster Teil ist der Gruppenname, zweiter Teil FRagenummer.
 
Zurück