html checkbox 해제 시 text 비활성화 질문드립니다.

조회수 1431회

안녕하세요, 질문이 있어서 글을 씁니다.

아래와 같이 체크박스를 해제하면 체크박스 아래 텍스트박스를 비활성화 시키고 싶은데 어떻게 해야 하는지 궁금해서 이렇게 글을 씁니다. for문을 돌려서 체크박스가 늘어나도 각각 제어하고 싶은데 잘 안되네요.. jquery는 아예 초보라서 이렇게 질문 올립니다.

     {% for other in others %}
    <form>
          <div class="form-group" >
            <label for="name"><b>name</b></label>
            <input type="text" value={{other}} class="form-control" id="message" name="message">
          </div>
          <div class="checkbox">
            <label for="test">
              <input type="checkbox" id="checkbox" name="checkbox" checked>test
              <input type="text"  class="form-control" id="text" name="text">
            </label>
           </div>
     <button type="submit" button class="btn btn-primary">Create</button>
    </form>


<script>
$("form").submit(function () {

    var this_master = $(this);

    this_master.find('input[id="checkbox"]').change( function () {
        var checkbox_this = $(this);

        if( checkbox_this.is(":checked") == true ) {
            $('input[id="text"]').attr("disabled", false);
        } else {
            checkbox_this.prop('checked',true);
            $('input[id="text"]').attr("disabled", true);
        }
    })
</script>
  • jQuery 버전은 몇인가요? 편집요청빌런 2020.1.21 10:57
  • 그리고... $("form").submit 안에 코드를 작성한 이유가 있나요? 편집요청빌런 2020.1.21 11:07
  • 아 위에 깜빡하고 못넣었는데 submit 버튼을 만들었습니다. 다시 수정하겠습니다. jquery 버전은 3.3.1입니다. 사실 저것도 구글링으로 이것저것 찾다가 넣은거라서 작동이 잘 안되는 것 같네요.. ilalf 2020.1.21 11:27

2 답변

  • 실제 해결을 향한 접근법은 다양하겠지만 무조건 공부하셔야 하는 것은 addEventListener()toggleAttribute()입니다.

    • 체크박스를 해제하면 == "체크박스 해제"라는 "이벤트"가 터지면
    • ~ 를 비활성화하고 싶다 == ~ 를 획득하여 disabled 속성을 조작하는 작업을 하고 싶다

    제가 짜본 데모에서는 특정 마크업 형식을 강제하도록 해 보았습니다. 이 마크업 규칙을 따르는 한 아무리 많이 복붙해도 각각 독립적으로 잘 돌아갑니다. 왜냐하면 checkboxes가 몇개가 나오건 실제 이벤트 리스너 바인딩은 각각의 checkboxes[i]에 대하여 되고 있기 때문입니다. (그리고 jQuery 버전과 아무 상관없이 순수 바닐라 js로 돌아갑니다.)


    참고로... 사실은 $('form').submit()이라는 게 딴게 아니라 <form> 태그에 addEventListener('submit')를 거는 메소드인데요, 다른분이 댓글 달아주셨지만, 이 이벤트가 터지는 시점에 말씀하시는 작업을 하려고 하면 그건 너무 늦을 겁니다.

  • jQuery 1.12.4 버전으로 테스트한 글입니다.


    오지랍#1

    $("form").submit(function() {
      // 여기
    });
    

    이렇게 작성하면 여기에 해당하는 스크립트는 form 태그에 submit 이벤트가 발생해야만 실행됩니다. 따라서 여기에 이벤트 핸들러를 할당하는 스크립트가 있으면 안됩니다. (정녕 submit 버튼 클릭 후 스크립트 실행을 원하는거면 오지랍#2로 건너뛰세요.)

    보통은 다음처럼:

    <form>
      <div>
        <input type="text" id="handleMe">
      </div>
    </form>
    <script>
    $('#handleMe').click(handlerFunction);
    </script>
    

    원하는 태그 바로 아래에 스크립트가 즉시 실행되게 하거나, 아니면 다음처럼:

    <script>
    $(document).ready(function() {
      $('#handleMe').click(handlerFunction);
    });
    </script>
    <form>
      <div>
        <input type="text" id="handleMe">
      </div>
    </form>
    

    document의 DOM 생성이 끝나는 이벤트에 실행되도록 작성합니다. 이 경우 스크립트의 위치는 상관없죠.

    오지랍#2

    HTML에서 태그 속성 id는 식별자로 사용됩니다. 즉, 같은 문서 내에 단 하나만 존재할 수 있습니다.

    따라서 둘 이상의 태그를 선택하려고 한다면:

    myForm.find('input[id="checkbox"]').change(handlerFunction);
    

    이렇게 id로 검색하는 스크립트는 작성하면 안됩니다. id가 같은 태그가 있다고 해서 오류가 뙇 하고 나는것도 아니며, 스크립트도 당장은 잘 되는것처럼 보일 수 있습니다만 차후에 반드시 문제가 됩니다.

    대신 아래처럼 작성하세요:

    var elements = myForm.find('input'); // 태그로 다수 선택
    var elements = myForm.find('input[name="selectMe"]'); // 태그 + 중복 가능한 속성으로 다수 선택
    

    혹은

    <input type="text" data-select-me>
    <input type="text" data-select-me>
    <input type="text" data-select-me>
    <script>
    var elements = $('[data-select-me]'); // 사용자 정의 속성으로 다수 선택
    </script>
    

    결론

    그래서 보통 이런식으로 작성합니다:

    <form>
        <div>
            <input type="checkbox" id="chk1" name="chk1" checked data-index="1">test
            <input type="text" id="txt1" name="txt1" data-index="1">
        </div>
        <div>
            <input type="checkbox" id="chk2" name="chk2" checked data-index="2">test
            <input type="text" id="txt2" name="txt2" data-index="2">
        </div>
        <div>
            <input type="checkbox" id="chk3" name="chk3" checked data-index="3">test
            <input type="text" id="txt3" name="txt3" data-index="3">
        </div>
    </form>
    <script>
    $('input[type="checkbox"][data-index]').change(function() {
        var $this = $(this);
        var index = $this.attr('data-index'); // .data('index')로 대체 가능
        var $target = $('input[type="text"][data-index="' + index +'"]');
        $target.prop('disabled', $this.is(':checked'));
    }).change(); // change(function)으로 핸들러 할당 후 change()로 이벤트 강제 발생시킴
    </script>
    

    <b> 태그는 HTML5에서 deprecated 되었으니 font-style CSS로 처리하세요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)