如何保持 运行 总计 Bootstrap 多 select selected 项目的价值?

How to keep a running total of Bootstrap Multi-select selected item's value?

我有一个多select下拉列表和一个文本框。用户可以 select 或 deselect 列表中的任何元素。我想从列表中添加所有 selected 项目并在文本框中显示总值,当一个项目从列表中删除 selected 时,应该从列表中减去该值。但是,当用户 deselect 一个项目时,我不知道如何从 totalPrice 中减去该值。

<input id="txtPrice" type="text" value="" class="form-control" />

<select id="DDLSkills" multiple name="selValue" class="selectpicker form-control" data-max-options="2">
    <option value="10">Ten</option>
    <option value="2">Two</option>
    <option value="4">Four</option>
</select>

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.7.5/css/bootstrap-select.min.css">

目前我可以添加所有值并将其显示在文本框中。但是当我有两个项目 selected 并且当我 deselect 一个项目时 totalPrice 值仍然上升。

<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.4/js/bootstrap-select.min.js"></script>

<script>
    $(document).ready(function () {
        var totalPrice = 0;
        $('#DDLSkills').change(function () {

            var value = $(this).val();

            if ($(this).val() == null) {
                totalPrice = 0;
                document.getElementById('txtPrice').value = 0;
            }

            if (value != null)
            {
                for (var i = 0; i < value.length; i++) {
                    if (jQuery.inArray(value[i], value) != -1) {
                        totalPrice += parseInt(value[i]);
                        document.getElementById('txtPrice').value = totalPrice;
                    }
                }
            }
        });
    })
</script>

谢谢

实际上,我认为应该这样处理问题:

与其尝试从 totalValue 中减去已定义的 select 项目的价值,不如保留 totalValue 的 运行ning 跟踪所有 selected 项目。

代码中的解决方法:

$(document).ready(function () {  
  $('#DDLSkills').change(function () {
    var value = $(this).val();
    
    // We're initializing totalPrice here to keep a running sum
    var totalPrice = 0; 
    
    if ($(this).val() == null) {
      document.getElementById('txtPrice').value = 0;
    }

    if (value != null) {
      
      // We sum up all the values of items currently selected
      for (var i = 0; i < value.length; i++) {
        if (jQuery.inArray(value[i], value) != -1) {
          totalPrice += parseInt(value[i]);
        }
      }
      
      // And print this sum to the screen on-the-fly!
      document.getElementById('txtPrice').value = totalPrice;
    }
  });
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.4/js/bootstrap-select.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.7.5/css/bootstrap-select.min.css" rel="stylesheet"/>


<input id="txtPrice" type="text" value="" class="form-control" />

<select id="DDLSkills" multiple name="selValue" class="selectpicker form-control" data-max-options="2">
  <option value="10">Ten</option>
  <option value="2">Two</option>
  <option value="4">Four</option>
</select>


说明

在原始代码中总值仍然保持上升的原因是您有一个 on "change" 事件处理程序附加到 #DDLSkills。所以每次你 select 一个项目时,它都会在 "change" 事件和 运行 回调函数上触发它,它只是不断添加到 totalValue.

在这个答案的解决方案中,请注意我将 totalValue 初始化语句放入 on "change" 函数中。这样一来,每当用户 selects/deselects 一个项目时, 只会显示 项目列表 selected 的 运行ning 总值.