Utilizzando l'attributo HTML5 "obbligatorio" per un gruppo di caselle di controllo?


172

Quando si utilizzano i browser più recenti che supportano HTML5 (ad esempio FireFox 4);
e un campo modulo ha l'attributo required='required';
e il campo del modulo è vuoto / vuoto;
e si fa clic sul pulsante di invio;
il browser rileva che il campo "obbligatorio" è vuoto e non invia il modulo;
invece il browser mostra un suggerimento che chiede all'utente di digitare del testo nel campo.

Ora, invece di un singolo campo di testo, ho un gruppo di caselle di controllo , di cui almeno una dovrebbe essere selezionata / selezionata dall'utente.

Come posso usare l' requiredattributo HTML5 su questo gruppo di caselle di controllo? (Dal momento che solo una delle caselle di controllo deve essere selezionata, non posso mettere l' requiredattributo su ogni casella di controllo)

ps. Sto usando simple_form , se è importante.


AGGIORNARE

L' attributo HTML 5multiple potrebbe essere utile qui? Qualcuno l'ha mai usato prima per fare qualcosa di simile alla mia domanda?

AGGIORNARE

E sembra che questa caratteristica non è supportata dalle specifiche HTML5: PROBLEMA-111: Che cosa significa ingresso @ richiesta media per @type = casella di controllo.?

(Stato del problema: il problema è stato contrassegnato come chiuso senza pregiudizio. ) Ed ecco la spiegazione .

AGGIORNAMENTO 2

È una vecchia domanda, ma volevo chiarire che l'intento originale della domanda era di essere in grado di fare quanto sopra senza usare Javascript - cioè usando un modo HTML5 di farlo. In retrospettiva, avrei dovuto rendere il "senza Javascript" più ovvio.


4
Questa è un'ottima domanda e si applica a qualsiasi input di modulo che sia un array (inclusi input di testo) in cui si desidera avere almeno un elemento con un valore o selezionato (ma non uno specifico). Demo Penso che potrebbe non esserci un modo per farlo, ma spero che ci sia. (A proposito non importa quale lingua, framework o libreria, è rigorosamente HTML5)
Wesley Murch

Grazie per aver aggiunto la demo di JSFiddle. Si spera che ci sia un modo HTML5 per farlo, altrimenti probabilmente dovremo arrotolare una soluzione usando JQuery e un campo nascosto o qualcosa del genere.
Zabba,

Se vuoi tornare a javascript (e stai usando jQuery), non è necessario "arrotolare" nulla, usa il plug-in di validazione consolidato: bassistance.de/jquery-plugins/jquery-plugin-validation
Wesley Murch

5
@natedavisolds, direi che l'uso è utile in alcune UI - IMO, selezionare più caselle di controllo è più intuitivo per l'utente finale, specialmente quando il numero di caselle di controllo è piccolo - piuttosto che un clic + seleziona come nel caso di un casella di selezione multipla.
Zabba,

1
Come nota a margine, non è necessario l'intero bit richiesto = 'richiesto'; è sufficiente semplicemente "richiesto".
William,

Risposte:


85

Sfortunatamente HTML5 non fornisce un modo immediato per farlo.

Tuttavia, utilizzando jQuery, è possibile controllare facilmente se un gruppo di caselle di controllo ha almeno un elemento selezionato.

Considera il seguente frammento DOM:

<div class="checkbox-group required">
    <input type="checkbox" name="checkbox_name[]">
    <input type="checkbox" name="checkbox_name[]">
    <input type="checkbox" name="checkbox_name[]">
    <input type="checkbox" name="checkbox_name[]">
</div>

Puoi usare questa espressione:

$('div.checkbox-group.required :checkbox:checked').length > 0

che restituisce truese viene selezionato almeno un elemento. Sulla base di ciò, è possibile implementare il controllo di convalida.


@Clijsters la domanda è su un modo HTML5 per farlo - non con Javascript (ovviamente, sono possibili varie soluzioni in Javascript)
Zabba

6
@Zabba Ma questa risposta dice. come farlo in html5 scrivendo Purtroppo HTML5 non fornisce un modo immediato per farlo
Clijsters

