Frage

Ich habe eine Last von Kontrollkästchen, die standardmäßig aktiviert sind.Meine Benutzer werden wahrscheinlich deaktivieren, wenige (wenn überhaupt) von den Checkboxen und überlassen Sie den rest kontrolliert.

Gibt es eine Möglichkeit, um die POST Formular die Kontrollkästchen, die nicht überprüft, eher als diejenigen, die sind überprüft?

War es hilfreich?

Lösung

Fügen Sie einen versteckten Eingang für das Kontrollkästchen mit einer anderen ID:

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

Vor dem Absenden des Formulars, deaktivieren Sie den versteckten Eingang auf der Grundlage der überprüft Bedingung:

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

Andere Tipps

Die Lösung mochte ichduersiees das so weit ist ein versteckten Eingang mit dem gleichen Namen wie das Kontrollkästchen zu setzen, die nicht überprüft werden könnte. Ich denke, es funktioniert so, dass, wenn das Kontrollkästchen nicht aktiviert ist, der verborgene Eingang noch erfolgreich ist und an den Server gesendet, aber wenn das Kontrollkästchen aktiviert ist, wird er den verborgenen Eingang, bevor sie außer Kraft setzen. Auf diese Weise müssen Sie davon in dem gebuchten Datenwert nicht zu verfolgen erwartet wurden von Kontrollkästchen kommen.

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

Ich löste es, indem mit Vanille-JavaScript:

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

Achten Sie darauf, kein Leerzeichen oder Zeilenumbrüche zwischen diese zwei input-Elemente!

Sie können verwenden this.previousSibling.previousSibling um die "upper" - Elementen.

Mit PHP können Sie den Namen verstecktes Feld für 0 (nicht gesetzt) oder 1 (set).

Mein persönlicher Favorit ist ein verstecktes Feld mit dem gleichen Namen hinzuzufügen, die verwendet werden, wenn das Kontrollkästchen nicht aktiviert ist. Aber die Lösung ist nicht so einfach, wie es kann sein scheint.

Wenn Sie diesen Code hinzu:

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

Der Browser über nicht wirklich kümmern, was Sie hier tun. Der Browser wird beide Parameter an den Server senden, und der Server muss entscheiden, was mit ihnen zu tun.

PHP zum Beispiel ist der letzte Wert als derjenige (siehe zu verwenden: Maßgebliche Position von doppelten HTTP-GET-Abfrage Tasten )

Aber auch andere Systeme, die ich arbeitete mit (basierend auf Java) tun es die Art und Weise um - sie bieten Ihnen nur den ersten Wert. .NET stattdessen werden Sie mit beiden Elementen eine Anordnung geben, anstatt

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

Eine übliche Technik, um dies ist eine verborgene Variable tragen zusammen mit jeder Checkbox.

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

Auf der Serverseite, wir erste Liste von verborgenen Variablen erfassen und für jeden des verborgenen Variable, versuchen wir zu sehen, ob der entsprechende Checkbox Eintrag in den Formulardaten gesendet wird oder nicht.

Die Server-Seite 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

Das oben nicht genau die Frage beantworten, sondern stellt ein alternatives Mittel mit ähnlicher Funktionalität zu erreichen.

Sie brauchen nicht ein verstecktes Feld zu schaffen für alle Kontrollkästchen meinen Code einfach kopieren. es wird den Wert der Option ändern, wenn nicht die value geprüft 0 zuweisen und wenn Checkbox dann value in 1 zuweisen geprüft

$("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');
        }
    })
})

Sie können einige Javascript tun in dem einreichen Ereignisse des Formulars. Das ist alles, Sie aber tun können, gibt es keine Möglichkeit, Browser zu bekommen dies selbst zu tun. Es bedeutet auch, Ihre Form für Benutzer ohne Javascript brechen. Besser ist auf dem Server zu wissen, welche Checkboxen gibt, so kann man ableiten, dass die Abwesenden von den gebuchten Formularwerte ($_POST in PHP) deaktiviert sind.

