Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Ankündigungen, News und Feedback > Tutorials > [JS] Alle Checkboxen auf einmal (de-)markieren
Antwort
 
Themen-Optionen
Alt 15.03.2006, 17:40   Nach oben    #1
Buhmann
Erfahrener Benutzer
 
Registriert seit: 19.08.2005
Beiträge: 113
Standard [JS] Alle Checkboxen auf einmal (de-)markieren

In diesem Tutorial wird beschrieben, wie man eine Checkbox erstellt, die mehrere Checkboxen auf einmal markieren / demarkieren kann.
Logischerweise funktioniert so etwas nur mit Javascript, was bedeutet, dass User, die Javascript deaktiviert haben, die Checkbox auch nicht benutzen können.

Wichtig: In diesem Tutorial wird nur beschrieben, wie man das Javascript baut. Wie ihr eine Liste mit Checkboxen macht, sollte euch also schon bekannt sein.

Das Grundgerüst
Hier ist ein Beispiel für ein Formular mit mehreren Checkboxen und einer Steuer-Checkbox, die allerdings noch keine Funktion hat:
HTML-Code:
<form name="f" action="index.php" method="post">
<input name="feld[0]" type="checkbox" />
<input name="feld[1]" type="checkbox" />
<input name="feld[2]" type="checkbox" />
<input name="feld[3]" type="checkbox" />
<input name="feld[4]" type="checkbox" />
<input name="feld[5]" type="checkbox" />
<input name="feld[6]" type="checkbox" />
Alle Auswählen <input type="checkbox" />
</form>
Wie ihr dieses Grundgerüst aufbaut, ist euch vollkommen selbst überlassen, wichtig ist nur, dass die Benennung der Checkboxen nach dem Format "name[nummer]" oder "name[]" geschieht.
Das erleichtert auch das Auslesen der Checkboxen später in einer PHP-Datei.

Schritt 1: Struktur der Funktion
Wir benötigen als erstes die Funktion mark() (wie ihr die nennt ist euch natürlich überlassen). Aufgabe der Funktion ist es, alle Checkboxen mit einem bestimmten Namen entweder zu aktivieren oder deaktivieren, je nachdem ob eine andere Checkbox aktiviert ist oder nicht.
Als Parameter werden also benötigt: Der Name der Felder und die Information: Aktivieren oder Deaktivieren.
Nun kann man natürlich nicht alle Namen von allen Checkboxen, die gesetzt werden sollen übergeben. Viel einfacher ist es, wenn man einen Präfix übergibt, also einen Namen, mit dem alle Checkboxen anfangen.
JavaScript Code:
  1. function mark(check,praefix) { //Alle Elemente, die mit praefix beginnen werden auf check gesetzt.
  2. }

Schritt 2: Erstellen einer Liste mit allen Checkboxen
Leider lassen sich die Checkboxen nicht mit der Funktion document.getElementsByName() auslesen, da ihre Namen ja unterschiedlich sind.
Stattdessen lesen wir einfach alle Elemente aus dem Formular aus, und überprüfen den Namen und den Typ.
JavaScript Code:
  1. function mark(check,praefix) { //Alle Elemente, die mit praefix beginnen werden auf check gesetzt.
  2.    var fields = document.forms&#91;"f"&#93;.elements;
  3.    for(i=0;i<fields.length;i++) {
  4.       var field = fields&#91;i&#93;;
  5.    }
  6. }
Als erstes werden alle Elemente des Formulars "f" (den Namen des Formulars kann man natürlich auch noch als Parameter für die Funktion nehmen, wenn man will) in die Variable fields gespeichert, damit der Code nicht allzu lang wird.
In der for-Schleife werden dann alle Elemente nacheinander aufgerufen. Die Variable field gibt dann immer das aktuelle Feld an.
Nun muss geprüft werden, ob der Name des Elements das Präfix aufweist und das Element auch eine Checkbox ist.
JavaScript Code:
  1. function mark(check,praefix) { //Alle Elemente, die mit praefix beginnen werden auf check gesetzt.
  2.    var fields = document.forms&#91;"f"&#93;.elements;
  3.    for(i=0;i<fields.length;i++) {
  4.       var field = fields&#91;i&#93;;
  5.       if((field.name.substr(0,praefix.length) == praefix) && (field.type == 'checkbox')) {
  6.          //Markieren
  7.       }
  8.    }
  9. }