Abbastanza giusto @Clijsters
Zabba

18

È un trucco semplice. Questo è il codice jQuery che può sfruttare la convalida html5 modificando le requiredproprietà se qualcuno è selezionato. Di seguito è riportato il tuo codice html (assicurati di aggiungere richiesto per tutti gli elementi nel gruppo.)

<input type="checkbox" name="option[]" id="option-1" value="option1" required/> Option 1
<input type="checkbox" name="option[]" id="option-2" value="option2" required/> Option 2
<input type="checkbox" name="option[]" id="option-3" value="option3" required/> Option 3
<input type="checkbox" name="option[]" id="option-4" value="option4" required/> Option 4
<input type="checkbox" name="option[]" id="option-5" value="option5" required/> Option 5

Di seguito è riportato lo script jQuery, che disabilita un ulteriore controllo di convalida se ne viene selezionato uno. Selezionare utilizzando l'elemento name.

$cbx_group = $("input:checkbox[name='option[]']");
$cbx_group = $("input:checkbox[id^='option-']"); // name is not always helpful ;)

$cbx_group.prop('required', true);
if($cbx_group.is(":checked")){
  $cbx_group.prop('required', false);
}

Piccolo gotcha qui: Dal momento che stai utilizzando la convalida html5, assicurati di eseguirlo prima che venga convalidato, cioè prima dell'invio del modulo.

// but this might not work as expected
$('form').submit(function(){
  // code goes here
});

// So, better USE THIS INSTEAD:
$('button[type="submit"]').on('click', function() {
  // skipping validation part mentioned above
});

Mentre è possibile fare via Javascript, stavo cercando una soluzione senza usare Javascript.
Zabba,

3
Penso che questa sia la risposta migliore finora. Sì, utilizza javascript, ma utilizza la convalida HTML5 invece di visualizzare un avviso JavaScript. Altre risposte utilizzano JS e una finestra pop-up JS.
Cruz Nunez,

1
Questo è veramente buono. Assicurati di scegliere l'uno o l'altro su quelle prime due righe jQuery (la seconda annulla la prima). Assicurati anche di cambiare "opzione" con il nome dell'opzione.
Allen Gingrich,

Dato che questo non è supportato nativamente in HTML5, questa dovrebbe davvero essere la risposta accettata! Non voglio implementare la mia libreria di convalida solo per una serie di campi della casella di controllo in un singolo modulo sul mio sito.
JamesWilson,

11

Immagino che non ci sia un modo HTML5 standard per farlo, ma se non ti dispiace usare una libreria jQuery, sono stato in grado di ottenere una convalida "gruppo checkbox" usando la funzione di convalida " gruppo-richiesto " di webshims :

I documenti per i gruppi richiesti dicono:

Se una casella di controllo ha la classe "gruppo richiesto", è necessario selezionare almeno una delle caselle di controllo con lo stesso nome all'interno del modulo / documento.

Ed ecco un esempio di come lo useresti:

<input name="checkbox-group" type="checkbox" class="group-required" id="checkbox-group-id" />
<input name="checkbox-group" type="checkbox" />
<input name="checkbox-group" type="checkbox" />
<input name="checkbox-group" type="checkbox" />
<input name="checkbox-group" type="checkbox" />

Uso principalmente i webshims per eseguire il polyfill delle funzionalità HTML5, ma ha anche delle ottime estensioni opzionali come questa.

Ti consente persino di scrivere le tue regole di validità personalizzate. Ad esempio, dovevo creare un gruppo di caselle di controllo che non era basato sul nome dell'input, quindi ho scritto la mia regola di validità per quello ...


11

HTML5 non supporta direttamente la necessità di selezionare solo una / almeno una casella di controllo in un gruppo di caselle di controllo. Ecco la mia soluzione usando Javascript:

HTML

<input class='acb' type='checkbox' name='acheckbox[]' value='1' onclick='deRequire("acb")' required> One
<input class='acb' type='checkbox' name='acheckbox[]' value='2' onclick='deRequire("acb")' required> Two

