확인란 그룹에 HTML5“필수”속성을 사용하십니까?


172

HTML5를 지원하는 최신 브라우저를 사용하는 경우 (예 : FireFox 4);
양식 필드에는 속성이 있습니다 required='required'.
양식 필드가 비어 있거나 비어 있습니다.
제출 버튼이 클릭됩니다.
브라우저는 "필수"필드가 비어 있음을 감지하고 양식을 제출하지 않습니다.
대신 브라우저는 사용자에게 필드에 텍스트를 입력하도록 요청하는 힌트를 표시합니다.

이제 단일 텍스트 필드 대신 확인란 그룹 이 있는데 그중 하나가 사용자가 확인 / 선택해야합니다.

required이 확인란 그룹 에서 HTML5 속성을 어떻게 사용 합니까? (확인란 중 하나만 선택하면되므로 required각 확인란마다 속성을 넣을 수 없습니다 )

추신. 중요한 경우 simple_form을 사용 하고 있습니다.


최신 정보

HTML 5 multiple속성은 여기에 도움이 될? 내 질문과 비슷한 것을하기 전에 누군가 그것을 사용 했습니까?

최신 정보

나타납니다 :이 기능은 HTML5 스펙에서 지원하지 않는 것을 ISSUE-111 :. @ 입력하지 @type = 체크 박스에 대한 평균 필요한 무엇?

(문제 상태 : 문제는 편견없이 폐쇄 된 것으로 표시되었습니다. ) 그리고 여기에 설명이 있습니다.

업데이트 2

그것은 오래된 질문이지만 질문의 원래 의도는 Javascript를 사용하지 않고 즉, HTML5 방식으로 위의 작업을 수행 할 수 있다는 것을 분명히하고 싶었습니다. 돌이켜 보면, "자바 스크립트없이"를 더 분명하게 만들어야했습니다.


4
이것은 좋은 질문이며, 값이있는 항목을 하나 이상 (선택하지 않은) 항목으로 지정하려는 배열 (텍스트 입력 포함) 인 모든 양식 입력에 적용됩니다. 데모 나는 이것을 할 수있는 방법이 없을 것이라고 생각하지만 거기에 있기를 바랍니다. (BTW는 어떤 언어 나 프레임 워크 또는 라이브러리와 상관없이 엄격하게 HTML5입니다)
Wesley Murch

JSFiddle 데모를 추가해 주셔서 감사합니다. 이 작업을 수행하기위한 HTML5 방법이 있기를 바랍니다. 그렇지 않으면 JQuery와 숨겨진 필드 등을 사용하여 솔루션을 롤업해야 할 것입니다.
Zabba

자바 스크립트로 돌아가고 (jQuery를 사용하는 경우) 아무 것도 "롤업"할 필요가없는 경우 고도로 확립 된 유효성 검사 플러그인을 사용하십시오. bassistance.de/jquery-plugins/jquery-plugin-validation
Wesley Murch

5
@natedavisolds, 나는 일부 UI에서 사용법이 유용하다고 주장한다-IMO, 여러 개의 체크 박스를 선택하는 것은 최종 사용자에게 더 직관적입니다. 특히 체크 박스의 수가 적을 때-클릭 + 선택이 아닌 경우- 다중 선택 상자.
Zabba

1
참고로, 당신은 전체 required = 'required'비트가 필요하지 않습니다. 단순히 '필수'를 넣는 것으로 충분합니다.
William

답변:


85

불행히도 HTML5는 즉시 사용 가능한 방법을 제공하지 않습니다.

그러나 jQuery를 사용하면 확인란 그룹에 하나 이상의 확인 된 요소가 있는지 쉽게 제어 할 수 있습니다.

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

이 표현을 사용할 수 있습니다 :

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

true적어도 하나의 요소가 검사되면 반환 합니다. 이를 바탕으로 유효성 검사를 구현할 수 있습니다.


@Clijsters 질문은 자바 스크립트가 아닌 HTML5 방법에 관한 것입니다 (물론 자바 스크립트에서는 다양한 솔루션이 가능합니다)
Zabba

6
@Zabba 그러나이 답변은 말합니다. 불행히도 HTML5
Clijsters