$('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 der Checkbox auslassen es passiert nicht bekommen. Nur die test_checkbox Array.

ich tun würde tatsächlich die folgende.

Habe meine verborgenen Eingabefeld mit dem gleichen Namen mit der Checkbox Eingang

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

und dann, wenn ich poste ich zunächst einmal entfernen Sie die doppelten Werte im Array $ _POST aufhob, atfer diese Anzeige jeder der eindeutigen Werte.

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

habe ich dies aus einem Beitrag von Array doppelten Werten entfernen

„Ich habe mit dem Server-Ansatz gegangen scheint gut zu funktionieren -. Dank -. Reach4thelasers 1. Dezember '09 um 15:19 Uhr“ Ich möchte es vom Eigentümer empfehlen. Wie zitiert: Javascript-Lösung auf, wie die Server-Handler abhängig (ich habe es nicht überprüfen)

wie

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

Die meisten Antworten erfordern hier die Verwendung von JavaScript oder Eingabesteuerungen duplizieren. Manchmal muss diese vollständig auf der Server-Seite behandelt werden.

Ich glaube, die (beabsichtigte) Schlüssel, um dieses gemeinsame Problem zu lösen, die Einreichung Eingabekontrolle der form.

zu interpretieren und nicht markiert Werte für Kontrollkästchen Griff erfolgreich benötigen Sie Kenntnisse in folgenden Bereichen haben:

  1. Die Namen des Kontrollkästchen
  2. Der Name der Vorlage Eingabeelement des Formulars

Durch die Überprüfung, ob das Formular abgeschickt wurde (ein Wert, der Vorlage Eingabeelement zugeordnet ist), werden alle nicht aktiviert Kontrollkästchen Werte können angenommen .

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>

Wenn Sie PHP verwenden, 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);
}

?>

Erste Daten könnten auf jeder Seite zu laden geladen werden, sondern sollten nur geändert werden, wenn das Formular abgeschickt wurde. Da die Namen des Kontrollkästchen im Voraus bekannt sind, können sie einzeln durchlaufen und geprüft werden, so dass das Fehlen ihrer individuellen Werte zeigt an, dass sie nicht überprüft werden.

Ich habe Sams Version zuerst versucht. Gute Idee, aber es verursacht es mehr Elemente in der Form mit dem gleichen Namen. Wenn Sie irgendeinen Javascript verwenden, die Elemente auf Basis von Namen findet, wird es nun eine Reihe von Elementen zurück.

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

/* Delete '.hidden' fields if the original is present, use '.hidden' value if not. */
foreach ($_POST['frmmain'] as $field_name => $value)
{
    // Only look at elements ending with '.hidden'
    if ( !substr($field_name, -strlen('.hidden')) ) {
        break;
    }

    // get the name without '.hidden'
    $real_name = substr($key, strlen($field_name) - strlen('.hidden'));

    // Create a 'fake' original field with the value in '.hidden' if an original does not exist
    if ( !array_key_exists( $real_name, $POST_copy ) ) {
        $_POST[$real_name] = $value;
    }

    // Delete the '.hidden' element
    unset($_POST[$field_name]);
}

Ich benutze diesen Block von jQuery, die einen versteckten Eingang unterbreiten-Zeit zu jeder ungehemmt Checkbox hinzufügen. Es garantiert Sie immer einen Wert für jede Option vorgelegt bekommen, jedes Mal, ohne Ihren Markup unübersichtlich und zu riskieren, zu vergessen, es auf einer Checkbox später fügen Sie zu tun. Es ist auch Agnostiker, was auch immer Backend-Stack (PHP, Ruby, etc.) Sie verwenden.

// 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

Sie können auch das form.submit Ereignis abfangen und Reverse-Check vor einreichen

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

Ich mag auch die Lösung, die Sie gerade ein zusätzliches Eingabefeld schreiben, scheint mit JavaScript ein wenig zu mir Hacky.

Je nachdem, was Sie verwenden, für die Sie sich verlassen Backend auf dem Eingang geht zuerst.

Für einen Server-Backend, wo 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 einen Server-Backend, wo das letzte Vorkommen verwendet wird (PHP, Rails) sollten Sie die folgenden Aktionen aus.

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


Für eine Server-Backend in dem alle Ereignisse in einer Liste Datentyp gespeichert sind ([], array). (Python / Zope)

Sie können in dem Post jemals bestellen Sie möchten, müssen Sie nur versuchen, den Wert der Eingabe mit dem checkbox type-Attribute zu erhalten. So ist der erste Index der Liste, wenn das Kontrollkästchen ist vor dem verborgenen Elemente und den letzten Index, wenn das Kontrollkästchen nach dem verborgenen Elemente ist.


Bei einem Server-Backend in dem alle Vorkommen mit einem Komma (ASP.NET / IIS) verkettet Sie müssen (Split / Explodieren) der Zeichenfolge durch ein Komma als Trennzeichen verwenden eine Liste Datentyp zu erstellen. ([])

Jetzt können Sie versuchen, den ersten Index der Liste zu greifen, wenn das Kontrollkästchen vor dem verborgenen Elemente ist und den letzten Index greifen, wenn das Kontrollkästchen nach dem verborgenen Elemente ist.

 Backend Parameter Handling

Bildquelle