JAVASCRIPT

       function deRequireCb(elClass) {
            el=document.getElementsByClassName(elClass);

            var atLeastOneChecked=false;//at least one cb is checked
            for (i=0; i<el.length; i++) {
                if (el[i].checked === true) {
                    atLeastOneChecked=true;
                }
            }

            if (atLeastOneChecked === true) {
                for (i=0; i<el.length; i++) {
                    el[i].required = false;
                }
            } else {
                for (i=0; i<el.length; i++) {
                    el[i].required = true;
                }
            }
        }

Il javascript assicurerà che almeno una casella sia selezionata, quindi deseleziona l'intero gruppo di caselle. Se la casella di controllo selezionata non viene selezionata, saranno necessarie tutte le caselle di controllo!


Una soluzione molto buona e pulita. Wish potrebbe dare più di +1 voto.
Sonal,

Concordato @Sonal! Grazie per questa soluzione Brian!
NorahKSakal,

3

Ho avuto lo stesso problema e la mia soluzione era questa:

HTML:

<form id="processForm.php" action="post">
  <div class="input check_boxes required wish_payment_type">
    <div class="wish_payment_type">
    <span class="checkbox payment-radio">
      <label for="wish_payment_type_1">
        <input class="check_boxes required" id="wish_payment_type_1" name="wish[payment_type][]" type="checkbox" value="1">Foo
      </label>
    </span>
    <span class="checkbox payment-radio">
      <label for="wish_payment_type_2">
        <input class="check_boxes required" id="wish_payment_type_2" name="wish[payment_type][]" type="checkbox" value="2">Bar
      </label>
    </span>
    <span class="checkbox payment-radio">
      <label for="wish_payment_type_3">
        <input class="check_boxes required" id="wish_payment_type_3" name="wish[payment_type][]" type="checkbox" value="3">Buzz
      </label>

      <input id='submit' type="submit" value="Submit">
  </div>
</form>

JS:

var verifyPaymentType = function () {
  var checkboxes = $('.wish_payment_type .checkbox');
  var inputs = checkboxes.find('input');
  var first = inputs.first()[0];

  inputs.on('change', function () {
    this.setCustomValidity('');
  });

  first.setCustomValidity(checkboxes.find('input:checked').length === 0 ? 'Choose one' : '');
}

$('#submit').click(verifyPaymentType);

https://jsfiddle.net/oywLo5z4/


2

Ispirato dalle risposte di @thegauraw e @Brian Woodward, ecco un po 'che ho messo insieme per gli utenti di JQuery, tra cui un messaggio di errore di convalida personalizzato:

$cbx_group = $("input:checkbox[name^='group']");
$cbx_group.on("click", function() {
    if ($cbx_group.is(":checked")) {
        // checkboxes become unrequired as long as one is checked
        $cbx_group.prop("required", false).each(function() {
            this.setCustomValidity("");
        });
    } else {
        // require checkboxes and set custom validation error message
        $cbx_group.prop("required", true).each(function() {
            this.setCustomValidity("Please select at least one checkbox.");
        });
    }
});

Si noti che il mio modulo ha alcune caselle di controllo selezionate per impostazione predefinita.

Forse alcuni di voi maghi JavaScript / JQuery potrebbero stringere ancora di più?


2

possiamo farlo facilmente anche con html5, basta aggiungere un po 'di codice jquery

dimostrazione

HTML

<form>
 <div class="form-group options">
   <input type="checkbox" name="type[]" value="A" required /> A
   <input type="checkbox" name="type[]" value="B" required /> B
   <input type="checkbox" name="type[]" value="C" required /> C
   <input type="submit">
 </div>
</form>

jquery

$(function(){
    var requiredCheckboxes = $('.options :checkbox[required]');
    requiredCheckboxes.change(function(){
        if(requiredCheckboxes.is(':checked')) {
            requiredCheckboxes.removeAttr('required');
        } else {
            requiredCheckboxes.attr('required', 'required');
        }
    });
});

2

