HTML의 3 상태 확인란?


163

HTML에서 3 단계 상태 확인 버튼 (예, 아니오, null)을 가질 수있는 방법이 없습니다.

혼자서 전체를 렌더링하지 않고도 간단한 트릭이나 해결 방법이 있습니까?


기능상 사용에서 '아니오'와 '널'의 차이점은 무엇입니까?
— 데이비드는

5
아래 답변을 확인하십시오 (내 제외). "널"은 "답변 없음"과 같은 것을 의미합니다.
— Franz

2
바로 그거죠. 조상이있는 항목이며 "null"은 "부모 값 사용"을 의미합니다.
— Pekka

7
3 상태 확인란의 다른 사용법은 검색 / 필터링입니다. 예를 들어 중고차 목록을 검색하는 인터페이스가 있다고 가정 해 봅시다. 검색 옵션 중 하나는 차에 선 루프가 있는지 여부입니다. 세 가지 상태는 다음과 같이 사용할 수 있습니다. 선 루프가있는 자동차 만 표시 선 루프가있는 자동차 만 표시 둘 다 표시 여러 가지 방법으로 처리 할 수 ​​있습니다. 우리는 드롭 다운 또는 세트를 사용할 수 있습니다 세 개의 라디오 버튼 중 ...하지만 3 상태 확인란 (비어 있거나 녹색 확인 표시가 있거나 빨간색 x가 있음)도 좋은 해결책입니다.
— Mir

2
확인란의 목록에 유용하며 나머지는 모든 확인란을 선택하거나 선택 취소하는 목록 머리글에 하나의 확인란이 있습니다. 모두 선택하면 헤더 확인란에 해당 내용이 반영 될 수 있습니다. 모두 체크하지 않으면 헤더 체크 박스도이를 반영 할 수 있습니다. 목록에 선택 상자와 선택하지 않은 상자의 조합이 포함 된 경우 중간 상태로 머리글 확인란을 표시하면 시각적 피드백이 제공됩니다. 그 헤더 체크 박스는 결코 가치를 가지지 않을 것입니다-시각적 신호와 UI 보조 일뿐입니다. 세 가지 상태 사이에서 헤드 확인란을 전환 할 수 있으면 편리합니다.
— Jason

답변:


119

편집 — Janus Troelsen의 의견 덕분에 더 나은 해결책을 찾았습니다.

HTML5는이라는 확인란의 속성을 정의합니다. indeterminate

w3c 참조 안내서를 참조하십시오 . 확인란이 시각적으로 부정확하게 표시되도록하려면 true로 설정하십시오.

element.indeterminate = true;

여기 Janus Troelsen의 바이올린이 있습니다. 그러나 다음 사항에 유의하십시오.

  • indeterminate상태가 HTML 태그를 설정할 수 없습니다, 단지 (이 참조 자바 스크립트를 통해 수행 할 수 있습니다 JSfiddle 시험 이 CSS 트릭에 자세한 기사 )

  • 이 상태는 확인란의 값을 변경하지 않으며 입력의 실제 상태를 숨기는 시각적 신호일뿐입니다.

  • 브라우저 테스트 : Chrome 22, Firefox 15, Opera 12에서 IE7로 돌아 왔습니다. 모바일 브라우저와 관련하여 iOS 3.1의 Android 2.0 브라우저 및 Safari 모바일은이를 지원하지 않습니다.

이전 답변

또 다른 대안은 "일부 선택된"상태에 대해 확인란 투명도를 사용하는 것입니다 (Gmail 이 이전 버전에서 사용했듯이). 자바 스크립트와 CSS 클래스가 필요합니다. 여기에 확인 가능한 항목이있는 목록을 처리하는 특정 예제와 해당 항목을 모두 / 없음을 선택할 수있는 확인란이 있습니다. 이 확인란은 일부 목록 항목이 선택된 경우 "일부 선택됨"상태를 표시합니다.

ID #select_all가있는 확인란과 클래스가있는 여러 확인란이 있다면 .select_one,

"모두 선택"체크 상자를 흐리게하는 CSS 클래스는 다음과 같습니다.

.some_selected {
    opacity: 0.5;
    filter: alpha(opacity=50);
}

그리고 모두 선택 확인란의 3 가지 상태를 처리하는 JS 코드는 다음과 같습니다.

$('#select_all').change (function ()
{
    //Check/uncheck all the list's checkboxes
    $('.select_one').attr('checked', $(this).is(':checked'));
    //Remove the faded state
    $(this).removeClass('some_selected');
});

$('.select_one').change (function ()
{
  if ($('.select_one:checked').length == 0)
      $('#select_all').removeClass('some_selected').attr('checked', false);
  else if ($('.select_one:not(:checked)').length == 0)
      $('#select_all').removeClass('some_selected').attr('checked', true);
  else
      $('#select_all').addClass('some_selected').attr('checked', true);
});

