checkbox prob

davido

Grünschnabel
Hallo leutz,
da ich grad an meiner hompage bastle, und grade net weiderkommen, wolte ich euch mal um Rat bitten. Und zwar habe ich ein Problem mit checkboxen.
Ich habe 16 checkboxes. Ich möchte aber, das man nur 3 auswählen kann, und wenn man 4 checkboxes anwählt, soll das erste checkbox nicht mehr aktiviert sein. (also das erste welches man angeklickt hat, soll nicht mehr aktiviert sein.) Kann mir viell. dort jemand weiterhelfen, wie ich das lösen könnte. Ich habe überhaupt keine Ahnung von java.

MFG, davido
 
Zunächst sind wohl drei Variablen nötig, die die zur Zeit aktiven Checkboxindices enthalten. Wird eine neue Checkbox aktiviert, werden alle Werte um eins verschoben, der letzte verfällt und der erste erhält die neu aktivierte Checkbox.
Jedes Mal, wenn man eine Checkbox aktiviert, wird eine Funktion aufgerufen, die eben Genanntes durchführt.

Erstmal ein bisschen HTML:
Code:
<form name="test">
  <input type="checkbox" name="checky" onClick="AddChecky (0)"> Check 1<br>
  <input type="checkbox" name="checky" onClick="AddChecky (1)"> Check 2<br>
  <input type="checkbox" name="checky" onClick="AddChecky (2)"> Check 3<br>
  <input type="checkbox" name="checky" onClick="AddChecky (3)"> Check 4<br>
...
  <input type="checkbox" name="checky" onClick="AddChecky (15)"> Check 16<br>
</form>

Und ein bisschen JS:
Code:
var a = -1, b = -1, c = -1; // Variablen auf 'leeren' Wert setzen

// Funktion wird Index der zuletzt aktivierten Checkbox übergeben
function AddChecky (n)
{
  // Wenn mindestens drei Checkboxen aktiv sind (d. h. c ist nicht mehr -1), die zuerst aktivierte deaktivieren
  if (c >= 0)
    document.test.checky[ c].checked = false;

  // Werte verschieben und neuen Wert speichern
  c = b;
  b = a;
  a = n;
}

Weiterhin ist es natürlich sinnvoll, eine Behandlung für den Fall zu schreiben, wenn Checkboxen vom Benutzer deaktiviert werden, dann müssten Variablen entsprechend verändert werden (von hinten nach vorne sukzessive wieder auf -1).

Soweit der Ansatz.
Bei weiteren Fragen einfach meckern.
 
Zuletzt bearbeitet:
OK, das hat mir schonmal geholfen. jetzt teste ich mal ein wenig rum, wie das funkt wenn man enie checkbox ddeaktiviert. Und wenn cih net drauf komm, frag ich einfach. Aber ich versuchs erstaml selber ;)

MFG, davido
 
Ein kleiner Denkanstoß:
Als erstes in der Funktion abfragen, ob die Checkbox des übergebenen Index nun deaktiviert wurde.

Code:
if (!document.form.checky[n].checked) { ... }

Darin folgt eine Fallunterscheidung:
- Ist c >= 0 (und damit alle drei Variablen belegt), so wird c auf -1 gesetzt und die Funktion verlassen (noch zwei Checkboxen sind aktiv, d. h. a und b sind belegt).
- Ist c == -1, so wird b auf -1 gesetzt und die Funktion verlassen (noch eine Checkbox ist aktiv, d. h. a ist belegt).
- Ist b == -1 (und somit auch c), so wird a auf -1 gesetzt und die Funktion verlassen (keine Checkbox mehr aktiv, d. h. alle Variablen sind auf -1 gesetzt).

Viel Glück...
 
Danke für deine Hilfe

Ich versuche halt mal mein bestes, obwohl ich mich 0 mit JS auskenne, aber was nicht ist, kann ja noch werde ;)

MFG, davido
 
Zuletzt bearbeitet:
So, hab jetzt en bisschen rumprobiert, aber irgendwie schint es nicht richtig zu funktionieren. Also so weit hab ich es schonmal. (es wird mich jetzt eh jeder auslachen, aber egal):

Code:
<SCRIPT language=javascript1.2>
var a = -1, b = -1, c = -1; // Variablen auf 'leeren' Wert setzen

// Funktion wird Index der zuletzt aktivierten Checkbox übergeben
function AddChecky (n)
{
  // Wenn mindestens drei Checkboxen aktiv sind (d. h. c ist nicht mehr -1), die zuerst aktivierte deaktivieren
  if (c >= 0)
    document.test.checky[ c].checked = false;
  // Werte verschieben und neuen Wert speichern
  c = b;
  b = a;
  a = n;
  if (!document.test.checky[n].checked) 
  {
  	if (c >= 0)
  	{
  		c = -1;
  	}
    if (c == -1)
    {
    	b = -1;
    }
    if (b == -1)
    {
    	a = -1;
    }
  }  
}

Und diese FUnktion funkt nur halb-richtig. Könntest du mir bidde sagen, was dran flasch ist (Keine Lösung, nur Ansätze <-- will es ja lernen)

(P.S. könnte es sein, dass die einstellung:
eMail Benachrichtigung: Du bekommst eine eMail, wenn jemand auf diesen Beitrag antwortet. Nur für registrierte Bentuzer.
nicht funktioniert? hab noch keine e-mail erhalten :( )
 
Der Ansatz ist doch schon richtig.
Nur einige kleine Veränderungen, damit es (hoffentlich) funktioniert:

- Die Abfrage, ob die Checkbox deaktiviert wurde, sollte innnerhalb der Funktion als erstes stehen, danach der Code für gerade aktivierte Checkboxen.
- Die drei if-Anweisungen (c >= 0), (c == -1) und (b == -1) sind schon korrekt, jedoch muss noch jeweils ein return; ergänzt werden, da sonst nach der Prüfung nicht aus der Funktion ausgebrochen wird (was ja geschehen soll, denn der folgende Code, der ja nur für den Fall bestimmt ist, dass eine Checkbox aktiviert wurde, soll nicht mehr ausgeführt werden).
- Noch ein Fehler meinerseits in der vorhergehenden Antwort... Die Reihenfolge der drei if-Anweisungen sollte umgekehrt sein. Das macht mehr Sinn, wenn man kurz über die Logik nachdenkt.
 
Zuletzt bearbeitet:
so, hab mir mal deine Auflösung angeaschaut, und diese funktioniert auch nur halbwegs. Wenn man 3 Checkboxes anklickt, und das erstangeklickte löscht, und nochmal eins anklickt, funktionierts, wenn man aber 2 checkbox anklickt, bleibt das erstangeklickte stehen. (schwer zu erklären, einfach selber testen, das kapierst was ich meine)
 
Hallo....

für diese Aufgabe bietet es sich an, mit Arrays zu arbeiten.

Ausserhalb der Funktion lege einen Array an.

Der Funktion Übergebe per "this" die checkbox als Objekt.

In der Funktion gibt es 2 Möglichkeiten...

  • die Box ist gechecked
    .... hänge sie an den Array per push() ran.
    Dann überprüfe, ob der Array mehr als 3 Elemente enthält...
    ist dies der Fall, setze beim ersten Array-Element checked auf false und entferne es sodann per shift() aus dem Array.
  • die Box ist nicht gechecked
    Entferne die aktuelle Checkbox aus dem Array.
 
Zurück