Ho aggiunto una radio invisibile a un gruppo di caselle di controllo. Quando è selezionata almeno un'opzione, anche la radio è impostata per il controllo. Quando tutte le opzioni vengono annullate, anche la radio è impostata su Annulla. Pertanto, il modulo utilizza il prompt radio "Verifica almeno un'opzione"

  • Non puoi usare display: noneperché la radio non può essere focalizzata.
  • Rendo la dimensione della radio uguale all'intera dimensione delle caselle di controllo, quindi è più ovvia quando richiesto.

HTML

<form>
  <div class="checkboxs-wrapper">
    <input id="radio-for-checkboxes" type="radio" name="radio-for-required-checkboxes" required/>
    <input type="checkbox" name="option[]" value="option1"/>
    <input type="checkbox" name="option[]" value="option2"/>
    <input type="checkbox" name="option[]" value="option3"/>
  </div>
  <input type="submit" value="submit"/>
</form>

Javascript

var inputs = document.querySelectorAll('[name="option[]"]')
var radioForCheckboxes = document.getElementById('radio-for-checkboxes')
function checkCheckboxes () {
    var isAtLeastOneServiceSelected = false;
    for(var i = inputs.length-1; i >= 0; --i) {
        if (inputs[i].checked) isAtLeastOneCheckboxSelected = true;
    }
    radioForCheckboxes.checked = isAtLeastOneCheckboxSelected
}
for(var i = inputs.length-1; i >= 0; --i) {
    inputs[i].addEventListener('change', checkCheckboxes)
}

CSS

.checkboxs-wrapper {
  position: relative;
}
.checkboxs-wrapper input[name="radio-for-required-checkboxes"] {
    position: absolute;
    margin: 0;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    -webkit-appearance: none;
    pointer-events: none;
    border: none;
    background: none;
}

https://jsfiddle.net/codus/q6ngpjyc/9/


Questa è un'ottima soluzione Funziona come un fascino. Tuttavia, in Firefox, ottengo un grande contorno rosso attorno alla casella del pulsante di opzione quando è impostato su obbligatorio su tutti i controlli del modulo utilizzando questo pulsante di opzione. C'è un modo per modellare il contorno in modo che non sia rosso quando non è valido (pulsante di opzione non selezionato quando richiesto) tranne quando l'utente preme invio e viene eseguita la convalida?
gib65

Possiamo impostare radio" opacity0" e " opacity1" quando inviato, in modo da poter controllare se il contorno rosso appare o meno.
Codus,

Questa soluzione è geniale !! Nel mio caso non ha funzionato se ne uso uno visibility: hiddeno display: nonesolo per evitare di sporcare un po 'l'usabilità. Perché gli screen reader e altri strumenti di accessibilità troveranno probabilmente il pulsante di opzione nascosto.
hoorider

1

Ciao basta usare una casella di testo aggiuntiva al gruppo di casella di controllo. Quando si fa clic su una casella di controllo, inserire i valori in quella casella di testo. Rendere quella casella di testo richiesta e di sola lettura.


0

Mi rendo conto che ci sono un sacco di soluzioni qui, ma ho scoperto che nessuna di queste ha soddisfatto tutti i requisiti che avevo:

  • Nessuna codifica personalizzata richiesta
  • Il codice funziona al caricamento della pagina
  • Nessuna classe personalizzata richiesta (caselle di controllo o loro padre)
  • Avevo bisogno di diversi elenchi di caselle di controllo per condividere lo stesso nameper l'invio di problemi di Github tramite la loro API e stavo usando il nome label[]per assegnare etichette in molti campi del modulo (due elenchi di caselle di controllo e alcune selezioni e caselle di testo) - concesso che avrei potuto raggiungere questo obiettivo senza che condividessero lo stesso nome, ma ho deciso di provarlo e ha funzionato.

L'unico requisito per questo è jQuery. Puoi combinare questo con l'ottima soluzione di @ ewall per aggiungere messaggi di errore di convalida personalizzati.