충분히 @Clijsters
Zabba

18

간단한 트릭입니다. 이것은 required속성이 선택되어 있으면 속성 을 변경하여 html5 유효성 검사를 활용할 수있는 jQuery 코드입니다 . 다음은 HTML 코드입니다 (그룹의 모든 요소에 필수를 추가해야합니다).

<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

다음은 jQuery 스크립트이며,이 중 하나를 선택하면 추가 유효성 검사가 비활성화됩니다. 이름 요소를 사용하여 선택하십시오.

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

여기에 작은 문제가 있습니다. html5 유효성 검사를 사용하고 있으므로 유효성 검사 전에 양식을 제출하기 전에이를 실행하십시오.

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

Javascript를 통해 할 수는 있지만 Javascript를 사용하지 않는 솔루션을 찾고있었습니다.
Zabba

3
나는 이것이 지금까지 가장 좋은 대답이라고 생각합니다. 예, 자바 스크립트를 사용하지만 자바 스크립트 경고 팝업 대신 HTML5의 유효성 검사를 사용합니다. 다른 답변은 JS와 JS 팝업 창을 사용합니다.
Cruz Nunez 2016 년

1
정말 좋습니다. 첫 두 jQuery 행에서 하나를 선택해야합니다 (두 번째는 첫 번째를 취소합니다). 또한 "option"을 옵션 이름으로 변경하십시오.
Allen Gingrich

이것이 HTML5에서 기본적으로 지원되지 않는다는 것을 감안할 때, 이것은 실제로 받아 들여지는 대답이어야합니다! 내 사이트의 단일 양식에 하나의 확인란 필드 집합에 대해서만 자체 유효성 검사 라이브러리를 구현하고 싶지 않습니다.
JamesWilson

11

나는 이것을 수행하는 표준 HTML5 방법이 없다고 생각하지만 jQuery 라이브러리를 사용하지 않는다면 webshims ' " group-required "유효성 검사 기능을 사용하여 "체크 박스 그룹"유효성 검사를 수행 할 수 있었다 .

그룹이 요구 하는 문서는 다음과 같습니다.

확인란에 '그룹 필수'클래스가있는 경우 양식 / 문서 내에서 이름이 같은 확인란 중 하나 이상을 선택해야합니다.

사용 방법에 대한 예는 다음과 같습니다.

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

나는 주로 웹 심을 사용하여 HTML5 기능을 폴리 필하지만, 이와 같은 훌륭한 옵션 확장 기능도 있습니다.

자신 만의 사용자 지정 유효성 규칙을 작성할 수도 있습니다. 예를 들어 입력 이름을 기반으로하지 않은 확인란 그룹을 만들어야했기 때문에 자체 유효성 규칙을 작성했습니다 ...


11

HTML5는 확인란 그룹에서 하나 이상의 확인란 만 선택하도록 요구하지 않습니다. 다음은 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

자바 스크립트

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

자바 스크립트는 하나 이상의 확인란이 선택되어 있는지 확인한 다음 전체 확인란 그룹이 필요하지 않습니다. 선택된 하나의 확인란이 선택 해제되면 모든 확인란이 다시 필요합니다!


매우 좋고 깨끗한 솔루션입니다. Wish는 +1 이상의 투표를 할 수 있습니다.
Sonal

@Sonal에 동의 함! 이 솔루션에 감사드립니다. Brian!
NorahKSakal

3

나는 같은 문제가 있었고 내 해결책은 다음과 같습니다.

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

@thegauraw와 @Brian Woodward의 답변에서 영감을 얻은 다음은 사용자 정의 유효성 검사 오류 메시지를 포함하여 JQuery 사용자를 위해 함께 가져온 것입니다.

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

내 양식에는 기본적으로 일부 확인란이 선택되어 있습니다.

JavaScript / JQuery 마법사 중 일부가 더 강화할 수 있습니까?


2

html5로 쉽게 할 수 있습니다 .jquery 코드를 추가하면됩니다.

데모

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