여기에서 시도해 볼 수 있습니다 : http://jsfiddle.net/98BMK/

희망이 도움이됩니다!



1
크롬 v35에서 테스트되었으며 "모두"확인란은 처음 클릭 할 때만 다른 상자 만 확인합니다. 그런 다음 다른 확인란의 선택을 취소하는 것만 작동합니다. 이 버전에서 수정 : jsfiddle.net/CHRSb/1
— rdans

2
.prop('checked', ...)대신에 사용해야합니다 .attr('checked', ...).
— Luna

Ross가 지적한 버그를 수정했습니다. 여기에 새로운 바이올린 .
— Mike DeSimone

48

요소 에 HTML의 indeterminateIDL 속성 을 사용할 수 있습니다 input.


3
Bert Bos에 따르면 2002 년 이메일에서 (< list.w3.org/Archives/Public/www-dom/2002JanMar/0014.html> )에 따르면 IE / Win 및 IE / Mac은 버전 4부터 지원했습니다. 버전 3.6에서 구현했습니다. 2008 년 Safari에서도 구현 된 것으로 보입니다. 최종 사용자는 많지 않습니다.
— Ms2ger

이 URL을 사용하십시오 (대신 help.dottoro.com/ljuocesd.php )을 사용하십시오. 그것은 언제부터 그것을 지원하는 사람 (모두 바 오페라)을 보여주고 그것이 무엇인지 시각적으로 표시합니다. 사람들은 사양 페이지가 무섭습니다. 이 플러그인이 아닌 솔루션에 +1
— Hashbrown

15

내 제안은

  • 3 가지 상태에 적합한 3 가지 유니 코드 문자 (예 : ❓, ✅, ❌)
  • 일반 텍스트 입력 필드 (size = 1)
  • 국경이 없다
  • 읽기 전용
  • 커서를 표시하지 않습니다
  • onclick 핸들러는 세 가지 상태를 통해 전환

다음의 예를 참조하십시오.

/**
 *  loops thru the given 3 values for the given control
 */
function tristate(control, value1, value2, value3) {
  switch (control.value.charAt(0)) {
    case value1:
      control.value = value2;
    break;
    case value2:
      control.value = value3;
    break;
    case value3:
      control.value = value1;
    break;
    default:
      // display the current value if it's unexpected
      alert(control.value);
  }
}
function tristate_Marks(control) {
  tristate(control,'\u2753', '\u2705', '\u274C');
}
function tristate_Circles(control) {
  tristate(control,'\u25EF', '\u25CE', '\u25C9');
}
function tristate_Ballot(control) {
  tristate(control,'\u2610', '\u2611', '\u2612');
}
function tristate_Check(control) {
  tristate(control,'\u25A1', '\u2754', '\u2714');
}
<input type='text' 
       style='border: none;' 
       onfocus='this.blur()' 
       readonly='true' 
       size='1' 
       value='&#x2753;' onclick='tristate_Marks(this)' />

<input style="border: none;"
       id="tristate" 
       type="text"  
       readonly="true" 
       size="1" 
       value="&#x2753;"  
       onclick="switch(this.form.tristate.value.charAt(0)) { 
     case '&#x2753': this.form.tristate.value='&#x2705;'; break;  
     case '&#x2705': this.form.tristate.value='&#x274C;'; break; 
     case '&#x274C': this.form.tristate.value='&#x2753;'; break; 
       };" />  



3

라디오 그룹을 사용하여 해당 기능을 수행 할 수 있습니다.

<input type="radio" name="choice" value="yes" />Yes
<input type="radio" name="choice" value="No" />No
<input type="radio" name="choice" value="null" />null

1
알아요, 고마워요 :) 현재 선택을 사용하고 있지만 양식이 약간 복잡해졌습니다.
— 페카

1
그렇다면 제 3의 상태는 어떻습니까? 확인란이 비활성화 된 것처럼? 어떻게 트리거하고 싶습니까?
— Franz

3

나는 생각 가장 의미 론적 방법은 사용하는 readonly체크 박스의 입력이 가질 수있는 속성을. CSS 없음, 이미지 없음 등; 내장 HTML 속성!

피들 참조 :
http://jsfiddle.net/chriscoyier/mGg85/2/

마지막 트릭에 설명 된대로 : http://css-tricks.com/indeterminate-checkboxes/


좋은 해결책이지만 슬프게도 더 빠른 클릭이 더 이상 인식되지 않기 때문에 IE (버전 11 테스트)에서는 작동하지 않습니다.
— ViRuSTriNiTy

3

언급 된 indeterminate속성을 사용하는 실행 가능한 예제는 다음과 같습니다 .

