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.