Показать / скрыть поля в зависимости от выбранного значения - PullRequest
13 голосов
/ 07 мая 2009

Я пытаюсь показать и скрыть несколько полей формы в зависимости от значения одного из моих выбранных полей. Я собираюсь использовать массивы для хранения того, что должно быть показано, а что нет, для каждого значения select, чтобы спасти меня от массивного оператора switch, но я не могу понять, как это сделать.

Я использую PHP и jQuery. Любая помощь будет великолепна.

Ответы [ 6 ]

32 голосов
/ 07 мая 2009

Попробуйте что-то вроде этого:

<select id="viewSelector">
   <option value="0">-- Select a View --</option>       
   <option value="view1">view1</option>
   <option value="view2">view2</option>
   <option value="view3">view3</option>
</select>

<div id="view1">
  <!-- content --> 
</div>
<div id="view2a">
  <!-- content --> 
</div>
<div id="view2b">
  <!-- content --> 
</div>
<div id="view3">
  <!-- content --> 
</div>

затем в jQuery:

$(document).ready(function() {
  $.viewMap = {
    '0' : $([]),
    'view1' : $('#view1'),
    'view2' : $('#view2a, #view2b'),
    'view3' : $('#view3')
  };

  $('#viewSelector').change(function() {
    // hide all
    $.each($.viewMap, function() { this.hide(); });
    // show current
    $.viewMap[$(this).val()].show();
  });
});
5 голосов
/ 07 мая 2009

Есть несколько разных способов сделать это. Самое простое - иметь несколько отдельных наборов полей, каждый из которых содержит одну группу полей. Затем в jQuery, в зависимости от значения меню выбора, вы можете показать / скрыть эти наборы полей, например,

<fieldset id="f1">
    <input name="something1" />
    <input name="something2" />
    <input name="something3" />
</fieldset>
<fieldset id="f2">
    <input name="something4" />
    <input name="something5" />
    <input name="something6" />
</fieldset>
<select name="fieldset-choice">
    <option value="f1">Fieldset 1</option>
    <option value="f2">Fieldset 2</option>
</select>

<script type="text/javascript">
    jQuery('select[name=fieldset-choice]').change(function(){
        var fieldsetName = $(this).val();
        $('fieldset').hide().filter('#' + fieldsetName).show();
    });

    // We need to hide all fieldsets except the first:
    $('fieldset').hide().filter('#f1').show();
</script>

Примечание : чтобы описанная выше техника была совершенно незаметной, вы можете динамически создать меню выбора с именами всех различных наборов полей.


В качестве альтернативы вы можете поставить перед каждым именем поля значимый префикс, а затем скрыть / показать в соответствии с этим атрибутом:

<input name="group1-name1" />
<input name="group1-name2" />

<input name="group2-name3" />
<input name="group2-name4" />
<input name="group2-name5" />

<select name="field-choice">
    <option value="group1">Group 1</option>
    <option value="group2">Group 2</option>
</select>

<script type="text/javascript">
    jQuery('select[name=field-choice]').change(function(){
        var groupName = $(this).val();
        $('input').hide().filter('[name^=' + groupName + ']').show();
    });

    // We need to hide all fields except those of the first group:
    $('input').hide().filter('[name^=group1]').show();
</script>
2 голосов
/ 03 ноября 2010

Мои 2 цента: Мне нужно было показать / скрыть поля в зависимости от многих предыдущих значений выбора (не только одного).

Поэтому я добавляю родительский атрибут в поля div следующим образом:

<div id="view" parent="none">
<select class=selector id="view">
<option value="0"> -- Make a choice --</option>
<option value="s1">sub 1</option>
<option value="s2">sub 2</option>
<option value="s3">sub 3</option>
</select>
</div>

<!-- you need to define the parent value with the value of parent div id -->
<div id="s1" parent="view">
<!-- if you want to have a selector be sure it has the same id as the div -->
<select class=selector id="s1">
<option value="0">-- Make a choice --</option>
<option value="s1_sub1">sub 1 of s1</option>
<option value="s1_sub2">sub 2 of s1</option>
<option value="s1_sub3">sub 3 of s1</option>
</select>
</div>

<!-- Make the same thing for s2 and s3
Define div s2 here

Define div s3 here
-->

<!-- and finally if that's your final step you put what you want in the div -->
<div id="s1_sub1" parent="s1">
You are inside s1 sub1
</div>

Теперь код jquery:

$(document).ready(function() {

 $('select[class=selector]').change(function() { 
    //next div to show
    var selectorActive = $(this).val();
    //div where you are 
    var parentValue = $(this).attr("id");

   //show active div and hide others
    $('div').hide().filter('#' + selectorActive).show();

    while (parentValue!="none") {
      //then show parents of active div
      $('div[id=' + parentValue + ']').show();
      //return the parent of div until "none"
      parentValue = $('div[id=' + parentValue + ']').attr("parent");
     }

 });

// print only the first div at start
 $('div').hide().filter("#view").show();

});

Это работает как шарм, и вам не нужно определять карты

Надеюсь, это поможет

2 голосов
/ 20 августа 2009

Чтобы запустить код при загрузке, просто добавьте .change (). Как показано ниже ...

$(document).ready(function() {
  $.viewMap = {
    '0' : $([]),
    'view1' : $('#view1'),
    'view2' : $('#view2a, #view2b'),
    'view3' : $('#view3')
  };

  $('#viewSelector').change(function() {
    // hide all
    $.each($.viewMap, function() { this.hide(); });
    // show current
    $.viewMap[$(this).val()].show();
  }).change();
});
0 голосов
/ 20 июня 2019

Вот очень простой пример:

Цель - показать ПРОСТОЙ ПРИМЕР того, как использовать массив значений для отображения / скрытия полей в зависимости от значения выбора.

В этой демонстрации я мог бы использовать classNames для одновременного показа / скрытия группы полей - но это не является целью примера - поэтому использовались только classNames для CSS.

Поскольку демонстрационная версия использует идентификаторы (с двумя массивами этих идентификаторов) для демонстрационной версии, не имеет значения, являются ли скрытые поля input полями, divs, imgs или что есть у тебя. Идентификатор идентифицирует то, что должно быть скрыто.

var aPeople = ['bob','sam','ted'];
var aTransport = ['car','bike','truck'];

$('#mySel').change(function(){
   $('.alldiv').hide(); //Hide them all to start...
   let sel = $(this).val(); //Get selected option value
   if ( sel=='ppl' ){
      for (let i=0; i<aPeople.length;i++){
         $('#' + aPeople[i]).show();
      }
   }else if ( sel=='tpt' ){
      for (let i=0; i<aTransport.length;i++){
         $('#' + aTransport[i]).show();
      }
   }else{
      //Choose selected
      $('.alldiv').show();
   }
});
.alldiv{width:30vw;height:10vh;padding:2vh 2vw;text-align:center;}
.ppl{background:palegreen;}
.tpt{background:wheat;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

<select id="mySel">
  <option value="">Choose:</option>
  <option value="ppl">People</option>
  <option value="tpt">Vehicles</option>
</select>

<div id="bob" class="alldiv ppl">People: Bob</div>
<div id="car" class="alldiv tpt">Vehicle: Car</div>
<div id="truck" class="alldiv tpt">Vehicle: Truck</div>
<div id="sam" class="alldiv ppl">People: Sam</div>
<div id="ted" class="alldiv ppl">People: Ted</div>
<div id="bike" class="alldiv tpt">Vehicle: Bike</div>
0 голосов
/ 08 апреля 2010

@ Martin Попробуйте это

`$('#viewSelector').trigger('change');`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...