在我的网站上,我有一个选项,用户可以在预订中添加多个客人,并选择他们想要购买的套餐。
选择包裹后,价格会根据选择选项的值自动更新。
由于某种原因 - 第一次下拉(已经在页面上)工作并更新价格。
但是,当您运行功能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();
});
}
});
答案 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');
});