POST le caselle di controllo HTML non selezionate


303

Ho un sacco di caselle di controllo che sono selezionate per impostazione predefinita. I miei utenti probabilmente deselezioneranno alcune (se presenti) caselle di controllo e lasceranno il resto selezionato.

Esiste un modo per rendere il modulo POST le caselle di controllo che non sono selezionate, piuttosto che quelle che sono selezionate?

Risposte:


217

Aggiungi un input nascosto per la casella di controllo con un ID diverso:

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

Prima di inviare il modulo, disabilitare l'input nascosto in base alla condizione selezionata:

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

58
Se stai usando una soluzione basata sul markup come questa, probabilmente è meglio inserire prima l'input nascosto, per molte altre risposte. Se si utilizza PHP, è possibile eliminare la dipendenza JavaScript, poiché viene utilizzato solo l'ultimo valore.
Ben

12
gamov, ti sbagli, le etichette sono attaccate agli input in base all'attributo id, non all'attributo name input
Justin Emery

14
Gli autori difficili da credere lo hanno progettato in questo modo. Perché non inviare tutti i campi di input con un valore predefinito per quelli non selezionati :( Sarebbe una soluzione molto più chiara quindi dover implementare alcuni campi nascosti "hack". Deve essere stato chiaro che sarebbe stato necessario e dovevano vederlo in anticipo
Srneczek,

34
Sembra così confuso.
EralpB,

65
Sono l'unico a pensare che il design sottostante checkboxdell'elemento sia terribile? Sono un controllo binario, dovrebbero inviare valori binari.
alexw,

474

La soluzione che mi è piaciuta di più finora è mettere un input nascosto con lo stesso nome della casella di controllo che potrebbe non essere selezionata. Penso che funzioni in modo tale che se la casella di controllo non è selezionata, l'input nascosto ha ancora successo e inviato al server ma se la casella di controllo è selezionata sovrascriverà l'input nascosto prima di esso. In questo modo non è necessario tenere traccia di quali valori nei dati pubblicati dovrebbero provenire dalle caselle di controllo.

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

3
Ora che ho riletto la domanda, sembra che non fosse proprio quello che volevi. Comunque sono arrivato a questa domanda quando stavo cercando di capire questa risposta, quindi forse potrebbe essere utile a qualcun altro.
Sam,

2
.NET è diverso, invece vedi stackoverflow.com/questions/7600817/…
KCD

121
Va notato che se si seleziona la casella, il browser invierà sia i valori nascosti che quelli selezionati. Questa soluzione si basa quindi sulla gestione da parte del server della variabile post con questi 2 valori. Se accetta solo l'ultimo valore (ad esempio PHP), il codice funzionerà come previsto. Tuttavia, alcuni server lo gestiscono in modo diverso, alcuni scelgono il primo valore, mentre altri inseriscono entrambi i valori in un elenco / array.
Michael Ekoka,

1
Questa risposta si basa sul presupposto che è possibile inoltrare solo uno dei due input con nome uguale verrà inviato al server - non capisco perché questo ha ricevuto così tanti voti positivi?
Muleskinner,

7
@sam non sai da dove hai avuto l'idea? Quando due o più controlli sono nominati uguali, entrambi verranno inviati al server al momento dell'invio (per le caselle di controllo, tuttavia, solo se spuntati) - il modo in cui vengono gestiti sul server dipende dall'implementazione lato server. Se non mi credi, puoi vedere di persona monitorando il traffico usando uno strumento come il violinista.
Muleskinner,

75

L'ho risolto utilizzando JavaScript vaniglia:

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

Fai attenzione a non avere spazi o interruzioni di riga tra questi due elementi di input!

È possibile utilizzare this.previousSibling.previousSiblingper ottenere elementi "superiori".

Con PHP puoi controllare il campo nascosto indicato per 0 (non impostato) o 1 (impostato).


Perché non puoi avere spazi o interruzioni di linea tra i due elementi?
Michael Potter,

@MichaelPotter: this.previousSibling otterrà spazi bianchi come fratelli, quindi non funziona.
Marcel Ennix,

4
Oh questo è PERFETTO! Risolve il problema di pubblicare più set di campi in cui sono presenti campi con nome duplicato. Nessuna delle altre soluzioni lo fa. Usando il metodo di Marcel, i tuoi campi pubblicati avranno array di uguale lunghezza. Quindi questo scenario: <fieldset name='fs1'> <input type="text" name="somefield[]"> <input type="checkbox" name="live[]"> </fieldset> <fieldset name='fs2'> <input type="text" name="somefield[]"> <input type="checkbox" name="live[]"> </fieldset>* Supponi che ci fossero nuove linee lì. Sembra che non funzionino in blocchi di codice mini-markup
Brian Layman,

1
Questa dovrebbe essere la risposta accettata. Funziona con array (ex / name = "soup []")
jdavid05

2
Puoi usare previousElementSiblinginvece di previousSibling. È supportato quasi ovunque e ignora i nodi di testo.
MarSoft,

23

Il mio preferito personale è quello di aggiungere un campo nascosto con lo stesso nome che verrà utilizzato se la casella di controllo è deselezionata. Ma la soluzione non è così semplice come sembra.

Se aggiungi questo codice:

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

Il browser non si preoccuperà davvero di quello che fai qui. Il browser invierà entrambi i parametri al server e il server deve decidere cosa farne.

PHP ad esempio prende l'ultimo valore come quello da usare (vedi: Posizione autorevole di chiavi di query GET HTTP duplicate )

Ma altri sistemi con cui ho lavorato (basato su Java) lo fanno al contrario: ti offrono solo il primo valore. .NET invece ti darà invece un array con entrambi gli elementi

Proverò a provarlo con node.js, Python e Perl a volte.


2
ruby e node.js assumeranno entrambi l'ultimo valore di qualsiasi campo modulo duplicato. I metodi di supporto di Ruby on Rails costruiscono caselle di controllo in questo modo per questo motivo.
nzifnab,

7
Per concludere, si basa su un attacco chiamato HTTP Parameter Pollution ed è stato analizzato da OWASP: owasp.org/images/b/ba/AppsecEU09_CarettoniDiPaola_v0.8.pdf (pagina 9) dove puoi trovare un elenco di 20 sistemi e vedere come lo gestiscono.
SimonSimCity,

1
Java Servlets ti dà tutto, finché chiamirequest.getParameterValues
mauhiz,

20

Una tecnica comune attorno a questo è quella di portare una variabile nascosta insieme a ciascuna casella di controllo.

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

Sul lato server, rileviamo innanzitutto l'elenco delle variabili nascoste e per ciascuna delle variabili nascoste, proviamo a vedere se la corrispondente voce della casella di controllo viene inviata nei dati del modulo o meno.

L'algoritmo lato server dovrebbe probabilmente apparire come:

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

Quanto sopra non risponde esattamente alla domanda, ma fornisce un mezzo alternativo per ottenere funzionalità simili.


20

non è necessario creare un campo nascosto per tutte le caselle di controllo, basta copiare il mio codice. cambierà il valore della casella di controllo se non è selezionata la valueverrà assegnata 0e se la casella di controllo è selezionata, quindi assegnare valuein1

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

1
Questa soluzione funziona bene ed è più elegante dell'inquinamento di Dom con campi nascosti.
Prasad Paranjape,

9
Questo fa sì che la casella venga temporaneamente selezionata mentre il modulo viene inviato. Questo è fonte di confusione (nella migliore delle ipotesi) per l'utente.
Mark Fraser,

12
$('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>

Se si lascia fuori il nome della casella di controllo non viene superato. Solo l'array test_checkbox.


1
Ottima soluzione, ma nel mio caso live () non funziona, quindi ho usato il metodo (): $ ('input [type = checkbox]'). On ("change", function () {...}) ;
Massa,

4
LIVE è obsoleto. Non utilizzarlo più sulle risposte nello stackoverflow. Amem.
Ismael,

Questa risposta è davvero la migliore .. Funziona come previsto. Anche per la casella di controllo di gruppo.
Alemoh Rapheal Baja,

11

È possibile eseguire alcuni Javascript nell'evento di invio del modulo. Questo è tutto ciò che puoi fare, non c'è modo di convincere i browser a farlo da soli. Significa anche che il modulo verrà interrotto per gli utenti senza Javascript. Meglio sapere sul server quali caselle di controllo ci sono, quindi puoi dedurre che quelli assenti dai valori dei moduli pubblicati ( $_POSTin PHP) sono deselezionati.


2
a partire da PHP 4.1 è inoltre possibile utilizzare $ _REQUEST php.net/manual/en/reserved.variables.request.php
Karl Adler

$_REQUESTè una buona pratica poiché consente il riutilizzo del codice se lo script supporta entrambi i metodi.
nullability

9

In realtà farei quanto segue.

Ho il mio campo di input nascosto con lo stesso nome con l'input della casella di controllo

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

e poi quando inserisco rimuovo prima di tutto i valori duplicati raccolti nell'array $ _POST, quindi visualizzo ciascuno dei valori univoci.

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

Ho ottenuto questo da un post rimuovere i valori duplicati dalla matrice


Qual è lo scopo di [] sul valore del campo nome?
Michael Potter,

@MichaelPotter È così quando il post viene inviato a PHP, leggerà il nome `checkbox_name []
Twister1002

@ Twister1002, penso che tu abbia descritto lo scopo dell'attributo name, non lo scopo di aggiungere [] al nome. Ho fatto una ricerca sul web e sembra che alcune persone lo facciano con i nomi: groupname [elementname] per raggruppare i campi, ma non ho trovato una spiegazione per empty [].
Michael Potter,

1
@MichaelPotter Mi dispiace, pensavo di aver finito quell'affermazione. Ma apparentemente no. Vorrei rifarlo. Quando viene inviato a PHP, il processore PHP lo leggerà come un array. Pertanto, con ciascun nome, checkbox_name[]ciascun valore verrà inserito in un array, che sarà quindi possibile estrarre. Es: $_POST['checkbox_name'][0]e così via con l'incremento di quanti campi avevano lo stesso nome. Un altro esempio è che se avessi chiamato tre campi field_name[]puoi ottenere il secondo valore di field_namelike $_POST['field_name'][1]. Il suo scopo può essere sorprendente se hai diversi campi con lo stesso nome.
Twister1002,

8

"Sono andato con l'approccio del server. Sembra funzionare bene - grazie. - reach4thelasers il 1 ° dicembre 2009 alle 15:19" Vorrei raccomandarlo dal proprietario. Come citato: la soluzione javascript dipende da come il gestore del server (non l'ho verificato)

ad esempio

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

8

So che questa domanda ha 3 anni ma ho trovato una soluzione che penso funzioni abbastanza bene.

Puoi verificare se la variabile $ _POST è assegnata e salvarla in una variabile.

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

la funzione isset () controlla se la variabile $ _POST è assegnata. Per logica se non è assegnato, la casella non è selezionata.


Questo è molto meglio, poiché la risposta più popolare è una soluzione terribile per gli screen reader.
Kevin Waterson,

7

La maggior parte delle risposte qui richiede l'uso di JavaScript o controlli di input duplicati. A volte questo deve essere gestito interamente sul lato server.

Credo che la chiave (intesa) per risolvere questo problema comune sia il controllo di input di presentazione del modulo.

Per interpretare e gestire correttamente i valori non selezionati per le caselle di controllo, è necessario conoscere quanto segue:

  1. I nomi delle caselle di controllo
  2. Il nome dell'elemento di input di invio del modulo

Controllando se il modulo è stato inviato (un valore è assegnato all'elemento di input di invio), è possibile assumere qualsiasi valore di casella non selezionata .

Per esempio:

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

Quando si utilizza PHP, è abbastanza banale rilevare quali caselle di controllo sono state spuntate.

<?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);
}

?>

I dati iniziali potrebbero essere caricati su ogni caricamento della pagina, ma dovrebbero essere modificati solo se il modulo è stato inviato. Poiché i nomi delle caselle di controllo sono noti in anticipo, possono essere attraversati e ispezionati singolarmente, in modo che l'assenza dei loro valori individuali indichi che non sono stati controllati.


6

Ho provato prima la versione di Sam. Buona idea, ma causa la presenza di più elementi nel modulo con lo stesso nome. Se si utilizza javascript che trova elementi in base al nome, ora restituirà una matrice di elementi.

Ho elaborato l'idea di Shailesh in PHP, funziona per me. Ecco il mio codice:

/ * Elimina i campi '.hidden' se è presente l'originale, in caso contrario usa il valore '.hidden'. * /
foreach ($ _POST ['frmmain'] as $ field_name => $ value)
{
    // Guarda solo gli elementi che terminano con '.hidden'
    if (! substr ($ field_name, -strlen ('. hidden'))) {
        rompere;
    }

    // ottieni il nome senza ".hidden"
    $ real_name = substr ($ key, strlen ($ field_name) - strlen ('. hidden'));

    // Crea un campo originale "falso" con il valore in ".hidden" se non esiste un originale
    if (! array_key_exists ($ real_name, $ POST_copy)) {
        $ _POST [$ real_name] = $ value;
    }

    // Elimina l'elemento '.hidden'
    unset ($ _ POST [$ nome_campo]);
}

6

Mi piace anche la soluzione che hai appena pubblicato un campo di input aggiuntivo, l'utilizzo di JavaScript mi ​​sembra un po 'confuso.

A seconda di ciò che usi per il tuo backend dipenderà da quale input passa per primo.

Per un back-end del server in cui viene utilizzata la prima occorrenza (JSP), è necessario effettuare le seguenti operazioni.

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


Per un back-end del server in cui viene utilizzata l'ultima occorrenza (PHP, Rails), procedere come segue.

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


Per un back-end del server in cui tutte le occorrenze sono archiviate in un tipo di dati elenco ( [], array). (Python / Zope)

Puoi pubblicare in qualsiasi ordine tu voglia, devi solo provare a ottenere il valore dall'input con l' checkboxattributo type. Quindi il primo indice dell'elenco se la casella era prima dell'elemento nascosto e l'ultimo indice se la casella era dopo l'elemento nascosto.


Per un backend del server in cui tutte le occorrenze sono concatenate con una virgola (ASP.NET / IIS) Sarà necessario (dividere / esplodere) la stringa utilizzando una virgola come delimitatore per creare un tipo di dati di elenco. ( [])

Ora puoi provare a prendere il primo indice dell'elenco se la casella era prima dell'elemento nascosto e prendere l'ultimo indice se la casella era dopo l'elemento nascosto.

Gestione dei parametri di back-end

fonte dell'immagine


6

Uso questo blocco di jQuery, che aggiungerà un input nascosto al momento dell'invio a ogni casella di controllo non selezionata. Ti garantirà sempre di ottenere un valore inviato per ogni casella di controllo, ogni volta, senza ingombrare il markup e rischiare di dimenticare di farlo su una casella di controllo che aggiungi in seguito. È anche indipendente da qualunque stack di back-end (PHP, Ruby, ecc.) Che stai utilizzando.

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

5

È inoltre possibile intercettare l'evento form.submit e invertire il controllo prima di inviare

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

4

Vedo che questa domanda è vecchia e ha così tante risposte, ma darò comunque il mio penny. Il mio voto è per la soluzione javascript sull'evento "submit" del modulo, come alcuni hanno sottolineato. Non raddoppiare gli input (soprattutto se si hanno nomi e attributi lunghi con codice php misto con html), nessun fastidio sul lato server (che richiederebbe di conoscere tutti i nomi dei campi e controllarli uno per uno), basta recuperare tutti gli elementi non selezionati , assegnare loro un valore 0 (o qualsiasi altra cosa sia necessaria per indicare uno stato "non verificato") e quindi modificare il loro attributo "controllato" su vero

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

in questo modo avrai un array $ _POST come questo:

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

Non funziona al mio fianco. Sto provando a farlo, ma ancora non pubblicando tutte le caselle di controllo. [codice] $ ("# input filtro"). change (funzione (e) {console.log ('sublmit'); var b = $ ("input: checkbox: not (: checked)"); $ (b) .each (function () {$ (this) .val (2); $ (this) .attr ("checked", true);}); $ ("# filter"). submit ();}); [/ code]
lio

Ha fatto il trucco per me. L'unico inconveniente: il modulo invia ogni casella di controllo è stata selezionata. Questo può essere fonte di confusione per un utente, ma poiché la pagina viene ricaricata dopo l'invio del modulo, penso che sia un problema minore.
Oksana Romaniv

Come ha detto Oksana, controlla tutte le caselle di controllo, comprese le caselle di controllo richieste che l'utente non ha selezionato da solo consentendo l'invio del modulo senza che l'utente accetti alcune condizioni.
bskool,

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

1
Questo ha funzionato per me. Invece di usare .submit dovresti usare .click. Quindi rimuovere il bit che disabilita le caselle di controllo. Dopodiché funziona perfettamente.
cgrouge

1
La migliore risposta non è necessario aggiungere un altro input nascosto per ognuno
Sky

3

Quello che ho fatto è stato un po 'diverso. Innanzitutto ho modificato i valori di tutte le caselle di controllo non selezionate. A "0", quindi selezionali tutti, quindi il valore verrà inviato.

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


La risposta è buona, ma voglio sapere se è diversa dalla risposta di @Rameez SOOMRO?
Imran Qamer,

Risultato finale simile, solo in questo modo non si modifica il valore delle caselle di controllo selezionate.
Seborreia,

2

Preferirei fascicolare $ _POST

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

pensa, se il POST non ha il valore "checkboxname", è stato deselezionato, quindi assegnare un valore.

puoi creare un array dei tuoi valori ckeckbox e creare una funzione che controlli se esistono valori, in caso contrario, si preoccupa che non siano selezionati e puoi assegnare un valore


1

Esempio di azioni Ajax è (': checked') usato jQuery invece di .val ();

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

i parametri avranno valore in VERO O FALSO.


1

Le caselle di controllo in genere rappresentano i dati binari memorizzati nel database come valori Sì / No, S / N o 1/0. Le caselle di controllo HTML hanno una cattiva natura per inviare valore al server solo se la casella di controllo è selezionata! Ciò significa che lo script del server su un altro sito deve sapere in anticipo quali sono tutte le possibili caselle di controllo sulla pagina Web per poter memorizzare valori positivi (selezionati) o negativi (non selezionati). In realtà solo i valori negativi sono un problema (quando l'utente deseleziona il valore precedentemente (pre) controllato - come può il server sapere questo quando non viene inviato nulla se non sa in anticipo che questo nome dovrebbe essere inviato). Se si dispone di uno script lato server che crea in modo dinamico lo script UPDATE, c'è un problema perché non si conosce quali caselle di controllo devono essere ricevute per impostare il valore Y per il valore selezionato e il valore N per quelli non selezionati (non ricevuti).

Poiché memorizzo i valori 'Y' e 'N' nel mio database e li rappresento tramite caselle di controllo selezionate e deselezionate nella pagina, ho aggiunto un campo nascosto per ciascun valore (casella di controllo) con i valori 'Y' e 'N', quindi uso le caselle solo per visual rappresentazione e utilizzare il controllo funzione JavaScript semplice () per impostare il valore di if in base alla selezione.

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

utilizzare un listener onclick JavaScript e chiamare il controllo funzione () per ogni casella di controllo sulla mia pagina Web:

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

In questo modo i valori 'Y' o 'N' vengono sempre inviati allo script lato server, sa quali sono i campi che devono essere aggiornati e non è necessario convertire la casella di controllo "on" in "Y" o la casella di controllo non ricevuta in "N" '.

NOTA: anche gli spazi bianchi o la nuova riga sono fratelli, quindi qui ho bisogno di .previousSibling.previousSibling.value. Se non c'è spazio tra allora solo .previousSibling.value


Non è necessario aggiungere esplicitamente listener onclick come prima, è possibile utilizzare la libreria jQuery per aggiungere dinamicamente listener clic con funzione per modificare il valore di tutte le caselle di controllo nella pagina:

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

1

Tutte le risposte sono ottime, ma se hai più caselle di controllo in un modulo con lo stesso nome e vuoi pubblicare lo stato di ciascuna casella. Quindi ho risolto questo problema posizionando un campo nascosto con la casella di controllo (nome correlato a ciò che voglio).

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

quindi controlla lo stato di modifica della casella di controllo tramite il codice jquery sottostante:

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

ora cambiando qualsiasi casella, cambierà il valore del relativo campo nascosto. E sul server puoi guardare solo ai campi nascosti invece che alle caselle di controllo.

Spero che questo possa aiutare qualcuno ad avere questo tipo di problema. tifo :)


1

Il problema con le caselle di controllo è che se non sono selezionate, non vengono pubblicate con il modulo. Se selezioni una casella di controllo e pubblichi un modulo otterrai il valore della casella di controllo nella variabile $ _POST che puoi utilizzare per elaborare un modulo, se è deselezionato nessun valore verrà aggiunto alla variabile $ _POST.

In PHP normalmente si aggira questo problema facendo un controllo isset () sull'elemento checkbox. Se l'elemento che ti aspetti non è impostato nella variabile $ _POST, allora sappiamo che la casella di controllo non è selezionata e il valore può essere falso.

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

Ma se hai creato un modulo dinamico, non conoscerai sempre l'attributo name delle tue caselle di controllo, se non conosci il nome della casella di controllo, non puoi utilizzare la funzione isset per verificare se questo è stato inviato con la variabile $ _POST.


1
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

C'è una soluzione alternativa migliore. Prima di tutto fornire l'attributo name solo a quelle caselle che sono selezionate. Quindi, facendo clic su submit, tramite JavaScript è functionpossibile selezionare tutte le caselle non selezionate. Quindi, quando submitsolo quelli verranno recuperati in form collectioncoloro che hanno nameproprietà.

  //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);
                   });

Vantaggio: non è necessario creare scatole nascoste extra e manipolarle.


0

@cpburnz ha capito bene ma con molto codice, ecco la stessa idea usando meno codice:

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 (annotare il nome del campo usando un nome di array):

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

E per PHP:

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

0

Versione jQuery della risposta di @vishnu.

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

Se si utilizza jQuery 1.5 o versioni precedenti, utilizzare la funzione .attr () anziché .prop ()


0

Questa soluzione è ispirata a quella di @ desw.

Se i nomi di input sono in "stile modulo", si perderà l'associazione dell'indice di array con i valori di chekbox non appena viene selezionata una chekbox, incrementando questa "dissociazione" di un'unità ogni volta che viene controllata una chekbox. Questo può essere il caso di un modulo per inserire qualcosa come dipendenti composti da alcuni campi, ad esempio:

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

Nel caso in cui si inseriscano tre dipendenti contemporaneamente e il primo e il secondo siano singoli, si otterrà un isSinglearray a 5 elementi , quindi non sarà possibile iterare contemporaneamente attraverso i tre array per, ad esempio , inserire dipendenti in un database.

È possibile superare questo con un semplice postprocessing di array. Sto usando PHP sul lato server e ho fatto questo:

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

0

Quindi questa soluzione è eccessiva per questa domanda, ma mi ha aiutato quando avevo la stessa casella di controllo che si era verificata più volte per diverse righe in una tabella. Avevo bisogno di conoscere la riga rappresentata dalla casella di controllo e anche conoscere lo stato della casella (selezionata / deselezionata).

Quello che ho fatto è stato togliere l'attributo name dai miei input da checkbox, dare loro tutti la stessa classe e creare un input nascosto che potesse contenere l'equivalente JSON dei dati.

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 da eseguire all'invio del modulo

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

La stringa json verrà passata con il modulo come $ _POST ["has-autorizzazioni-valori"]. In PHP, decodifica la stringa in un array e avrai un array associativo che ha ogni riga e il valore vero / falso per ogni casella di controllo corrispondente. È quindi molto semplice esaminare e confrontare i valori correnti del database.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.