Как показать скрытие элемента, который был выбран с ближайшим и найти метод в JQuery? - PullRequest
0 голосов
/ 13 февраля 2019

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

$(document).on('click', '.dc-checkbox', setCheckboxVal);

function setCheckboxVal() {
  var fldCheckbox = $(this);
  var fldComment = $(this).closest('div').find('.dc-comment');
  console.log(fldComment);

  if (fldCheckbox.is(':checked')) {
    fldCheckbox.val(1);
    fldComment.show();

  } else {
    fldCheckbox.val(0);
    fldComment.hide();
  }
}
.dc-comment {
  display: none;
}
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>

<form id="myfrm" method="post">
  <div class="checkbox">
    <label for="checkbox1">
      <input type="checkbox" name="dc_status1" id="dc_status1" class="dc-checkbox"> Checkbox 1</label>
  </div>
  <div class="form-group dc-comment">
    <label for="comment1" class="pull-left">Comment:</label>
    <textarea class="form-control" rows="2" name="dc_comment1" id="dc_comment1"></textarea> </div>
  <div class="checkbox">
    <label for="checkbox2"><input type="checkbox" name="dc_status2" id="dc_status2" class="dc-checkbox" value="1"> Checkbox 2</label>
  </div>
  <div class="form-group dc-comment">
    <label for="comment2" class="pull-left">Comment:</label>
    <textarea class="form-control" rows="2" name="dc_comment2" id="dc_comment2"></textarea>
  </div>
  <div class="checkbox">
    <label for="checkbox4"><input type="checkbox" name="dc_status4" id="dc_status4" class="dc-checkbox"> Checkbox 3</label>
  </div>
  <div class="form-group dc-comment">
    <label for="comment4" class="pull-left">Comment:</label>
    <textarea class="form-control" rows="2" name="dc_comment4" id="dc_comment4"></textarea>
  </div>
</form>

Как вы можете видеть, если я отмечаю чекбокс, комментарий textarea все еще не отображается.Я не уверен, являются ли .closest() и .find() методами, которые поддерживают показ / скрытие в этом случае.Пожалуйста, дайте мне знать, если вы знаете способ достижения этого.Спасибо.

1 Ответ

0 голосов
/ 13 февраля 2019

$(this).closest('div') находит первый родительский div, в данном случае тот, у которого класс checkbox - .find(..), затем ищет в этом div'е children .Так как div class=checkbox div не имеет div class=dc-comment в качестве дочернего элемента, он не находит его.

.dc-comment - это брат (тот же уровень / тот же родитель), что и .checkbox.

Изменить на .next() или .nextAll(".dc-comment").first()

Не использовать .next(".dc-comment") если вы не знаете, что он делает, поскольку он может сломаться (получает следующее, только если оно совпадает, а не следующее, которое совпадает).

Обновленный фрагмент:

$(document).on('click', '.dc-checkbox', setCheckboxVal);

function setCheckboxVal() {
  var fldCheckbox = $(this);
  var fldComment = $(this).closest('div').nextAll('.dc-comment').first();
  //console.log(fldComment);

  if (fldCheckbox.is(':checked')) {
    fldCheckbox.val(1);
    fldComment.show();
  } else {
    fldCheckbox.val(0);
    fldComment.hide();
  }
}
.dc-comment {
  display: none;
}
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>

<form id="myfrm" method="post">
  <div class="checkbox">
    <label for="checkbox1">
      <input type="checkbox" name="dc_status1" id="dc_status1" class="dc-checkbox"> Checkbox 1</label>
  </div>
  <div class="form-group dc-comment">
    <label for="comment1" class="pull-left">Comment:</label>
    <textarea class="form-control" rows="2" name="dc_comment1" id="dc_comment1"></textarea> </div>
  <div class="checkbox">
    <label for="checkbox2"><input type="checkbox" name="dc_status2" id="dc_status2" class="dc-checkbox" value="1"> Checkbox 2</label>
  </div>
  <div class="form-group dc-comment">
    <label for="comment2" class="pull-left">Comment:</label>
    <textarea class="form-control" rows="2" name="dc_comment2" id="dc_comment2"></textarea>
  </div>
  <div class="checkbox">
    <label for="checkbox4"><input type="checkbox" name="dc_status4" id="dc_status4" class="dc-checkbox"> Checkbox 3</label>
  </div>
  <div class="form-group dc-comment">
    <label for="comment4" class="pull-left">Comment:</label>
    <textarea class="form-control" rows="2" name="dc_comment4" id="dc_comment4"></textarea>
  </div>
</form>
...