Ich sehe diese Frage ist alt und hat so viele Antworten, aber ich werde meinen Penny sowieso geben. Meine Stimme ist für die JavaScript-Lösung auf das ‚Senden‘ Ereignis des Formulars, wie einige darauf hingewiesen haben. Nein, um die Eingänge zu verdoppeln (vor allem, wenn Sie lange Namen und Attribute mit PHP-Code mit HTML gemischt), keine Server-Seite stören (das würde erfordern, dass alle Feldnamen kennen und zu überprüfen, einen nach der anderen), holt nur alle ungeprüften Artikel , weisen sie einen Wert 0 (oder was auch immer Sie brauchen einen ‚nicht geprüft‘ Status anzuzeigen) und dann ihr Attribut ändern ‚checked‘ true

    $('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 können ein $ _POST Array wie folgt erhalten wird:

Array
(
            [field1] => 1
            [field2] => 0
)
$('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);
        }
    })
});

Ich weiß, diese Frage ist 3 Jahre alt, aber ich fand eine Lösung, die ich funktioniert ziemlich gut denken.

Sie können einen Scheck tun, wenn das $ _POST Variablen zugewiesen und in einer Variablen speichern.

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

die isset (Funktion überprüft), wenn die $ _POST Variable zugeordnet ist. Durch die Logik, wenn es nicht zugewiesen wird, dann wird das Kontrollkästchen nicht aktiviert ist.

Was ich tat, war ein bisschen anders. Zunächst änderte ich die Werte aller nicht aktiviert Kontrollkästchen. Auf „0“, so ausgewählt, sie alle, so würde der Wert vorgelegt werden.

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

Ich würde es vorziehen, den $ _POST collate

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

es Sinn, wenn der POST nicht die hat ‚checkboxname'value, es unckecked wurde so, asign Wert.