const indeterminates = document.getElementsByClassName('indeterminate');
indeterminates['0'].indeterminate  = true;
<form>
  <div>
    <input type="checkbox" checked="checked" />True
  </div>
  <div>
    <input type="checkbox" />False
  </div>
  <div>
    <input type="checkbox" class="indeterminate" />Indeterminate
  </div>
</form>

코드 스 니펫을 실행하여 모양을 확인하십시오.


2

@Franz 답변과 마찬가지로 선택으로 수행 할 수도 있습니다. 예를 들면 다음과 같습니다.

<select>
  <option></option>
  <option value="Yes">Yes</option>
  <option value="No">No</option>
</select>

이것으로 당신은 또한 양식과 함께 보내질 구체적인 가치를 줄 수 있습니다, 나는 자바 스크립트의 결정되지 않은 버전의 확인란을 사용하면 확인란의 밑줄 값을 보낼 것이라고 생각합니다.

적어도 자바 스크립트가 비활성화되어 있으면 콜백으로 사용할 수 있습니다. 예를 들어, ID를 지정하고로드 이벤트에서 확인되지 않은 상태의 확인란의 Javascript 버전으로 변경하십시오.


2

위에서 언급 한 모든 것 외에도 다음과 같은 jQuery 플러그인이 있습니다.

개별 확인란의 경우 :

트리와 같은 동작 확인란의 경우 :

편집 두 라이브러리 모두 ' 불확정 '체크 박스 속성을 사용합니다 .Html5 의이 속성은 스타일 지정을위한 것이므로 ( https://www.w3.org/TR/2011/WD-html5-20110113/number-state.html#checkbox-state )에서 null 값은 서버로 전송되지 않습니다 (체크 박스는 두 개의 값만 가질 수 있음).

이 값을 서버에 제출할 수 있도록 일부 자바 스크립트를 사용하여 양식 제출시 채워지는 숨겨진 대응 필드를 작성했습니다. 서버 쪽에서는 물론 원래 확인란 대신 해당 필드를 확인해야합니다.

첫 번째 라이브러리 (독립 실행 형 확인란)를 사용하여 중요한 부분을 수행했습니다.

  • 확인, 확인되지 않은 불확실한 값을 초기화하십시오.
  • .val () 함수를 사용하여 실제 값을 얻습니다.
  • .state 작업을 할 수 없습니다 (아마 나의 실수)

희망이 도움이됩니다.


2

간단한 jQuery와 속성을 가진 다른 예제 data-checked:

 $("#checkbox")
  .click(function(e) {
    var el = $(this);

    switch (el.data('checked')) {

      // unchecked, going indeterminate
      case 0:
        el.data('checked', 1);
        el.prop('indeterminate', true);
        break;

        // indeterminate, going checked
      case 1:
        el.data('checked', 2);
        el.prop('indeterminate', false);
        el.prop('checked', true);
        break;

        // checked, going unchecked
      default:
        el.data('checked', 0);
        el.prop('indeterminate', false);
        el.prop('checked', false);

    }
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label><input type="checkbox" name="checkbox" value="" checked id="checkbox"> Tri-State Checkbox </label>


1

@BoltClock 답변 참조 를 참조하면 더 복잡한 재귀 방법에 대한 솔루션이 있습니다.

http://jsfiddle.net/gx7so2tq/2/

가장 예쁜 해결책은 아니지만 나에게 잘 작동하며 매우 유연합니다.

컨테이너를 정의하는 두 개의 데이터 객체를 사용합니다.

data-select-all="chapter1"

그리고 요소 자체 :

data-select-some="chapter1"

둘 다 같은 값을가집니다. 하나의 확인란 내에 두 데이터 개체를 조합하면 하위 수준을 재귀 적으로 스캔 할 수 있습니다. 따라서 변경 트리거를 방지하려면 두 개의 "도우미"기능이 필요합니다.



0

HTML 양식 요소를 비활성화 할 수 있습니다. 그렇지 않습니까? 사용자는 세 가지 상태 중 하나를 확인할 수 있습니다 (예 : 확인, 선택 해제 및 비활성화). 회색으로 표시되고 클릭 할 수 없습니다. 나에게 이것은 "널"또는 "해당 사항 없음"또는 그 세 번째 주에서 찾고있는 것과 비슷해 보입니다.


아주 좋은 생각이지만 다시 클릭 할 수 있어야합니다. 비활성화 된 확인란에서 이벤트를 시작하는 데 문제가있을 것 같습니다.
— Pekka

비활성화 된 확인란의 값을 계속 볼 수 있으며, 값이 중요하지 않은 경우 사용자에게 혼란을줍니다.
— Janus Troelsen

'널'은 질문에 대한 답변을 제공하지 않는 사용자를 나타내는 의미라고 생각합니다. 반드시 해당 질문이 해당되는 것은 아닙니다.
— bdsl


당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.