克隆项目jquery,选择下拉列表不能正确更新

时间:2018-02-27 21:35:09

标签: jquery

在我的网站上,我有一个选项,用户可以在预订中添加多个客人,并选择他们想要购买的套餐。

选择包裹后,价格会根据选择选项的值自动更新。

由于某种原因 - 第一次下拉(已经在页面上)工作并更新价格。

但是,当您运行功能newMenuItem()选择下拉菜单时,它不会更新价格。

这是我的代码

HTML

<h3 class="margin-top-0 margin-bottom-30">Guest Details <small>(Guests you're paying for)</small></h3>

<table id="pricing-list-container">
<tr class="pricing-list-item pattern">
<td>

<div class="fm-input pricing-name">         <label>Package</label>
    <select data-placeholder="Select Item">
    <option>Select a package </option>

    <option value = "100">1</option>
    <option value = "200">2</option>
        <option value = "300">3</option>
</select>
</div>



<div class="fm-close"><a class="delete" href="#"><i class="fa fa-remove"></i></a></div>
</td>
</tr>
</table>
<a href="#" class="button add-pricing-list-item">Add Guest</a>


<span id = "price">ddd</span>

JS

  $(document).ready(function(){
                        $(function () {
                    var fields = $('select').change(calculate);


                    function calculate() {
                            var price = 0;
                            fields.each(function () {
                                    price += +$(this).val();
                            })
                            $('#price').html(price.toFixed(2));
                    }
                    })


          function newMenuItem() {
        var newElem = $('tr.pricing-list-item.pattern').first().clone();
        newElem.find('input').val('');
        newElem.appendTo('table#pricing-list-container');
    }

    if ($("table#pricing-list-container").is('*')) {
        $('.add-pricing-list-item').on('click', function(e) {
            e.preventDefault();
            newMenuItem();
        });

        // remove ingredient
        $(document).on( "click", "#pricing-list-container .delete", function(e) {
            e.preventDefault();
            $(this).parent().parent().remove();
        });



    }



});

https://jsfiddle.net/1pzxk241/

2 个答案:

答案 0 :(得分:0)

首先,您的JSfiddle中似乎存在一些语法错误,您错过了结束括号。

您所看到的问题与DOM中绑定事件的方式有关。您会发现任何动态添加的内容都是如此。

问题:

当您创建新的选择控件并将其附加到DOM时,on change listener不会知道该控件。这是因为侦听器已应用于首次加载页面时存在的所有控件,但不会自动应用于之后出现的任何控件。

解决方案:

要解决此问题,您需要将on change listener应用于更高级别的对象,以便在添加子元素时,它将包含在父元素的侦听器事件中。

对于您的代码,这将替换此部分:

$(function () {
                var fields = $('select').change(calculate);


                function calculate() {
                        var price = 0;
                        fields.each(function () {
                                price += +$(this).val();
                        })
                        $('#price').html(price.toFixed(2));
                }
                })

});

有了这个:

$(document).on('change', 'select', function() {
  var price = 0;
  $(this).each(function () {
    price += +$(this).val();
  })
  $('#price').html(price.toFixed(2));      
})

我还要注意,您在该代码段中的逻辑只会获取上次更改的控件的值,并且不会对所有控件的值求和。为此,您需要获取每个所选项目的值。

像这样:

$(document).on('change', 'select', function() {
  var price = 0;
  $.each($('select option:selected'), function() {
            price += parseFloat($(this).val());
        });
  $('#price').html(price.toFixed(2));      
})

希望有所帮助。

答案 1 :(得分:0)

尝试用此

替换您的功能
$(function () {
                var fields = $('#pricing-list-container').on(
        {
            change: function ()
          {
                            var price = 0;
                            price += +$(this).val();
            $('#price').html(price.toFixed(2));

          }
        },'.pricing-list-item select');
});