387 Stimmen

POST nicht markierte HTML-Kontrollkästchen

Ich habe eine ganze Reihe von Kontrollkästchen, die standardmäßig aktiviert sind. Meine Benutzer werden wahrscheinlich ein paar (wenn überhaupt) der Kontrollkästchen deaktivieren und den Rest aktiviert lassen.

Gibt es eine Möglichkeit, das Formular POST die Kontrollkästchen, die sind nicht überprüft werden, und nicht die, die sind überprüft?

23voto

Shailesh Kumar Punkte 5887

Eine gängige Technik zur Umgehung dieses Problems besteht darin, eine verborgene Variable mit jedem Ankreuzfeld mitzuführen.

<input type="checkbox" name="mycheckbox" />
<input type="hidden" name="mycheckbox.hidden"/>

Auf der Serverseite wird zunächst eine Liste versteckter Variablen ermittelt, und für jede der versteckten Variablen wird geprüft, ob das entsprechende Kontrollkästchen in den Formulardaten enthalten ist oder nicht.

Der serverseitige Algorithmus würde wahrscheinlich wie folgt aussehen:

for input in form data such that input.name endswith .hidden
  checkboxName = input.name.rstrip('.hidden')
  if chceckbName is not in form, user has unchecked this checkbox

Die obigen Ausführungen beantworten die Frage nicht genau, bieten aber eine alternative Möglichkeit, eine ähnliche Funktionalität zu erreichen.

13voto

Riley Stadel Punkte 179

Ich weiß, dass diese Frage schon 3 Jahre alt ist, aber ich habe eine Lösung gefunden, die meiner Meinung nach ziemlich gut funktioniert.

Sie können prüfen, ob die Variable $_POST zugewiesen ist und sie in einer Variablen speichern.

$value = isset($_POST['checkboxname'] ? 'YES' : 'NO';

die Funktion isset() prüft, ob die Variable $_POST zugewiesen ist. Wenn sie nicht zugewiesen ist, ist das Kontrollkästchen logischerweise nicht aktiviert.

12voto

Jeremy Punkte 131
$('input[type=checkbox]').on("change",function(){
    var target = $(this).parent().find('input[type=hidden]').val();
    if(target == 0)
    {
        target = 1;
    }
    else
    {
        target = 0;
    }
    $(this).parent().find('input[type=hidden]').val(target);
});

<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>
<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>
<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>

Wenn Sie den Namen des Kontrollkästchens weglassen, wird es nicht weitergegeben. Nur das Array test_checkbox.

11voto

Bart van Heukelom Punkte 41768

Sie können im Submit-Ereignis des Formulars etwas Javascript ausführen. Das ist alles, was Sie tun können, aber es gibt keine Möglichkeit, Browser dazu zu bringen, dies selbst zu tun. Das bedeutet auch, dass Ihr Formular für Benutzer ohne Javascript nicht funktionieren wird. Besser ist es, auf dem Server zu wissen, welche Kontrollkästchen vorhanden sind, so dass Sie aus den angegebenen Formularwerten ableiten können, dass diese nicht vorhanden sind ( $_POST in PHP) sind nicht angekreuzt.

11voto

TarranJones Punkte 3796

Mir gefällt auch die Lösung, dass Sie einfach ein zusätzliches Eingabefeld einfügen, die Verwendung von JavaScript erscheint mir ein wenig umständlich.

Je nachdem, was Sie für Ihr Backend verwenden, hängt es davon ab, welche Eingabe zuerst erfolgt.

Bei einem Server-Backend, bei dem das erste Vorkommen verwendet wird (JSP), sollten Sie wie folgt vorgehen.

  <input type="checkbox" value="1" name="checkbox_1"/>
  <input type="hidden" value="0" name="checkbox_1"/>

Bei einem Server-Backend, bei dem das letzte Vorkommen verwendet wird (PHP, Rails), sollten Sie wie folgt vorgehen.

  <input type="hidden" value="0" name="checkbox_1"/>
  <input type="checkbox" value="1" name="checkbox_1"/>

Für ein Server-Backend, bei dem alle Vorkommen in einem Listendatentyp gespeichert sind ( [] , array ). (Python / Zope)

Sie können in beliebiger Reihenfolge buchen, Sie müssen nur versuchen, den Wert aus der Eingabe mit der checkbox Typ-Attribut. Also der erste Index der Liste, wenn das Ankreuzfeld vor dem ausgeblendeten Element war, und der letzte Index, wenn das Ankreuzfeld nach dem ausgeblendeten Element war.

Für ein Server-Backend, bei dem alle Vorkommen mit einem Komma verkettet werden (ASP.NET / IIS) Sie müssen die Zeichenkette mit einem Komma als Trennzeichen aufteilen, um einen Listendatentyp zu erstellen. ( [] )

Jetzt können Sie versuchen, den ersten Index der Liste zu erfassen, wenn das Kontrollkästchen vor dem ausgeblendeten Element lag, und den letzten Index zu erfassen, wenn das Kontrollkästchen nach dem ausgeblendeten Element lag.

Backend parameter handling

Bildquelle

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X