我正在尝试计算折扣价格,我可以在没有任何问题的情况下完成单个项目。我还添加了更多'按钮可以添加很多项目。所以在这里,我开始在计算这些动态添加的输入字段的折扣价时面临问题。
单项的默认折扣计算脚本是
$('#discount_1').change(function(){
var quantity=$('#qty_1').val();
var percent=$('#discount_1').val();
var price=$('#price_1').val();
var tprice = price * quantity
var discountpercent=percent / 100;
var discountprice=(tprice * discountpercent );
$('#total_1').val(tprice - discountprice);
});
我尝试将其更改为以下
$(":input[id^='discount_']").change(function(){
var quantity=$(":input[id^='qty_']").val();
var percent=$(":input[id^='discount_']").val();
var price=$(":input[id^='price_']").val();
var tprice = price * quantity
var discountpercent=percent / 100;
var discountprice=(tprice * discountpercent );
$(":input[id^='total_']").val(tprice - discountprice);
});
计算具有以id
开头的qty_
属性的所有项目集的折扣,这实际上似乎无法正常工作。
这是我的jsFiddle
答案 0 :(得分:2)
我已将其修改为删除所有id
。这将清理很多额外的垃圾。这是一个小提琴:http://jsfiddle.net/B5T6R/1/
解决方案涉及事件委派。 $(":input[id^='discount_']").on('change'
的问题在于,未来tr
尚未存在,因此无需绑定任何内容!
解决方案是:
$("#InputsWrapper").on('change', '.discount'
这将在整个InputsWrapper表上监听所有未来的更改,而不仅仅是折扣元素。
答案 1 :(得分:1)
问题是您使用的选择器将始终选择与选择器匹配的第一个输入。
所以,(":input [id ^ =' qty _']")将始终匹配第一行的输入。
我建议:
IE:
$('.discount').unbind().change(function(){
var $parentRow = $(this).parent().parent();
var quantity=$(":input[id^='qty_']", $parentRow).val();
});
答案 2 :(得分:1)
使用所有这些ID并不是一个好主意:#qty_1,#qty_2等。而是将所有输入相同的类名称挂钩,例如:
<input class='discount' type='text' name='discount'/>
<input class='quantity' type='text' name='quantity'/>
然后使用good ole Jquery遍历DOM并获取相关数据。在这种情况下,您必须爬到最近的td,然后返回以获得.quantity类,如下所示:
$(".discount").change(function(){
var quantity = $(this).closest('td').find('.quantity').val();
});
希望这有帮助。
答案 3 :(得分:1)
你遇到了几个问题。
首先,只有初始化DOM时页面上存在的":input[id^='discount_']"
才会添加此更改处理程序 - 通过Add More Field链接添加的所有新行都不会绑定此处理程序。您可以通过将处理程序附加到容器来解决此问题,所有字段都位于via .on
中,以便针对指定的选择器检查在该容器中触发的每个更改事件。我已经分道扬声示威:http://jsfiddle.net/gLz9B/1/
$('#InputsWrapper').on("change", ":input[id^='discount_']", function(){ ... });
第二个问题是您使用的qty_,total_,price_和discount_选择器将返回数组,而不是仅限于发生更改的特定行。在我的小提琴叉中,我做了一个字符串替换,以获得附加到元素的id的唯一编号,然后构建所有其他输入的id,而不是使用= ^来选择它们。这不是限制范围的唯一方法,但它适用于您的示例代码。
var id = this.id.replace('discount_',''); var quantity=$("#qty_" + id).val();