Schritt 3: Aktivieren / deaktivieren der einzelnen Felder und Aufruf der Funktion.
Das Markieren der Felder ist dank der Variable check schnell getan, weil diese ja schon den gewünschten Zustand enthält.
JavaScript Code:
  1. function mark(check,praefix) { //Alle Elemente, die mit praefix beginnen werden auf check gesetzt.
  2.    var fields = document.forms&#91;"f"&#93;.elements;
  3.    for(i=0;i<fields.length;i++) {
  4.       var field = fields&#91;i&#93;;
  5.       if((field.name.substr(0,praefix.length) == praefix) && (field.type == 'checkbox')) {
  6.          field.checked = check;
  7.       }
  8.    }
  9. }

Um die Funktion aufzurufen, wird die Checkbox, die nachher alles steuern soll, um das Attribut "onclick" erweitert:
HTML-Code:
<input type="checkbox" onclick="mark(this.checked,'feld')" />
(Wir erinnern uns: Der erste Parameter gibt den gewünschten Zustand aller Felder an, der Zweite den Namen selbiger.)

Zwischenstand
Nun ist der Grundbau schon fertig. Wenn die Checkbox geklickt wird, übernehmen alle anderen Checkboxen, die mit einem bestimmten Präfix anfangen, automatisch ihren Status.

Der Code könnte nun so aussehen:
HTML-Code:
<script language="javascript" type="text/javascript">
   function mark(check,praefix) { //Alle Elemente, die mit praefix beginnen werden auf check gesetzt.
        var fields = document.forms["f"].elements;
        for(i=0;i<fields.length;i++) {
                var field = fields[i];
                if((field.name.substr(0,praefix.length) == praefix) && (field.type == 'checkbox')) {
                        field.checked = check;
                }
        }
   }
</script>
<form name="f" action="index.php" method="post">
<input name="feld[0]" type="checkbox" />
<input name="feld[1]" type="checkbox" />
<input name="feld[2]" type="checkbox" />
<input name="feld[3]" type="checkbox" />
<input name="feld[4]" type="checkbox" />
<input name="feld[5]" type="checkbox" />
<input name="feld[6]" type="checkbox" />
Alle Auswählen <input type="checkbox" onclick="mark(this.checked,'feld')" />
</form>
Schritt 4: Struktur der zweiten Funktion
Wie ihr sicher schnell bemerkt habt, hat das Script noch einen entscheidenden Fehler: Sobald eine andere Checkbox als die Steuer-Checkbox geändert wird, stimmt der Status dieser nicht mehr unbedingt.
Das ist zwar kein großes Problem, aber es kann u.U. den User verwirren.

Die Aufgabe der zweiten Funktion ist es nun, zu überprüfen, ob der Status der Steuer-Checkbox noch stimmt und ihn entsprechend anpassen.
Als Parameter brauchen wir nun zum einen die ID der Steuer-Checkbox (um sie nachher anzusprechen) und wieder ein Präfix für die Checkboxen, deren Status geprüft werden muss.
JavaScript Code:
  1. function test(feld,praefix) { //Das Feld feld ist genau dann geckeckt, wenn ale Elemente, die mit praefix beginnen, gechekt sind.
  2. }

Schritt 5: Aufbau der zweiten Funktion
Die Funktionsweise der Funktion ist wie folgt: Wenn mindestens eine Checkbox nicht ausgewählt ist, soll auch die Steuer-Checkbox nicht ausgewält sein.
Wir setzten also zu Beginn eine Variable auf true (= alle Checkboxen sind aktiviert), die dann später auf false gesetzt wird, wenn eine Checkbox nicht aktiviert ist.
Dazu benötigen wir wieder eine Schleife, die wir unverändert aus der ersten Funktion übernehmen können.
JavaScript Code:
  1. function test(feld,praefix) { //Das Feld feld ist genau dann geckeckt, wenn ale Elemente, die mit praefix beginnen, gechekt sind.
  2.    var allchecked = true;
  3.    var fields = document.forms&#91;"f"&#93;.elements;
  4.    for(i=0;i<fields.length;i++) {
  5.       var field = fields&#91;i&#93;;
  6.       if((field.name.substr(0,praefix.length) == praefix) && (field.type == 'checkbox')) {
  7.          //Status überprüfen
  8.       }
  9.    }
  10.    //Status der Steuer-Checkbox gegebenfalls anpassen
  11. }
