如何根据计数将显示块设置为对象

时间:2017-08-16 06:24:34

标签: javascript jquery html

我有一张预订航班表格,可以计算儿童旅客的数量。

有3 select来定义每次旅行的年龄,但我会为他们设置display:none

我编写了下面的代码,但我不知道如何根据每次为每次旅行添加一个数字来显示每个select

例如,当用户添加1个旅行时,我想显示第一个select。 2显示第二个select

我希望根据类名select的值的增量和减量来显示每个travel

我该怎么做?

这是我的代码:

  $(function() {
  $(".button-click a").on("click", function() {
    var button = $(this);
    var oldVal = parseInt(button.closest("ul").prev().val());
    var newVal = (button.text() == "+") ? oldVal+1: (oldVal > 0) ? oldVal-1 : 0;
    var total_value = "";
    
    button.closest("ul").prev().val(newVal);

    $(".travel").each(function(){
      var cat = $(this).prev('span').text();
      total_value += cat + ": " + $(this).val() + ", "; 
    });
    
    total_value = total_value.substring(0, total_value.length - 2);
    $(".main").val(total_value);
  })
})
.childs{ display:none;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<label>
Count all1 Traveller(s)
<input type="text" name="no_travellers" class="main" value="Adults: 1" placeholder="" />
</label>
<br/>
<label>
   <span>Children</span>
   <input type="text" class="travel" id="CAT_Custom_410672" name="CAT_Custom_410672"  value="0" />
   <ul class="button-group button-click">
      <li><a href="#" class="small button secondary"><i class="fa fa-plus"><span class="hide">+</span></i></a></li>
      <li><a href="#" class="small button secondary"><i class="fa fa-minus"><span class="hide">-</span></i></a></li>
   </ul>
</label>
<div class="childs">
   <label>Child1</label>
   <select>
      <option value="1">1</option>
      <option value="2">2</option>
   </select>
</div>
<div class="childs">
   <label>Child2</label>
   <select>
      <option value="1">1</option>
      <option value="2">2</option>
   </select>
</div>

1 个答案:

答案 0 :(得分:1)

以下是许多可能的方法之一。基本上你想要的是:

  1. 创建一个通用函数,可以在子项数增加时为子下拉列表生成必要的标记。我们称之为createChildDropdown(i)

    • 此函数将接收索引(新的子计数),以便我们可以生成具有唯一ID的唯一字段
  2. 创建一个通用函数,可以在子项数减少时删除生成的子项下拉列表。我们称之为destroyChildDropdown($el, i)

    • 此函数将再次接收索引(新的子计数),以便我们可以删除正确的子项下拉列表
    • 它还接收一个jQuery选择器,因此它知道从哪个元素中删除
    • 中的子下拉列表
  3. 现在我们已经掌握了逻辑,我们只需检查newValoldVal,了解子项数是否增加,并调用正确的函数。假设我们创建了一个名为<div class="childDropdowns">的新元素来保存所有下拉列表,我们可以这样做:

    if (oldVal < newVal) {
      $('.childDropdowns').append(createChildDropdown(newVal));
    } else if (oldVal > newVal) {
      destroyChildDropdown($('.childDropdowns'), newVal);
    }
    

    $(function() {
    
      // Function to create child dropdown
      var createChildDropdown = function(i) {
      
        // Create a div in the following format:
        // <div class="childs">
        //    <label for="...">Child (number)</label>
        //    <select id="..."></select>
        // </div>
        var $childDropdown = $('<div />', {
          'class': 'childs'
        });
        $childDropdown.append($('<label />', {
          'for': 'childDropdown-' + i
        }).text('Child ' + i));
        $childDropdown.append($('<select />', {
          'id': 'childDropdown-' + i
        }));
        
        // Define options made available for each child
        var options = ['a', 'b', 'c'];
        options.forEach(function(option) {
          // Create new option element and append to <select>
          $childDropdown.find('select').append($('<option />').text(option).attr('value', option));
        });
        
        // Return documentFragment so that we can append it
        return $childDropdown;
      };
      
      // Function to destroy child dropdown
      var destroyChildDropdown = function($el, i) {
        $el.find('div.childs').get(i).remove();
      };
    
      $(".button-click a").on("click", function() {
        var button = $(this);
        var oldVal = parseInt(button.closest("ul").prev().val());
        var newVal = (button.text() == "+") ? oldVal + 1 : (oldVal > 0) ? oldVal - 1 : 0;
        var total_value = "";
    
        button.closest("ul").prev().val(newVal);
    
        $(".travel").each(function() {
          var cat = $(this).prev('span').text();
          total_value += cat + ": " + $(this).val() + ", ";
        });
    
        if (oldVal < newVal) {
          $('.childDropdowns').append(createChildDropdown(newVal));
        } else if (oldVal > newVal) {
          destroyChildDropdown($('.childDropdowns'), newVal);
        }
    
        total_value = total_value.substring(0, total_value.length - 2);
        $(".main").val(total_value);
      })
    })
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <label>
    Count all1 Traveller(s)
    <input type="text" name="no_travellers" class="main" value="Adults: 1" placeholder="" />
    </label>
    <br/>
    <label>
       <span>Children</span>
       <input type="text" class="travel" id="CAT_Custom_410672" name="CAT_Custom_410672"  value="0" />
       <ul class="button-group button-click">
          <li><a href="#" class="small button secondary"><i class="fa fa-plus"><span class="hide">+</span></i></a></li>
          <li><a href="#" class="small button secondary"><i class="fa fa-minus"><span class="hide">-</span></i></a></li>
       </ul>
    </label>
    <div class="childDropdowns"></div>