jQuery показывает, что прародитель ближайшего элемента не работает

#javascript #jquery #html

#javascript #jquery #HTML

Вопрос:

У меня есть некоторый HTML ниже (сгенерированный с использованием CakePHP):

Я пытаюсь показать элемент прародителя ближайшего элемента, на который был нажат:

 $('.what_is_the_quote_for').closest('.form-group').hide();

$('.visit_status').change(function() {
    if ($(this).val() == '2') {
        $(this).closest('.what_is_the_quote_for').parent().parent().show();
    }
});
  

Я не уверен, что правильно использую здесь метод closest(), поскольку я читал, что он поднимается по дереву DOM, тогда как в этом случае элемент, к которому я пытаюсь добраться, находится ниже элемента, с которого он начинается. Есть ли какой-нибудь способ добиться этого?

Сгенерированный ниже HTML находится в цикле, поэтому его будет много экземпляров, поэтому я не могу просто получить доступ по идентификатору, поэтому причина, по которой я использую this.closest()

 <div class="form-group">
    <label for="Visit0VisitStatus" class="col-md-4 control-label">Visit Status</label>
    <div class="col-md-8">
        <select name="data[Visit][0][visit_status]" class="visit_status select2-hidden-accessible" id="Visit0VisitStatus" tabindex="-1" aria-hidden="true">
            <option value="0">Complete</option>
            <option value="1">In Progress</option>
            <option value="2" selected="selected">First visit complete – quote to be submitted</option>
            <option value="3">First visit complete – parts required</option>
            <option value="4">Further visit required</option>
            <option value="5">Attended – passed back to Diamond</option>
            </select>
        <span class="select2 select2-container select2-container--bootstrap select2-container--focus" dir="ltr" style="width: auto;">
            <span class="selection">
            <span class="select2-selection select2-selection--single" role="combobox" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-labelledby="select2-Visit0VisitStatus-container"><span class="select2-selection__rendered" id="select2-Visit0VisitStatus-container" title="First visit complete – quote to be submitted">First visit complete – quote to be submitted</span><span class="select2-selection__arrow" role="presentation"><b role="presentation">
            </b></span>
        </span>
        </span>
        <span class="dropdown-wrapper" aria-hidden="true"></span>
        </span>
    </div>
</div>



<div class="form-group" style="display: none;">
    <label for="Visit0WhatIsTheQuoteFor" class="col-md-4 control-label">What Is The Quote For</label>
    <div class="col-md-8">
        <textarea name="data[Visit][0][what_is_the_quote_for]" class="form-control what_is_the_quote_for" cols="30" rows="6" id="Visit0WhatIsTheQuoteFor"></textarea>
    </div>
</div>
  

Комментарии:

1. Кажется, вам нужно $(this).closest('.form-group').next('.form-group').show();

2. Или $(this).closest('.form-group').next().show(); jsfiddle.net/ermakovnikolay/vod7fhvs

Ответ №1:

what_is_the_quote_for является родительским / предком visit_status элемента, поэтому ваш код не работает.

Вам нужно пройти, чтобы form-group затем настроить таргетинг на его следующего form-group собрата, после чего можно выполнить желаемую операцию.

  $(this).closest('.form-group').next('.form-group').show()
  

 jQuery(function($) {
  $('.what_is_the_quote_for').closest('.form-group').hide();

  $('.visit_status').change(function() {
    if ($(this).val() == 2) {
      $(this).closest('.form-group').next('.form-group').show()
    }
  });
});  
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="form-group">
  <label for="Visit0VisitStatus" class="col-md-4 control-label">Visit Status</label>
  <div class="col-md-8">
    <select name="data[Visit][0][visit_status]" class="visit_status select2-hidden-accessible" id="Visit0VisitStatus" tabindex="-1" aria-hidden="true">
      <option value="0" selected>Complete</option>
      <option value="1">In Progress</option>
      <option value="2">First visit complete – quote to be submitted</option>
      <option value="3">First visit complete – parts required</option>
      <option value="4">Further visit required</option>
      <option value="5">Attended – passed back to Diamond</option>
    </select>
    <span class="select2 select2-container select2-container--bootstrap select2-container--focus" dir="ltr" style="width: auto;">
            <span class="selection">
            <span class="select2-selection select2-selection--single" role="combobox" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-labelledby="select2-Visit0VisitStatus-container"><span class="select2-selection__rendered" id="select2-Visit0VisitStatus-container" title="First visit complete – quote to be submitted">First visit complete – quote to be submitted</span>
    <span class="select2-selection__arrow" role="presentation"><b role="presentation">
            </b>
      </span>
    </span>
    </span>
    <span class="dropdown-wrapper" aria-hidden="true"></span>
    </span>
  </div>
</div>



<div class="form-group" style="display: none;">
  <label for="Visit0WhatIsTheQuoteFor" class="col-md-4 control-label">What Is The Quote For</label>
  <div class="col-md-8">
    <textarea name="data[Visit][0][what_is_the_quote_for]" class="form-control what_is_the_quote_for" cols="30" rows="6" id="Visit0WhatIsTheQuoteFor"></textarea>
  </div>
</div>  

Комментарии:

1. Что, если бы я хотел показать 4 .form-group -го родного брата?

2. Могу ли я использовать eq with next() ? Так нравится .next('.form-group').eq(3) ?

3. @user3574492 .nextAll('.form-group').eq(3)