it-swarm.com.de

POST nicht aktivierte HTML-Kontrollkästchen

Ich habe eine Menge Kontrollkästchen, die standardmäßig aktiviert sind. Meine Benutzer werden wahrscheinlich einige (falls vorhanden) der Kontrollkästchen deaktivieren und den Rest aktiviert lassen.

Gibt es eine Möglichkeit, das Formular zu erstellen POST die Kontrollkästchen, die nicht aktiviert sind, und nicht die, die sind aktiviert sind?

276
reach4thelasers

Fügen Sie eine versteckte Eingabe für das Kontrollkästchen mit einer anderen ID hinzu:

<input id='testName' type='checkbox' value='Yes' name='testName'>
<input id='testNameHidden' type='hidden' value='No' name='testName'>

Deaktivieren Sie vor dem Absenden des Formulars die ausgeblendete Eingabe basierend auf der aktivierten Bedingung:

if(document.getElementById("testName").checked) {
    document.getElementById('testNameHidden').disabled = true;
}
194
vishnu

Die Lösung, die mir bisher am besten gefallen hat, ist, eine versteckte Eingabe mit demselben Namen wie das Kontrollkästchen zu platzieren, das möglicherweise nicht aktiviert ist. Ich denke, es funktioniert so, dass, wenn das Kontrollkästchen nicht aktiviert ist, die versteckte Eingabe weiterhin erfolgreich ist und an den Server gesendet wird. Wenn das Kontrollkästchen aktiviert ist, wird die versteckte Eingabe jedoch überschrieben. Auf diese Weise müssen Sie nicht nachverfolgen, welche Werte in den veröffentlichten Daten voraussichtlich von Kontrollkästchen stammen.

<form>
  <input type='hidden' value='0' name='selfdestruct'>
  <input type='checkbox' value='1' name='selfdestruct'>
</form>
437
Sam

Ich habe es mit Vanilla JavaScript gelöst:

<input type="hidden" name="checkboxName" value="0"><input type="checkbox" onclick="this.previousSibling.value=1-this.previousSibling.value">

Achten Sie darauf, dass zwischen diesen beiden Eingabeelementen keine Leerzeichen oder Zeilenumbrüche stehen!

Sie können this.previousSibling.previousSibling um "obere" Elemente zu erhalten.

Mit PHP können Sie das benannte versteckte Feld auf 0 (nicht gesetzt) ​​oder 1 (gesetzt) ​​prüfen.

63
Marcel Ennix

Mein persönlicher Favorit ist das Hinzufügen eines ausgeblendeten Felds mit demselben Namen, das verwendet wird, wenn das Kontrollkästchen deaktiviert ist. Aber die Lösung ist nicht so einfach, wie es scheint.

Wenn Sie diesen Code hinzufügen:

<form>
  <input type='hidden' value='0' name='selfdestruct'>
  <input type='checkbox' value='1' name='selfdestruct'>
</form>

Dem Browser ist es egal, was Sie hier tun. Der Browser sendet beide Parameter an den Server und der Server muss entscheiden, was mit ihnen geschehen soll.

PHP verwendet beispielsweise den letzten zu verwendenden Wert (siehe: Autorisierende Position doppelter HTTP-GET-Abfrageschlüssel )

Aber andere Systeme, mit denen ich gearbeitet habe (basierend auf Java), machen es genau so - sie bieten Ihnen nur den ersten Wert. .NET liefert stattdessen ein Array mit beiden Elementen

Ich werde versuchen, dies irgendwann mit node.js, Python und Perl zu testen.

22
SimonSimCity

Eine gebräuchliche Technik besteht darin, zu jedem Kontrollkästchen eine versteckte Variable mitzuführen.

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

Auf der Serverseite ermitteln wir zuerst eine Liste der ausgeblendeten Variablen und versuchen für jede ausgeblendete Variable festzustellen, ob der entsprechende Ankreuzfeldeintrag in den Formulardaten übermittelt wurde oder nicht.

Der serverseitige Algorithmus würde wahrscheinlich so 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

Das Obige beantwortet die Frage nicht genau, bietet jedoch eine alternative Möglichkeit, ähnliche Funktionen zu erzielen.

20
Shailesh Kumar