Sie können eine Reihe von Ihrer ckeckbox Werte schaffen und eine Funktion erstellen, die überprüfen, ob Werte vorhanden sind, wenn doesn `t, es Köpfe, die nicht markiert sind, und Sie können einen Wert asign

Beispiel auf Ajax Aktionen ist ( ': checked') verwendet jQuery statt .val ();

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

params wird Wert auf wahr oder falsch erhalten ..

Ankreuzfelder in der Regel binäre Daten darstellen, die in der Datenbank als Ja / Nein, Y / N oder 1/0 Werte gespeichert sind. HTML Checkboxen haben schlechte Natur Wert-Server senden nur, wenn Kontrollkästchen aktiviert ist! Das bedeutet, dass Server-Skript auf einem anderen Website im Voraus wissen müssen, was alle möglichen Kontrollkästchen auf der Webseite, um die Lage sein, positiv zu speichern (markiert) oder negativ (ungeprüft) Werte. Eigentlich nur negative Werte Problem (wenn Benutzer unchecks vorher (vor) geprüft Wert - wie Server dies wissen kann, wenn nichts gesendet wird, wenn es nicht im Voraus weiß, dass dieser Name gesendet werden soll). Wenn Sie eine serverseitige Skript, das dynamisch UPDATE Skript erstellt es ein Problem gibt, weil Sie nicht wissen, was alle Kontrollkästchen, um empfangen werden sollen Y-Wert für aufgegebenen und N-Wert für nicht markiert (nicht empfangen) diejenigen zu setzen.

Da ich speichern Werte ‚Y‘ und ‚N‘ in meiner Datenbank und stellen sie über checked und unchecked Kontrollkästchen auf Seite, habe ich verstecktes Feld für jeden Wert (Kontrollkästchen) mit ‚Y‘ und ‚N‘ Werte dann Ankreuzfelder nur für die visuelle Darstellung und verwenden einfache Funktionskontrolle JavaScript () Wert einzustellen, wenn die nach Auswahl.

<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 eine JavaScript Onclick Hörer und Anruffunktion check () für jede checkboxe auf meiner Web-Seite:

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

Auf diese Weise ‚Y‘ oder ‚N‘ Werte werden immer auf Server-Seite Skript geschickt, weiß er, was sind Felder, die aktualisiert werden sollen, und es gibt keine Notwendigkeit für die Umwandlung von checbox „auf“ Wert in ‚Y‘ oder nicht empfangen Checkbox in 'N'.

Hinweis: Leerraum oder eine neue Linie ist auch ein Geschwister so hier ich brauche .previousSibling.previousSibling.value. Wenn es keinen Raum zwischen dann nur .previousSibling.value


Sie müssen nicht explizit wie vor Onclick Zuhörer an, Sie jQuery-Bibliothek dynamisch verwenden können, um Klick-Listener mit Funktion zu ändern Wert für alle Kontrollkästchen in Ihrer Seite hinzufügen:

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

Das Problem mit Kontrollkästchen ist, dass, wenn sie nicht überprüft werden, dann werden sie nicht mit dem Formular geschrieben. Wenn Sie ein Kontrollkästchen aktivieren und ein Formular veröffentlichen werden Sie den Wert der Checkbox in dem $ _POST Variable erhalten, die Sie verwenden können, um ein Formular zu verarbeiten, wenn es kein Wert nicht aktiviert ist wird den $ _POST Variable hinzugefügt werden.

In PHP würde man normalerweise, um dieses Problem zu umgehen, indem sie ein isset tun () überprüfen auf Ihrem Checkbox Elemente. Wenn das Element, das Sie erwarten in dem $ _POST Variable nicht gesetzt, dann wissen wir, dass das Kontrollkästchen nicht aktiviert ist und der Wert kann falsch sein.

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

Aber wenn Sie ein dynamisches Formular erstellt, dann werden Sie nicht immer das Attribut Ihres Kontrollkästchen Namen kennen, wenn Sie den Namen der Checkbox nicht wissen, dann können Sie nicht die isset Funktion zu überprüfen, ob dies hat wurde mit dem $ _POST Variable gesendet.

Dies kann nur mit einigen Javascript erreicht werden, wie ungehemmt Kontrollkästchen nicht übertragen lassen. So benötigen Sie Javascript, dass zum Beispiel hinter den Kulissen fügt versteckte Felder auf ein Kontrollkästchen deaktivieren. Ohne Javascript dies nicht getan werden könnte.

Es gibt eine bessere Abhilfe. Zunächst einmal bieten name-Attribut auf nur die Kontrollkästchen, die überprüft werden. Klicken Sie dann auf submit durch einen JavaScript function überprüfen Sie alle ungehemmt Boxen. Also, wenn Sie submit nur diejenigen sein, bei form collection diejenigen abgerufen werden, die Eigentum name 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 zu schaffen zusätzliche versteckte Boxen und manipulieren sie.

@cpburnz es richtig, 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 (beachten Sie die Feldnamen einen Array Namen):

<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>

jQuery-Version @ Vishnus Antwort.

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

Wenn Sie jQuery 1.5 oder unten verwenden Sie bitte das .attr () -Funktion statt .prop ()

verwenden

Diese Lösung wird inspiriert von @ desw der ein.

Wenn Sie Ihre Eingabe Namen in „Form Art“ sind, werden Sie Array-Index Verbindung mit Ihren chekbox Werten verlieren, sobald man chekbox geprüft wird, erhöht wird diese „Dissoziation“ um eine Einheit jedes Mal, wenn ein chekbox geprüft. Dies kann den Fall einer Form sein, von einigen Bereichen, zum Beispiel zusammengesetzt so etwas wie Mitarbeiter einfügen:

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

Für den Fall, fügen Sie drei Mitarbeiter auf einmal und die ersten und die zweite Single sind, werden Sie mit einem 5-Elemente isSingle Array am Ende, so dass Sie nicht auf einmal durch die drei Arrays, um iterieren der Lage sein, zum Beispiel, um die Mitarbeiter in einer Datenbank einzufügen.

Sie können mit einigen einfachen Array Nachbearbeitung überwinden diese. Ich bin mit PHP auf der Server-Seite und ich habe dies:

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

So ist diese Lösung übertrieben für diese Frage, aber es half mir, wenn ich das gleiche Checkbox hatte, die viele Male für verschiedene Zeilen in einer Tabelle aufgetreten. Ich brauchte die Zeile die Checkbox dargestellt kennen und wissen auch, den Zustand der Checkbox (aktiviert / deaktiviert).

Was ich tat, war von meiner Checkbox Eingänge den Namen Attribut zu nehmen, geben sie alle die gleiche Klasse, und erstellen Sie einen versteckten Eingang, der das JSON-Äquivalent der Daten halten 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 laufen auf Formular

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 der Form wie $ _POST übergeben bekommen [ "hat-permissions-Wert"]. In PHP, dekodieren die Zeichenfolge in ein Array und es wird eine assoziative Array aufweist, die jede Zeile und den Wahr / Falsch-Wert für jede entsprechende Ankreuzfeld hat. Es ist dann sehr einfach, durch zu gehen und die aktuellen Datenbankwerten zu vergleichen.

Alle Antworten sind groß, aber wenn man in einer Form mit dem gleichen Namen mehrere Kontrollkästchen haben, und Sie wollen den Status jedes Kontrollkästchen posten. Dann habe ich dieses Problem gelöst, indem ein verstecktes Feld mit dem Kontrollkästchen platzieren (Name im Zusammenhang mit, was ich will).

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

steuern dann den Änderungsstatus des Kontrollkästchen von unten jquery Code:

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

jetzt auf Änderung eines Checkbox, wird es den Wert im Zusammenhang versteckten Feldes ändern. Und auf dem Server können Sie sich nur auf versteckte Felder anstelle von Kontrollkästchen.

Hope dies dazu beitragen wird jemand diese Art von Problem. cheer:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top