확인란 그룹에 보이지 않는 라디오를 추가했습니다. 적어도 하나의 옵션을 확인하면 라디오도 확인하도록 설정됩니다. 모든 옵션이 취소되면 라디오도 취소되도록 설정됩니다. 따라서이 양식에는 "적어도 하나 이상의 옵션을 확인하십시오"라는 라디오 프롬프트가 사용됩니다.

  • display: none라디오에 초점을 맞출 수 없으므로 사용할 수 없습니다.
  • 라디오 크기를 전체 확인란 크기와 동일하게 만들므로 메시지가 표시되면 더 분명합니다.

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>

자바 스크립트

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/


이것은 훌륭한 솔루션입니다. 매력처럼 작동합니다. 그러나 Firefox에서는이 라디오 버튼을 사용하는 모든 양식 컨트롤에서 라디오 버튼 상자가 필수로 설정되면 라디오 버튼 상자 주위에 큰 빨간 윤곽선이 나타납니다. 사용자가 제출을 제출하고 유효성 검사를 수행하는 경우를 제외하고 유효하지 않은 경우 (라디오 버튼이 선택되지 않은 경우) 윤곽선이 빨간색이 아닌 스타일을 지정할 수 있습니까?
gib65

우리는 설정할 수 radio의를 opacity0으로하고, 세트 opacity제출 때 우리는 빨간색 윤곽이 나타나거나하지 여부를 제어 할 수 있다는, 1.
Codus

이 솔루션은 천재입니다! 내 경우 에는 유용성을 약간 더럽 히지 않도록 visibility: hidden또는 하나를 사용하면 작동하지 않습니다 display: none. 스크린 리더 및 기타 접근성 도구는 아마도 숨겨진 라디오 버튼을 찾을 것입니다.
hoorider

1

안녕하세요. 확인란 그룹에 추가로 텍스트 상자를 사용하십시오. 확인란을 클릭하면 해당 텍스트 상자에 값을 입력하십시오. 텍스트 상자가 필요하고 읽기 전용인지 확인하십시오.


0

나는 여기에 수많은 솔루션이 있다는 것을 알고 있지만, 내가 가진 모든 요구 사항을 충족시키지 못했습니다.

  • 커스텀 코딩 불필요
  • 페이지로드시 코드 작동
  • 커스텀 클래스 불필요 (체크 박스 또는 부모)
  • nameAPI를 통해 Github 문제를 제출하기 위해 동일한 것을 공유하기 위해 여러 개의 체크 박스 목록이 필요했으며 이름 label[]을 사용하여 많은 양식 필드 (두 개의 체크 박스 목록과 일부 선택 및 텍스트 상자)에 레이블을 할당했습니다. 같은 이름이지만 시도해보기로 결정했습니다.

이것에 대한 유일한 요구 사항은 jQuery입니다. 이를 @ewall의 훌륭한 솔루션과 결합하여 사용자 지정 유효성 검사 오류 메시지를 추가 할 수 있습니다.

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

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

이것이 전부입니다. 확인란이 선택되지 않은 경우 확인란 그룹 (이름 포함)이 서버에 게시되는 것과 관련이 없기 때문에 작동합니다.


-1

시험:

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

또는

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

더 구체적으로:

확인란 배열에서 데이터를 읽을 때 배열에 다음이 있는지 확인하십시오.

len>0 

이 경우 :

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

답을 좀 더 자세히 설명해 주시겠습니까?
20

확인란 배열에서 데이터를 읽을 때 다음과 같은 경우 배열이 len> 0인지 확인하십시오. len (self.request.get ( 'array', allow_multiple = True))> 0
Gjison Giocf

위의 의견에있는 정보를 사용하여 질문을 편집하십시오. 공감대를 기꺼이 제거하겠습니다.
스물

게시물을 수정 해 주셔서 감사하지만 조금 더 예의가 좋습니다.
스물

질문과는 전혀 관련이없는 것 같습니다. html 유효성 검사를 요구하고 있으며 해결책은 python입니다. 질문은 서버 측 유효성 검사에 대해 묻지 않고 확인란 그룹을 유효성 검사하여 적어도 1이 선택되어 있는지 확인하는 방법이 있는지 묻습니다.
Octavioamu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.