sie müssen kein verstecktes Feld für alle Kontrollkästchen erstellen. Kopieren Sie einfach meinen Code. Wenn diese Option nicht aktiviert ist, wird der Wert des Kontrollkästchens geändert. Die value weist 0 zu. Wenn diese Option aktiviert ist, weisen Sie value1 zu.

$("form").submit(function () {

    var this_master = $(this);

    this_master.find('input[type="checkbox"]').each( function () {
        var checkbox_this = $(this);


        if( checkbox_this.is(":checked") == true ) {
            checkbox_this.attr('value','1');
        } else {
            checkbox_this.prop('checked',true);
            //DONT' ITS JUST CHECK THE CHECKBOX TO SUBMIT FORM DATA    
            checkbox_this.attr('value','0');
        }
    })
})
18
Rameez SOOMRO

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

11
$('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 übergeben. Nur das Array test_checkbox.

11
Jeremy

Ich würde eigentlich folgendes machen.

Habe mein verstecktes Eingabefeld mit dem gleichen Namen mit der Checkbox eingegeben

<input type="hidden" name="checkbox_name[]" value="0" />
<input type="checkbox" name="checkbox_name[]" value="1" />

und dann, wenn ich poste, entferne ich zuerst die doppelten Werte, die in dem $ _POST-Array aufgenommen wurden, und sehe, dass jeder der eindeutigen Werte angezeigt wird.

  $posted = array_unique($_POST['checkbox_name']);
  foreach($posted as $value){
    print $value;
  }

Ich habe dies aus einem Post bekommen entferne doppelte Werte aus dem Array

10
desw

"Ich habe mich für den Server-Ansatz entschieden. Scheint gut zu funktionieren - danke. - reach4thelasers 1. Dezember 09 um 15:19" Ich würde es gerne vom Eigentümer empfehlen. Wie zitiert: Javascript-Lösung hängt davon ab, wie der Server-Handler (ich habe es nicht überprüft)

sowie

if(!isset($_POST["checkbox"]) or empty($_POST["checkbox"])) $_POST["checkbox"]="something";
8
N Zhang

Die meisten Antworten hier erfordern die Verwendung von JavaScript oder doppelten Eingabesteuerelementen. Manchmal muss dies vollständig auf der Serverseite erledigt werden.

Ich glaube, der (beabsichtigte) Schlüssel zur Lösung dieses allgemeinen Problems ist die Eingabesteuerung des Formulars.

Um ungeprüfte Werte für Kontrollkästchen erfolgreich zu interpretieren und zu verarbeiten, müssen Sie über folgende Kenntnisse verfügen:

  1. Die Namen der Kontrollkästchen
  2. Der Name des Eingabeelements für die Übermittlung des Formulars

Wenn Sie überprüfen, ob das Formular gesendet wurde (dem Eingabeelement für die Übermittlung wird ein Wert zugewiesen), können alle nicht aktivierten Kontrollkästchenwerte angenommen sein.

Zum Beispiel:

<form name="form" method="post">
  <input name="value1" type="checkbox" value="1">Checkbox One<br/>
  <input name="value2" type="checkbox" value="1" checked="checked">Checkbox Two<br/>
  <input name="value3" type="checkbox" value="1">Checkbox Three<br/>
  <input name="submit" type="submit" value="Submit">
</form>

Bei der Verwendung von PHP ist es ziemlich trivial zu erkennen, welche Kontrollkästchen aktiviert wurden.

<?php

$checkboxNames = array('value1', 'value2', 'value3');

// Persisted (previous) checkbox state may be loaded 
// from storage, such as the user's session or a database.
$checkboxesThatAreChecked = array(); 

// Only process if the form was actually submitted.
// This provides an opportunity to update the user's 
// session data, or to persist the new state of the data.

if (!empty($_POST['submit'])) {
    foreach ($checkboxNames as $checkboxName) {
        if (!empty($_POST[$checkboxName])) {
            $checkboxesThatAreChecked[] = $checkboxName;
        }
    }
    // The new state of the checkboxes can be persisted 
    // in session or database by inspecting the values 
    // in $checkboxesThatAreChecked.
    print_r($checkboxesThatAreChecked);
}

?>

Anfangsdaten konnten bei jedem Seitenaufruf geladen werden, sollten jedoch nur geändert werden, wenn das Formular gesendet wurde. Da die Namen der Kontrollkästchen im Voraus bekannt sind, können sie einzeln abgefahren und geprüft werden, sodass das Fehlen ihrer einzelnen Werte darauf hinweist, dass sie nicht aktiviert sind.

7
Werner

Ich habe zuerst Sams Version ausprobiert. Gute Idee, aber es gibt mehrere Elemente im Formular mit dem gleichen Namen. Wenn Sie JavaScript verwenden, das Elemente anhand des Namens findet, wird jetzt ein Array von Elementen zurückgegeben.

Ich habe Shaileshs Idee in PHP ausgearbeitet, es funktioniert für mich. Hier ist mein Code:

/* Löschen Sie '.hidden'-Felder, wenn das Original vorhanden ist. Verwenden Sie andernfalls den Wert' .hidden '. */
 foreach ($ _POST ['frmmain'] als $ field_name => $ value) 
 {
 // Betrachte nur Elemente, die mit '.hidden' 
 if (! substr ($ field_name, -strlen ('. hidden')) {
 break; 
} 
 
 // den Namen ohne '.hidden' 
 $ real_name = substr ($ key, strlen ($ field_name) - strlen ('. hidden')); 
 
 // Erstelle ein 'falsches' Original Feld mit dem Wert in '.hidden', wenn kein Original existiert 
 if (! array_key_exists ($ real_name, $ POST_copy)) {
 $ _POST [$ real_name] = $ value; 
} 
 
 // Lösche das nicht gesetzte '.hidden'-Element 
 ($ _ POST [$ field_name]); 
} 
6
Wouter

Mir gefällt auch die Lösung, dass Sie einfach ein zusätzliches Eingabefeld posten, die Verwendung von JavaScript scheint mir ein wenig hacky.

Abhängig davon, was Sie für Ihr Backend verwenden, hängt es davon ab, welche Eingabe zuerst eingeht.

Für ein Server-Backend, bei dem das erste Vorkommen verwendet wird (JSP), sollten Sie Folgendes tun.

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


Für ein Server-Backend, in dem das letzte Vorkommen verwendet wird (PHP, Rails), sollten Sie Folgendes tun.

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


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

Sie können in beliebiger Reihenfolge veröffentlichen. Sie müssen lediglich versuchen, den Wert aus der Eingabe mit dem Typ-Attribut checkbox abzurufen. Der erste Index der Liste, wenn sich das Kontrollkästchen vor dem ausgeblendeten Element befand, und der letzte Index, wenn sich das Kontrollkästchen hinter dem ausgeblendeten Element befand.


Für ein Server-Backend, bei dem alle Vorkommen mit einem Komma verkettet sind (ASP.NET/IIS), müssen Sie die Zeichenfolge unter Verwendung eines Kommas als Begrenzer (split/explosion), um einen Listendatentyp zu erstellen. ([])

Jetzt können Sie versuchen, den ersten Index der Liste abzurufen, wenn sich das Kontrollkästchen vor dem ausgeblendeten Element befand, und den letzten Index abzurufen, wenn sich das Kontrollkästchen hinter dem ausgeblendeten Element befand.

Backend parameter handling

Bildquelle

6
TarranJones

Ich verwende diesen Block von jQuery, der bei jeder Übergabe eine versteckte Eingabe zu jedem nicht aktivierten Kontrollkästchen hinzufügt. Sie erhalten garantiert immer einen Wert, der für jedes Kontrollkästchen gesendet wird, ohne dass Ihr Markup unübersichtlich wird und Sie das Risiko eingehen, dies für ein Kontrollkästchen zu vergessen, das Sie später hinzufügen. Es ist auch unabhängig von dem von Ihnen verwendeten Backend-Stack (PHP, Ruby usw.).

// Add an event listener on #form's submit action...
$("#form").submit(
    function() {

        // For each unchecked checkbox on the form...
        $(this).find($("input:checkbox:not(:checked)")).each(

            // Create a hidden field with the same name as the checkbox and a value of 0
            // You could just as easily use "off", "false", or whatever you want to get
            // when the checkbox is empty.
            function(index) {
                var input = $('<input />');
                input.attr('type', 'hidden');
                input.attr('name', $(this).attr("name")); // Same name as the checkbox
                input.attr('value', "0"); // or 'off', 'false', 'no', whatever

                // append it to the form the checkbox is in just as it's being submitted
                var form = $(this)[0].form;
                $(form).append(input);

            }   // end function inside each()
        );      // end each() argument list

        return true;    // Don't abort the form submit

    }   // end function inside submit()
);      // end submit() argument list
6
Matt Holden

Sie können das Ereignis form.submit auch abfangen und die Prüfung vor dem Senden rückgängig machen

$('form').submit(function(event){
    $('input[type=checkbox]').prop('checked', function(index, value){
        return !value;
    });
});
5
Jimchao

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

Sie können überprü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 es nicht zugewiesen ist, wird das Kontrollkästchen nicht aktiviert.

4
Riley Stadel
$('form').submit(function () {
    $(this).find('input[type="checkbox"]').each( function () {
        var checkbox = $(this);
        if( checkbox.is(':checked')) {
            checkbox.attr('value','1');
        } else {
            checkbox.after().append(checkbox.clone().attr({type:'hidden', value:0}));
            checkbox.prop('disabled', true);
        }
    })
});
4
Sajjad Shirazy

Ich sehe, diese Frage ist alt und hat so viele Antworten, aber ich werde trotzdem meinen Cent geben. Ich stimme für die Javascript-Lösung beim "submit" -Ereignis des Formulars, wie einige betont haben. Kein Verdoppeln der Eingaben (besonders wenn Sie lange Namen und Attribute mit PHP-Code und HTML haben), keine serverseitige Mühe (das würde erfordern, alle Feldnamen zu kennen und sie einzeln zu überprüfen), holen Sie einfach alle ungeprüften Elemente Weisen Sie ihnen den Wert 0 zu (oder was auch immer Sie benötigen, um den Status "Nicht überprüft" anzugeben), und ändern Sie dann das Attribut "Überprüft" in "Wahr"

    $('form').submit(function(e){
    var b = $("input:checkbox:not(:checked)");
    $(b).each(function () {
        $(this).val(0); //Set whatever value you need for 'not checked'
        $(this).attr("checked", true);
    });
    return true;
});

auf diese Weise erhalten Sie ein $ _POST-Array wie das folgende:

Array
(
            [field1] => 1
            [field2] => 0
)
4
MarcoSpada

Ich würde es vorziehen, die $ _POST zusammenzustellen

if (!$_POST['checkboxname']) !$_POST['checkboxname'] = 0;

wenn POST nicht über den Wert 'checkboxname' verfügt, wurde dies deaktiviert und ein Wert zugewiesen.

sie können ein Array Ihrer ckeckbox-Werte erstellen und eine Funktion erstellen, die überprüft, ob Werte vorhanden sind. Wenn dies nicht der Fall ist, können Sie einen Wert zuweisen

2
Felipe Gonzalez

Was ich getan habe, war ein bisschen anders. Zuerst habe ich die Werte aller nicht aktivierten Kontrollkästchen geändert. Auf "0", dann alle ausgewählt, damit der Wert übergeben wird.

function checkboxvalues(){
  $("#checkbox-container input:checkbox").each(function({ 
    if($(this).prop("checked")!=true){
      $(this).val("0");
      $(this).prop("checked", true);
    }
  });
}
2
Seborreia

Kontrollkästchen stehen normalerweise für Binärdaten, die in der Datenbank als Ja/Nein-, J/N- oder 1/0-Werte gespeichert sind. HTML-Checkboxen können nur dann einen Wert an den Server senden, wenn die Checkbox aktiviert ist! Das bedeutet, dass das Serverskript auf einer anderen Site im Voraus wissen muss, welche Kontrollkästchen auf der Webseite möglich sind, um positive (markierte) oder negative (nicht markierte) Werte speichern zu können. Tatsächlich sind nur negative Werte problematisch (wenn der Benutzer den zuvor (vor) überprüften Wert deaktiviert - wie kann der Server dies wissen, wenn nichts gesendet wird, wenn er nicht im Voraus weiß, dass dieser Name gesendet werden soll). Wenn Sie ein serverseitiges Skript haben, das dynamisch ein UPDATE-Skript erstellt, gibt es ein Problem, da Sie nicht wissen, welche Kontrollkästchen alle empfangen werden sollen, um den Y-Wert für die markierten und den N-Wert für die nicht markierten (nicht empfangenen) festzulegen.

Da ich die Werte 'Y' und 'N' in meiner Datenbank speichere und sie über aktivierte und nicht aktivierte Kontrollkästchen auf der Seite darstelle, habe ich für jeden Wert (Kontrollkästchen) ein ausgeblendetes Feld mit den Werten 'Y' und 'N' hinzugefügt und dann Kontrollkästchen nur für visuelle Zwecke verwendet Darstellung und verwenden Sie die einfache JavaScript-Funktion check (), um den Wert von if gemäß der Auswahl festzulegen.

<input type="hidden" id="N1" name="N1" value="Y" />
<input type="checkbox"<?php if($N1==='Y') echo ' checked="checked"'; ?> onclick="check(this);" />
<label for="N1">Checkbox #1</label>

verwenden Sie einen JavaScript-On-Click-Listener und rufen Sie die Funktion check () für jedes Kontrollkästchen auf meiner Webseite auf:

function check(me)
{
  if(me.checked)
  {
    me.previousSibling.previousSibling.value='Y';
  }
  else
  {
    me.previousSibling.previousSibling.value='N';
  }
}

Auf diese Weise werden 'Y'- oder' N'-Werte immer an das serverseitige Skript gesendet, es weiß, welche Felder aktualisiert werden sollen, und es ist keine Konvertierung des Kontrollkästchens "on" in 'Y' oder des nicht empfangenen Kontrollkästchens in 'N' erforderlich '.

HINWEIS: Leerzeichen oder neue Zeile sind auch Geschwister, daher benötige ich hier .previousSibling.previousSibling.value. Wenn dazwischen kein Leerzeichen ist, dann nur .previousSibling.value


Sie müssen nicht wie zuvor explizit einen onclick-Listener hinzufügen. Sie können die jQuery-Bibliothek verwenden, um dynamisch einen click-Listener mit der Funktion hinzuzufügen, mit der der Wert für alle Kontrollkästchen auf Ihrer Seite geändert wird:

$('input[type=checkbox]').click(function()
{
  if(this.checked)
  {
    $(this).prev().val('Y');
  }
  else
  {
    $(this).prev().val('N');
  }
});
1
sbrbot

Beispiel für Ajax-Aktionen ist (': checked') jQuery anstelle von .val ();

            var params = {
                books: $('input#users').is(':checked'),
                news : $('input#news').is(':checked'),
                magazine : $('input#magazine').is(':checked')
            };

parameter erhalten den Wert TRUE OR FALSE ..

1

Das Problem bei Ankreuzfeldern ist, dass sie nicht mit Ihrem Formular gebucht werden, wenn sie nicht angekreuzt sind. Wenn Sie ein Kontrollkästchen aktivieren und ein Formular veröffentlichen, wird der Wert des Kontrollkästchens in der Variablen "$ _POST" angezeigt, mit der Sie ein Formular verarbeiten können. Wenn dieses Kontrollkästchen deaktiviert ist, wird der Variablen "$ _POST" kein Wert hinzugefügt.

In PHP) umgehen Sie dieses Problem normalerweise, indem Sie ein isset () - Häkchen in Ihrem Kontrollkästchen-Element setzen. Wenn das erwartete Element nicht in der Variablen $ _POST gesetzt ist, wissen wir, dass das Das Kontrollkästchen ist nicht aktiviert und der Wert kann falsch sein.

if(!isset($_POST['checkbox1']))
{
     $checkboxValue = false;
} else {
     $checkboxValue = $_POST['checkbox1'];
}

Wenn Sie jedoch ein dynamisches Formular erstellt haben, kennen Sie das Namensattribut Ihrer Kontrollkästchen nicht immer. Wenn Sie den Namen des Kontrollkästchens nicht kennen, können Sie mit der isset-Funktion nicht überprüfen, ob dieses mit gesendet wurde die Variable $ _POST.

1
Daniel Galecki

Es gibt eine bessere Problemumgehung. Stellen Sie zunächst nur den markierten Kontrollkästchen das Attribut name zur Verfügung. Klicken Sie dann auf submit, und aktivieren Sie über ein JavaScript function alle nicht aktivierten Kontrollkästchen. Wenn Sie also submit nur diese abrufen, werden sie in form collection diejenigen, die name Eigenschaft haben.

  //removing name attribute from all checked checkboxes
                  var a = $('input:checkbox:checked');
                   $(a).each(function () {
                       $(this).removeAttr("name");        
                   });

   // checking all unchecked checkboxes
                   var b = $("input:checkbox:not(:checked)");
                   $(b).each(function () {
                       $(this).attr("checked", true);
                   });

Vorteil: Keine Notwendigkeit, zusätzliche versteckte Felder zu erstellen und sie zu manipulieren.

0
Gyanesh Gouraw

Alle Antworten sind großartig, aber wenn Sie mehrere Kontrollkästchen in einem Formular mit demselben Namen haben und den Status jedes Kontrollkästchens veröffentlichen möchten. Dann habe ich dieses Problem gelöst, indem ich ein verborgenes Feld mit dem Kontrollkästchen (Name, der mit dem übereinstimmt, was ich will) platziert habe.

<input type="hidden" class="checkbox_handler" name="is_admin[]" value="0" />
<input type="checkbox" name="is_admin_ck[]" value="1" />

kontrollieren Sie dann den Änderungsstatus des Kontrollkästchens anhand des folgenden Abfragecodes:

$(documen).on("change", "input[type='checkbox']", function() {
    var checkbox_val = ( this.checked ) ? 1 : 0;
    $(this).siblings('input.checkbox_handler').val(checkbox_val);
});

wenn Sie ein Kontrollkästchen ändern, wird der Wert des zugehörigen ausgeblendeten Felds geändert. Und auf dem Server können Sie nur nach versteckten Feldern anstatt nach Kontrollkästchen suchen.

Hoffe, dies wird jemandem helfen, diese Art von Problem zu haben. Prost :)

0
Imran Khan

Diese Lösung ist von der von @ desw inspiriert.

Wenn Ihre Eingabenamen im "Formularstil" sind, verlieren Sie die Array-Index-Zuordnung zu Ihren Kontrollkästchen-Werten, sobald ein Kontrollkästchen aktiviert ist, und erhöhen diese "Dissoziation" jedes Mal um eine Einheit, wenn ein Kontrollkästchen aktiviert ist. Dies kann bei einem Formular der Fall sein, in das Mitarbeiter eingefügt werden, die aus bestimmten Feldern bestehen, z.

<input type="text" name="employee[]" />
<input type="hidden" name="isSingle[] value="no" />
<input type="checkbox" name="isSingle[] value="yes" />

Wenn Sie drei Mitarbeiter gleichzeitig einfügen und der erste und der zweite einzelne Mitarbeiter sind, erhalten Sie ein isSingle -Array mit 5 Elementen, sodass Sie die drei Arrays nicht sofort durchlaufen können um beispielsweise mitarbeiter in eine datenbank einzufügen.

Sie können dies mit einer einfachen Array-Nachbearbeitung überwinden. Ich verwende PHP auf der Serverseite und habe dies getan:

$j = 0;
$areSingles = $_POST['isSingle'];
foreach($areSingles as $isSingle){
  if($isSingle=='yes'){
    unset($areSingles[$j-1]);
  }
  $j++;
}
$areSingles = array_values($areSingles);
0
Pere

Diese Lösung ist für diese Frage also übertrieben, aber es hat mir geholfen, wenn ich dasselbe Kontrollkästchen hatte, das für verschiedene Zeilen in einer Tabelle häufig vorkam. Ich musste die Zeile kennen, die das Kontrollkästchen darstellt, und den Status des Kontrollkästchens kennen (aktiviert/deaktiviert).

Was ich getan habe, war, das Namensattribut von meinen Ankreuzfeldeingaben zu entfernen, ihnen alle die gleiche Klasse zu geben und eine versteckte Eingabe zu erstellen, die das JSON-Äquivalent der Daten enthalten würde.

HTML

 <table id="permissions-table">
    <tr>
        <td>
            <input type="checkbox" class="has-permission-cb" value="Jim">
            <input type="checkbox" class="has-permission-cb" value="Bob">
            <input type="checkbox" class="has-permission-cb" value="Suzy">
        </td>
    </tr>
 </table>
 <input type="hidden" id="has-permissions-values" name="has-permissions-values" value="">

Javascript läuft auf Formular absenden

var perms = {};
$(".has-permission-checkbox").each(function(){
  var userName = this.value;
  var val = ($(this).prop("checked")) ? 1 : 0
  perms[userName] = {"hasPermission" : val};
});
$("#has-permissions-values").val(JSON.stringify(perms));

Der json-String wird mit dem Formular als $ _POST ["has-permissions-values"] übergeben. Dekodieren Sie in PHP den String in ein Array und Sie erhalten ein assoziatives Array, das jede Zeile und den True/False-Wert für jedes entsprechende Kontrollkästchen enthält. Es ist dann sehr einfach, durch die aktuellen Datenbankwerte zu gehen und sie zu vergleichen.

0
Tmac

Ich bleibe lieber bei Lösungen, die kein Javascript erfordern (und ja, ich weiß, dass es einige geben wird, die mich jetzt als luddite kategorisieren), aber wenn Sie wie ich sind und in der Lage sein möchten, eine Standard-/Anfangseinstellung für anzuzeigen Wenn Sie ein Kontrollkästchen aktivieren und es dann aufgrund des übermittelten Formulars anhalten oder aktualisieren möchten, versuchen Sie Folgendes (basierend auf den oben genannten Ideen):

Legen Sie die Variablen fest, die den anfänglichen Status des Kontrollkästchens bestimmen, und verwenden Sie dann Serverprüfungen, um die Anzeige nach jeder Übermittlung des Formulars zu bestimmen.

Im folgenden Beispiel wird ein Array von Arrays erstellt (zur Verwendung in WordPress; funktioniert auch an anderer Stelle). Anschließend wird der Status des Kontrollkästchens mithilfe von Serverskripten ermittelt, ohne dass ausgeblendete Felder oder Javascript verwendet werden.

<?php

$options_array = array (
    array('list_companies_shortcode' , 'shortcode_list_companies' , 'List Companies Shortcode'),
    array('list_contacts_shortcode' , 'shortcode_list_contacts' , 'List Contacts Shortcode'),
    array('test_checkbox_1' , 'checked' , 'Label for Checkbox 1' , 'checkbox' , 'Some text to instruct the user on this checkbox use' ),
    array('test_checkbox_2' , '' , 'Label for Checkbox 2' , 'checkbox' , 'Some other text to instruct the user on this checkbox use' )
 ) ;


$name_value_array = array() ;
$name_label_array = array() ;
$field_type_array = array() ;
$field_descriptor_array = array() ;
foreach ( $options_array as $option_entry ) {
    $name_value_array[ $option_entry[0] ] = $option_entry[1] ;
    $name_label_array[ $option_entry[0] ] = $option_entry[2] ;
    if ( isset( $option_entry[3] ) ) {
        $field_type_array[ $option_entry[0] ] = $option_entry[3] ;
        $field_descriptor_array[ $option_entry[0] ] = $option_entry[4] ;
    } else {
        $field_type_array[ option_entry[0] ] = 'text' ;
        $field_descriptor_array[ $option_entry[0] ] = NULL ;
    } 
}

echo "<form action='' method='POST'>" ;
    foreach ( $name_value_array as $setting_name => $setting_value ) {
        if ( isset( $_POST[ 'submit' ] ) ) {
            if ( isset( $_POST[ $setting_name ] ) ) {
                $setting_value = $_POST[ $setting_name ] ;
            } else {
                $setting_value = '' ;
            }
        }   
        $setting_label = $option_name_label_array[ $setting_name ] ;
        $setting_field_type = $field_type_array[ $setting_name ] ;
        $setting_field_descriptor = $field_descriptor_array [ $setting_name ] ;
        echo "<label for=$setting_name >$setting_label</label>" ;
        switch ( $setting_field_type ) {
            case 'checkbox':
                echo "<input type='checkbox' id=" . $setting_name . " name=" . $setting_name . " value='checked' " . $setting_value . " >(" . $setting_field_descriptor . ")</input><br />" ;
                break ;
            default:
                echo "<input type='text' id=" . $setting_name . " name=" . $setting_name . " value=" . $setting_value . " ></input><br />" ;
        }
    }
    echo "<input type='submit' value='Submit' name='submit' >" ;
echo "</form>" ;
0
Ramblin

Dies kann nur mit etwas Javascript erreicht werden, da nicht aktivierte Kontrollkästchen nicht übertragen werden. Sie benötigen also Javascript, das z. Hinter den Kulissen werden beim Deaktivieren eines Kontrollkästchens ausgeblendete Felder hinzugefügt. Ohne Javascript wäre dies nicht möglich.

0
RSeidelsohn

jQuery-Version von @ vishnus Antwort.

if($('#testName').is(":checked")){
    $('#testNameHidden').prop('disabled', true);
}

Wenn Sie jQuery 1.5 oder niedriger verwenden, verwenden Sie bitte die Funktion .attr () anstelle von .prop ()

0
0x1ad2
<input type="checkbox" id="checkbox" name="field_name" value="1">

Sie können den Trick auf der Serverseite ausführen, ohne versteckte Felder zu verwenden.
Mit dem ternären Operator:

isset($_POST['field_name']) ? $entity->attribute = $_POST['field_name'] : $entity->attribute = 0;

Verwenden des normalen IF-Operators:

if (isset($_POST['field_name'])) {
    $entity->attribute = $_POST['field_name'];
} else {
    $entity->attribute = 0;
}
0
micaelsf
function SubmitCheckBox(obj) {
     obj.value   = obj.checked ? "on" : "off";
     obj.checked = true;
     return obj.form.submit();
}

<input type=checkbox name="foo" onChange="return SubmitCheckBox(this);">
0
ledav.net

Sie können ausgeblendete Elemente hinzufügen, bevor Sie das Formular absenden.

$('form').submit(function() {
  $(this).find('input[type=checkbox]').each(function (i, el) {
    if(!el.checked) {
      var hidden_el = $(el).clone();
      hidden_el[0].checked = true;
      hidden_el[0].value = '0';
      hidden_el[0].type = 'hidden'
      hidden_el.insertAfter($(el));
    }
  })
});
0
SergA

@cpburnz hat es richtig gemacht, aber zu viel Code, hier ist die gleiche Idee mit weniger Code:

JS:

// jQuery OnLoad
$(function(){
    // Listen to input type checkbox on change event
    $("input[type=checkbox]").change(function(){
        $(this).parent().find('input[type=hidden]').val((this.checked)?1:0);
    });
});

HTML (notieren Sie den Feldnamen unter Verwendung eines Feldnamens):

<div>
    <input type="checkbox" checked="checked">
    <input type="hidden" name="field_name[34]" value="1"/>
</div>
<div>
    <input type="checkbox">
    <input type="hidden" name="field_name[35]" value="0"/>
</div>
<div>

Und für PHP:

<div>
    <input type="checkbox"<?=($boolean)?' checked="checked"':''?>>
    <input type="hidden" name="field_name[<?=$item_id?>]" value="<?=($boolean)?1:0?>"/>
</div>
0
Rodrigo Polo

Könnte albern aussehen, aber es funktioniert bei mir. Der Hauptnachteil ist, dass es sich optisch um ein Optionsfeld handelt, nicht um ein Kontrollkästchen, aber es funktioniert ohne Javascript.

HTML

Initialy checked
<span><!-- set the check attribute for the one that represents the initial value-->
<input type="radio" name="a" value="1" checked>
<input type="radio" name="a" value="0">
</span>

<br/>
Initialy unchecked
<span><!-- set the check attribute for the one that represents the initial value-->
<input type="radio" name="b" value="1">
<input type="radio" name="b" value="0" checked>
</span>

und CSS

span input
{position: absolute; opacity: 0.99}

span input:checked
{z-index: -10;}

span input[value="0"]
{opacity: 0;}

Geige hier

Ich würde gerne Probleme mit diesem Code hören, da ich ihn in der Produktion verwende

0
frag

Wenn Sie eine Reihe von Kontrollkästchenwerten (einschließlich nicht markierter Elemente) senden möchten, können Sie Folgendes versuchen:

<form>
<input type="hidden" value="0" name="your_checkbox_array[]"><input type="checkbox">Dog
<input type="hidden" value="0" name="your_checkbox_array[]"><input type="checkbox">Cat
</form>

$('form').submit(function(){
    $('input[type="checkbox"]:checked').prev().val(1);
});
0
Michael

Wenn das Kontrollkästchen beim Senden deaktiviert ist, aktualisieren Sie den Wert des Kontrollkästchens auf "NEIN" und setzen Sie "checked =" TRUE ".

https://jsfiddle.net/pommyk/8d9jLrvo/26/

$(document).ready(function() 
{
  function save() 
  {
    if (document.getElementById('AgeVerification').checked == false) 
    {
      document.getElementById('AgeVerification').value = 'no';
      document.getElementById('AgeVerification').checked = true;     
    }
  }
  document.getElementById("submit").onclick = save;
})
0
pkamathk