【问题标题】:Dynamic form select input Calculations not working properly with div动态表单选择输入计算无法与 div 一起正常工作
【发布时间】:2019-08-26 17:31:29
【问题描述】:

在 div 中包含一些由选项控制的选择输入,并且在这些选择选项中还有数据值。 隐藏和显示 div 工作正常,但有一个非常奇怪的问题,即当我选择第一个选项时,它显示所有选择选项的计算。但是当我删除选择输入周围的所有 div 时,它可以按我的意愿完美运行。

$('body').on('change', '#visitorcount', function() {
  for (var i = 1; i <= 5; i++) {
    if (i <= $('#visitorcount').val()) {
      $('#person' + i).show();
      $('#country' + i).show();
    } else {
      $('#person' + i).hide();
      $('#country' + i).hide();
    }
  }
});
$('body').on('change', '.ct,#visitorcount', function() {
  var priceforcountry = 0;
  $('.ct').each(function(index, element) {
    if ($(element).parent().css("display") != "none") {
      priceforcountry += +$('option:selected', this).data('fee');
    }
  });
  $('#totalcost').text(priceforcountry);
  //alert(priceforcountry);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="form-group" id="person1">
  <div class="col-sm-4 control-label">Citizenship</div>
  <div class="col-sm-8" id="person1">
    <select class="form-control ct" id="country1" name="visitor1">

      <option value="india" data-fee="20">India</option>
      <option value="usa" data-fee="25">USA</option>


    </select>
    <div class="error-message"></div>
  </div>
</div>

<select id="visitorcount" name="visitorcount">
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
  <option value="4">4</option>
  <option value="5">5</option>
</select>


<div class="row visitor" id="person2" style="display: none;">
  <div class="col-md-7">
    <div class="form-horizontal">
      <div class="form-group">
        <div class="col-sm-4 control-label">Citizenship</div>
        <div class="col-sm-8">
          <select name="visitor[2][country]" class="form-control ct" id="country2">
            <option value="india" data-fee="20">India</option>
            <option value="usa" data-fee="25">USA</option>


          </select>

        </div>
      </div>

    </div>
  </div>
</div>




<div class="row visitor" id="person3" style="display: none;">
  <div class="col-md-7">
    <div class="form-horizontal">

      <div class="form-group">
        <div class="col-sm-4 control-label" data-xtr-key="Citizenship">Citizenship</div>
        <div class="col-sm-8">
          <select name="person[3][country]" class="form-control ct" id="country3" style="display:none">
            <option value="india" data-fee="20">India</option>
            <option value="usa" data-fee="25">USA</option>

          </select>
          <div class="error-message"></div>
        </div>
      </div>

    </div>
  </div>
</div>



<div class="row visitor" id="person4" style="display: none;">
  <div class="col-md-7">
    <div class="form-horizontal">

      <div class="form-group">
        <div class="col-sm-4 control-label" data-xtr-key="Citizenship">Citizenship</div>
        <div class="col-sm-8">
          <select name="person[4][country]" class="form-control ct" id="country4" style="display:none">
            <option value="india" data-fee="20">India</option>
            <option value="usa" data-fee="25">USA</option>

          </select>
          <div class="error-message"></div>
        </div>
      </div>

    </div>
  </div>
</div>


<div class="row visitor" id="person5" style="display: none;">
  <div class="col-md-7">
    <div class="form-horizontal">

      <div class="form-group">
        <div class="col-sm-4 control-label" data-xtr-key="Citizenship">Citizenship</div>
        <div class="col-sm-8">
          <select name="person[4][country]" class="form-control ct" id="country5" style="display:none">
            <option value="india" data-fee="20">India</option>
            <option value="usa" data-fee="25">USA</option>

          </select>
          <div class="error-message"></div>
        </div>
      </div>

    </div>
  </div>
</div>





<div id="totalcost"></div>

当我们删除选择字段的 div 时,它可以按我的意愿工作。但我希望它像上面的示例一样,因为还有其他字段要显示。

$('body').on('change', '#visitorcount', function() {
            for (var i = 1; i <= 5; i++) {
                if (i <= $('#visitorcount').val()) {
                    $('#person' + i).show();
                    $('#country' + i).show();
                } else {
                    $('#person' + i).hide();
                    $('#country' + i).hide();
                }
            }
        });
        $('body').on('change', '.ct,#visitorcount', function() {
            var priceforcountry = 0;
            $('.ct').each(function(index, element) {
                if ($(element).parent().css("display") != "none") {
                    priceforcountry += +$('option:selected', this).data('fee');
                }
            });
            $('#totalcost').text(priceforcountry);
            //alert(priceforcountry);
        });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="form-group" id="person1">
        <div class="col-sm-4 control-label">Citizenship</div>
        <div class="col-sm-8" id="person1">
            <select class="form-control ct" id="country1" name="visitor1">

                <option value="india" data-fee="20">India</option>
                <option value="usa" data-fee="25">USA</option>


            </select>
            <div class="error-message"></div>
        </div>
    </div>

    <select id="visitorcount" name="visitorcount">
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
    </select>


    <div class="row visitor" id="person2" style="display: none;">

                        <select name="visitor[2][country]" class="form-control ct" id="country2">
                            <option value="india" data-fee="20">India</option>
                            <option value="usa" data-fee="25">USA</option>


                        </select>
                    
                    </div>
  





    <div class="row visitor" id="person3" style="display: none;">
       
                        <select name="person[3][country]" class="form-control ct" id="country3" style="display:none">
                            <option value="india" data-fee="20">India</option>
                            <option value="usa" data-fee="25">USA</option>

                        </select>
                        <div class="error-message"></div>
                    </div>


    
    
    <div class="row visitor" id="person4" style="display: none;">
                        <select name="person[4][country]" class="form-control ct" id="country4" style="display:none">
                            <option value="india" data-fee="20">India</option>
                            <option value="usa" data-fee="25">USA</option>

                        </select>
                        <div class="error-message"></div>
                    </div>

    
    
    <div class="row visitor" id="person5" style="display: none;">
                        <select name="person[5][country]" class="form-control ct" id="country5" style="display:none">
                            <option value="india" data-fee="20">India</option>
                            <option value="usa" data-fee="25">USA</option>

                        </select>
                        <div class="error-message"></div>
                    </div>
               




    <div id="totalcost"></div>

第一个代码 sn-p 有什么问题。为什么 div 会导致这个问题?

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    不用找css显示,直接用$(element).is(':visible')就好了

    $('body').on('change', '#visitorcount', function() {
      var val = $('#country1').val();
      for (var i = 1; i <= 5; i++) {
        if (i <= $('#visitorcount').val()) {
          $(`#person${i}`).show();
          //Check to see if this is visible, if not
          //Set the default value and show it.
          if(!$(`#country${i}`).is(':visible')){
            $(`#country${i}`).val(val).show();
          }
        } else {
          $(`#person${i}`).hide();
          $(`#country${i}`).hide();
        }
      }
    });
    $('body').on('change', '.ct,#visitorcount', function() {
      var priceforcountry = 0;
      $('.ct').each(function(index, element) {
        if ($(element).is(':visible')) {
          priceforcountry += +$('option:selected', this).data('fee');
        }
      });
      $('#totalcost').text(priceforcountry);
      //alert(priceforcountry);
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class="form-group" id="person1">
      <div class="col-sm-4 control-label">Citizenship</div>
      <div class="col-sm-8" id="person1">
        <select class="form-control ct" id="country1" name="visitor1">
    
          <option value="india" data-fee="20">India</option>
          <option value="usa" data-fee="25">USA</option>
    
    
        </select>
        <div class="error-message"></div>
      </div>
    </div>
    
    <select id="visitorcount" name="visitorcount">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
      <option value="5">5</option>
    </select>
    
    
    <div class="row visitor" id="person2" style="display: none;">
      <div class="col-md-7">
        <div class="form-horizontal">
          <div class="form-group">
            <div class="col-sm-4 control-label">Citizenship</div>
            <div class="col-sm-8">
              <select name="visitor[2][country]" class="form-control ct" id="country2">
                <option value="india" data-fee="20">India</option>
                <option value="usa" data-fee="25">USA</option>
    
    
              </select>
    
            </div>
          </div>
    
        </div>
      </div>
    </div>
    
    
    
    
    <div class="row visitor" id="person3" style="display: none;">
      <div class="col-md-7">
        <div class="form-horizontal">
    
          <div class="form-group">
            <div class="col-sm-4 control-label" data-xtr-key="Citizenship">Citizenship</div>
            <div class="col-sm-8">
              <select name="person[3][country]" class="form-control ct" id="country3" style="display:none">
                <option value="india" data-fee="20">India</option>
                <option value="usa" data-fee="25">USA</option>
    
              </select>
              <div class="error-message"></div>
            </div>
          </div>
    
        </div>
      </div>
    </div>
    
    
    
    <div class="row visitor" id="person4" style="display: none;">
      <div class="col-md-7">
        <div class="form-horizontal">
    
          <div class="form-group">
            <div class="col-sm-4 control-label" data-xtr-key="Citizenship">Citizenship</div>
            <div class="col-sm-8">
              <select name="person[4][country]" class="form-control ct" id="country4" style="display:none">
                <option value="india" data-fee="20">India</option>
                <option value="usa" data-fee="25">USA</option>
    
              </select>
              <div class="error-message"></div>
            </div>
          </div>
    
        </div>
      </div>
    </div>
    
    
    <div class="row visitor" id="person5" style="display: none;">
      <div class="col-md-7">
        <div class="form-horizontal">
    
          <div class="form-group">
            <div class="col-sm-4 control-label" data-xtr-key="Citizenship">Citizenship</div>
            <div class="col-sm-8">
              <select name="person[4][country]" class="form-control ct" id="country5" style="display:none">
                <option value="india" data-fee="20">India</option>
                <option value="usa" data-fee="25">USA</option>
    
              </select>
              <div class="error-message"></div>
            </div>
          </div>
    
        </div>
      </div>
    </div>
    
    
    
    
    
    <div id="totalcost"></div>

    【讨论】:

    • 如果你能帮忙,我还有一个问题是,我想要的是,如果我在第一个选择框中选择一个选项,当我点击访客数量时,其他选择框应该有相同的选项默认选择。
    • 我更新了我的示例以执行您所要求的操作,如果项目不可见,它将显示它并将值设置为与第一个相同。可见项目将保持不变
    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 2016-11-27
    • 2015-08-24
    • 2019-08-22
    • 2018-05-22
    • 2013-07-12
    • 2022-11-15
    • 2021-11-29
    相关资源
    最近更新 更多