Der Code zum Überprüfen des Status jedes Feldes ist denkbar einfach. Wenn es nicht gecheckt ist, wird die Variable allchecked auf false gesetzt, sonst wird keine Änderung vorgenommen.
Die Steuer-Checkbox wird dann ausgewählt, wenn allchecked = true ist, sonst wird sie nicht gecheckt.
JavaScript Code:
  1. function test(feld,praefix) { //Das Feld feld ist genau dann geckeckt, wenn ale Elemente, die mit praefix beginnen, gechekt sind.
  2.    var allchecked = true;
  3.    var fields = document.forms&#91;"f"&#93;.elements;
  4.    for(i=0;i<fields.length;i++) {
  5.       var field = fields&#91;i&#93;;
  6.       if((field.name.substr(0,praefix.length) == praefix) && (field.type == 'checkbox')) {
  7.          if(!field.checked) {
  8.             allchecked = false;
  9.          }
  10.       }
  11.    }
  12.    document.getElementById(feld).checked = allchecked;
  13. }
Schritt 6:Aufruf der Funktion
Für die Identifizierung muss als erstes der Steuer-Checkbox eine ID zugewiesenwerden:
HTML-Code:
<input type="checkbox" id="all" onclick="mark(this.checked,'feld')" />
Die Funktion muss logischerweise nur dann aufgerufen werden, wenn eine der vielen Checkboxen geändert wird, d.h. sie bekommen alle auch ein onclick-Attribut:
HTML-Code:
<input name="feld[0]" type="checkbox" onclick="test('all','feld')" />
(Dieses Attribut bekommen natürlich alle checkboxen außer der Steuer-Checkbox.)

Endstand
Der vollständige Code kann nun so aussehen:
HTML-Code:
<script language="javascript" type="text/javascript">
   function mark(check,praefix) { //Alle Elemente, die mit praefix beginnen werden auf check gesetzt.
        var fields = document.forms["f"].elements;
        for(i=0;i<fields.length;i++) {
                var field = fields[i];
                if((field.name.substr(0,praefix.length) == praefix) && (field.type == 'checkbox')) {
                        field.checked = check;
                }
        }
   }

   function test(feld,praefix) { //Das Feld feld ist genau dann geckeckt, wenn ale Elemente, die mit praefix beginnen, gechekt sind.
        var allchecked = true;
        var fields = document.forms["f"].elements;
        for(i=0;i<fields.length;i++) {
                var field = fields[i];
                if((field.name.substr(0,praefix.length) == praefix) && (field.type == 'checkbox')) {
                        if(!field.checked) {
                                allchecked = false;
                        }
                }
        }
        document.getElementById(feld).checked = allchecked;
   }
</script>
<form name="f" action="index.php" method="post">
<input name="feld[0]" type="checkbox" onclick="test('all','feld')" />
<input name="feld[1]" type="checkbox" onclick="test('all','feld')" />
<input name="feld[2]" type="checkbox" onclick="test('all','feld')" />
<input name="feld[3]" type="checkbox" onclick="test('all','feld')" />
<input name="feld[4]" type="checkbox" onclick="test('all','feld')" />
<input name="feld[5]" type="checkbox" onclick="test('all','feld')" />
<input name="feld[6]" type="checkbox" onclick="test('all','feld')" />
Alle Auswählen <input type="checkbox" id="all" onclick="mark(this.checked,'feld')" />
</form>
Ich hoffe, dass mein erstes Tutorial einigermaßen gelungen ist und alles verständlich war.

Geändert von Buhmann (16.03.2006 um 14:35 Uhr).
Buhmann ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[PHP] FTP-Funktionen in PHP nutzen MrNiceGuy Tutorials 0 24.05.2006 14:18
Textfelder auf verschiedenen Tabs per Observer synchronisieren Sayang Desktop-Applikationen und Grafik 2 05.12.2005 19:14
[PHP] Aktuell gespielten Titel von XMMS auf einer Webseite in einer Grafik anzeigen Corvin Tutorials 0 28.11.2005 16:26
Forensoftware auf Version 3.5.1 aktualisiert Ben Archiv 0 04.11.2005 01:51
Login auf mehreren Domains Homepagespeicher PHP-Programmierung 17 21.08.2005 16:54


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:49 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.0.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44