/* required checkboxes */
(function ($) {
	$(function () {
		var $requiredCheckboxes = $("input[type='checkbox'][required]");

		/* init all checkbox lists */
		$requiredCheckboxes.each(function (i, el) {
			//this could easily be changed to suit different parent containers
			var $checkboxList = $(this).closest("div, span, p, ul, td");

			if (!$checkboxList.hasClass("requiredCheckboxList"))
				$checkboxList.addClass("requiredCheckboxList");
		});

		var $requiredCheckboxLists = $(".requiredCheckboxList");

		$requiredCheckboxLists.each(function (i, el) {
			var $checkboxList = $(this);
			$checkboxList.on("change", "input[type='checkbox']", function (e) {
				updateCheckboxesRequired($(this).parents(".requiredCheckboxList"));
			});

			updateCheckboxesRequired($checkboxList);
		});

		function updateCheckboxesRequired($checkboxList) {
			var $chk = $checkboxList.find("input[type='checkbox']").eq(0),
				cblName = $chk.attr("name"),
				cblNameAttr = "[name='" + cblName + "']",
				$checkboxes = $checkboxList.find("input[type='checkbox']" + cblNameAttr);

			if ($checkboxList.find(cblNameAttr + ":checked").length > 0) {
				$checkboxes.prop("required", false);
			} else {
				$checkboxes.prop("required", true);
			}
		}

	});
})(jQuery);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<form method="post" action="post.php">
<div>
	Type of report:
</div>
<div>
	<input type="checkbox" id="chkTypeOfReportError" name="label[]" value="Error" required>
	<label for="chkTypeOfReportError">Error</label>

	<input type="checkbox" id="chkTypeOfReportQuestion" name="label[]" value="Question" required>
	<label for="chkTypeOfReportQuestion">Question</label>

	<input type="checkbox" id="chkTypeOfReportFeatureRequest" name="label[]" value="Feature Request" required>
	<label for="chkTypeOfReportFeatureRequest">Feature Request</label>
</div>

<div>
	Priority
</div>
<div>
	<input type="checkbox" id="chkTypeOfContributionBlog" name="label[]" value="Priority: High" required>
	<label for="chkPriorityHigh">High</label>


	<input type="checkbox" id="chkTypeOfContributionBlog" name="label[]" value="Priority: Medium" required>
	<label for="chkPriorityMedium">Medium</label>


	<input type="checkbox" id="chkTypeOfContributionLow" name="label[]" value="Priority: Low" required>
	<label for="chkPriorityMedium">Low</label>
</div>
<div>
	<input type="submit" />
</div>
</form>


-1

Ecco un altro semplice trucco usando Jquery !!

HTML

<form id="hobbieform">
        <div>
            <input type="checkbox" name="hobbies[]">Coding
            <input type="checkbox" name="hobbies[]">Gaming
            <input type="checkbox" name="hobbies[]">Driving
        </div>
</form>


JQuery

$('#hobbieform').on("submit", function (e) {
    var arr = $(this).serialize().toString();
    if(arr.indexOf("hobbies") < 0){
        e.preventDefault();
        alert("You must select at least one hobbie");
    }
});

Questo è tutto .. questo funziona perché se nessuna delle caselle di controllo è selezionata, nulla per quanto riguarda il gruppo delle caselle di controllo (incluso il suo nome) viene pubblicato sul server


-1

Provare:

self.request.get('sports_played', allow_multiple=True)

o

self.request.POST.getall('sports_played')

Più specificamente:

Quando leggi i dati dall'array della casella di controllo, assicurati che l'array abbia:

len>0 

In questo caso:

len(self.request.get('array', allow_multiple=True)) > 0

Potresti forse approfondire un po 'di più la tua risposta?
Venti

quando stai leggendo i dati dall'array checkbox, assicurati che l'array abbia len> 0 in questo caso: len (self.request.get ('array', allow_multiple = True))>> 0
Gjison Giocf

Modifica la tua domanda con le informazioni nel tuo commento sopra e sarò felice di rimuovere il voto negativo.
Venti

Grazie per aver modificato il tuo post, ma un po 'più di cortesia sarebbe appropriato.
Venti

sembra totalmente estraneo alla domanda. Sta chiedendo informazioni sulla convalida HTML, e la soluzione qui è Python. La domanda non è nemmeno porre sulla convalida lato server, si sta chiedendo se esiste un modo per convalidare i gruppi di caselle di controllo per verificare se almeno 1 è selezionato.
Octavioamu
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.