Как проверить форму с несколькими флажками, чтобы установить хотя бы один - PullRequest
40 голосов
/ 08 октября 2009

Я пытаюсь проверить форму с помощью плагина validate для jquery. Я хочу потребовать, чтобы пользователь установил хотя бы один флажок в группе для отправки формы. Вот мой код jquery:

$().ready(function() {
$("#subscribeForm").validate({
   rules:   { list: {required: "#list0:checked"} },
   messages:  { list:  "Please select at least one newsletter"}                                                        
 });
 });

и вот HTML-форма:

<form action="" method="GET" id="subscribeForm">
<fieldset id="cbgroup">
    <div><input name="list" id="list0" type="checkbox"  value="newsletter0" >zero</div>
    <div><input name="list" id="list1" type="checkbox"  value="newsletter1" >one</div>
    <div><input name="list" id="list2" type="checkbox"  value="newsletter2" >two</div>
</fieldset>
<input name="submit" type="submit"  value="submit">

Проблема в том, что форма отправляется, даже если ничего не проверено. Как я могу решить это?

Ответы [ 11 ]

52 голосов
/ 19 ноября 2009
  $('#subscribeForm').validate( {
      rules: {
          list: {
              required: true,
              minlength: 1
          }
       }
   });

Я думаю, это обеспечит проверку хотя бы одного из них.

30 голосов
/ 08 октября 2009

Этот скрипт ниже должен поставить вас на правильный путь, возможно?

Вы можете оставить этот HTML таким же (хотя я изменил метод на POST):

<form method="POST" id="subscribeForm">
    <fieldset id="cbgroup">
        <div><input name="list" id="list0" type="checkbox"  value="newsletter0" >zero</div>
        <div><input name="list" id="list1" type="checkbox"  value="newsletter1" >one</div>
        <div><input name="list" id="list2" type="checkbox"  value="newsletter2" >two</div>
    </fieldset>
    <input name="submit" type="submit"  value="submit">
</form>

и этот JavaScript проверяет

function onSubmit() 
{ 
    var fields = $("input[name='list']").serializeArray(); 
    if (fields.length === 0) 
    { 
        alert('nothing selected'); 
        // cancel submit
        return false;
    } 
    else 
    { 
        alert(fields.length + " items selected"); 
    }
}

// register event on form, not submit button
$('#subscribeForm').submit(onSubmit)

и рабочий пример вы можете найти здесь

ОБНОВЛЕНИЕ (октябрь 2012 г.)
Кроме того, следует отметить, что флажки должны иметь свойство "name", иначе они не будут добавлены в массив. Только «id» не будет работать.

ОБНОВЛЕНИЕ (май 2013 г.)
Переместил регистрацию отправки в javascript и зарегистрировал отправку в форме (как это должно было быть изначально)

ОБНОВЛЕНИЕ (июнь 2016 г.)
Изменения == в ===

11 голосов
/ 08 октября 2009

Как насчет этого:

$(document).ready(function() {
    $('#subscribeForm').submit(function() {
        var $fields = $(this).find('input[name="list"]:checked');
        if (!$fields.length) {
            alert('You must check at least one box!');
            return false; // The form will *not* submit
        }
    });
});
9 голосов
/ 20 февраля 2011

Вышеуказанный addMethod от Lod Lawson не совсем корректен. Это $ .validator, а не $ .validate, а имя метода валидатора cb_selectone требует кавычек. Вот исправленная версия, которую я тестировал:

$.validator.addMethod('cb_selectone', function(value,element){
    if(element.length>0){
        for(var i=0;i<element.length;i++){
            if($(element[i]).val('checked')) return true;
        }
        return false;
    }
    return false;
}, 'Please select at least one option');
6 голосов
/ 17 июля 2011

Вот быстрое решение для проверки нескольких флажков с помощью плагина проверки jquery:

jQuery.validator.addMethod('atLeastOneChecked', function(value, element) {
  return ($('.cbgroup input:checked').length > 0);
});

$('#subscribeForm').validate({
  rules: {
    list0: { atLeastOneChecked: true }
  },
  messages: {
    list0: { 'Please check at least one option' }
  }
});

$('.cbgroup input').click(function() {
  $('#list0').valid();
});
1 голос
/ 11 сентября 2013
if (
  document.forms["form"]["mon"].checked==false &&
  document.forms["form"]["tues"].checked==false &&
  document.forms["form"]["wed"].checked==false &&
  document.forms["form"]["thrs"].checked==false &&
  document.forms["form"]["fri"].checked==false
) {
  alert("Select at least One Day into Five Days");
  return false; 
}
1 голос
/ 14 июня 2012

Хороший пример без пользовательских методов проверки, но с плагином метаданных и некоторым дополнительным html.

Демо от автора плагина Jquery.Validate

0 голосов
/ 15 января 2019

Я проверил все ответы и даже в других подобных вопросах, я пытался найти оптимальный путь с помощью класса HTML и пользовательского правила.

моя структура HTML для нескольких флажков выглядит так

$.validator.addMethod('multicheckbox_rule', function (value, element) {
			var $parent = $(element).closest('.checkbox_wrapper');
			if($parent.find('.checkbox_item').is(':checked')) return true;
            return false;
}, 'Please at least select one');
<div class="checkbox_wrapper">
<label for="checkbox-1"><input class="checkbox_item" id="checkbox-1"  name="checkbox_item[1]" type="checkbox" value="1" data-rule-multicheckbox_rule="1" /> Checkbox_item 1</label>
<label for="checkbox-2"><input class="checkbox_item" id="checkbox-2" name="checkbox_item[2]" type="checkbox" value="1" data-rule-multicheckbox_rule="1" /> Checkbox_item 1</label>
</div>
0 голосов
/ 11 июля 2012

У меня был немного другой сценарий. Мои флажки были созданы в динамическом режиме, и они не принадлежали к одной группе. Но, по крайней мере, любой из них должен был быть проверен. Мой подход (никогда не говорите, что это идеально), я создал общий валидатор для всех них:

jQuery.validator.addMethod("validatorName", function(value, element) {
    if (($('input:checkbox[name=chkBox1]:checked').val() == "Val1") ||
        ($('input:checkbox[name=chkBox2]:checked').val() == "Val2") ||
        ($('input:checkbox[name=chkBox3]:checked').val() == "Val3")) 
    {   
        return true;
    }
    else
    {
        return false;
    }       
}, "Please Select any one value");

Теперь мне нужно было связать каждый из chkbox с этим единственным валидатором.

Опять же, я должен был запустить проверку, когда были нажаты какие-либо флажки, запускающие средство проверки.

$('#piRequest input:checkbox[name=chkBox1]').click(function(e){
    $("#myform").valid();
});
0 голосов
/ 28 июня 2012

Я должен был сделать то же самое, и это то, что я написал. Я сделал это более гибким в моем случае, поскольку у меня было несколько групп флажков для проверки.

// param: reqNum number of checkboxes to select
$.fn.checkboxValidate = function(reqNum){
    var fields = this.serializeArray();
    return (fields.length < reqNum) ? 'invalid' : 'valid';
}

, затем вы можете передать эту функцию, чтобы проверить несколько групп флажков с несколькими правилами.

// helper function to create error
function err(msg){
    alert("Please select a " + msg + " preference.");
}

$('#reg').submit(function(e){
    //needs at lease 2 checkboxes to be selected
    if($("input.region, input.music").checkboxValidate(2) == 'invalid'){
        err("Region and Music");
    } 
});
...