使用javascript计算动态输入框的折扣
Discount calculation of dynamic input box using javascript
我正试图计算折扣价格,我能够做到没有任何问题的单一项目。我也有"添加更多"按钮添加许多项目,因为我可以。因此,在这里,我开始面临计算这些动态添加的输入字段的折扣价的问题。
我默认的单项折扣计算脚本是
$('#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);
});
计算所有具有以qty_
开头的id
属性的商品集的折扣,这实际上似乎不能正常工作。
这里是jsFiddle
我已经修改了这个来删除所有的id
s。这会清理掉很多多余的垃圾。这是一个小提琴:http://jsfiddle.net/B5T6R/1/
解决方案涉及事件委托。$(":input[id^='discount_']").on('change'
的问题是未来的tr
s 还不存在,所以没有什么可以绑定的!
解决方案是:
$("#InputsWrapper").on('change', '.discount'
它将监听整个inputtswrapper表的所有未来更改,而不仅仅是针对折扣元素。
问题是您使用的选择器将始终选择与选择器匹配的第一个输入。
因此,(":input[id^='qty_']")将始终匹配第一行的输入。
我建议:
- 每次点击AddButton时重新绑定"change"事件。这将也需要.unbind()
- 添加类"discount"到所有折扣输入。
- 将数量,价格等的选择器更改为相对于被更改的输入。
$('.discount').unbind().change(function(){
var $parentRow = $(this).parent().parent();
var quantity=$(":input[id^='qty_']", $parentRow).val();
});
使用所有这些id不是一个好主意:#qty_1, #qty_2等。相反,为所有输入提供相同的类名以挂钩,例如:
<input class='discount' type='text' name='discount'/>
<input class='quantity' type='text' name='quantity'/>
然后使用Jquery遍历DOM并获取相关数据。在这种情况下,您必须爬到最近的td,然后返回到。quantity类,如下所示:
$(".discount").change(function(){
var quantity = $(this).closest('td').find('.quantity').val();
});
你遇到了几个问题。
首先,当DOM初始化时,只有页面上存在的":input[id^='discount_']"
才会添加此更改处理程序-所有通过Add More Field链接添加的新行都不会绑定此处理程序。您可以通过将处理程序附加到通过.on
包含所有字段的容器来解决这个问题,以便在该容器内触发的每个更改事件将根据指定的选择器进行检查。我将您的小提琴分叉来演示:http://jsfiddle.net/gLz9B/1/
第二个问题是,您使用的qty_、total_、price_和折扣_选择器将返回数组,而不是局限于发生更改的特定行。在我的fiddle fork中,我做了一个字符串替换,以获得附加到元素id的唯一数字,然后构建所有其他输入的id,而不是使用=^来选择它们。这不是限制作用域的唯一方法,但对于示例代码,它是有效的。
<>之前Var id = this.id.replace('discount ',');Var quantity=$("#qty_" + id).val();- 如何在用户输入 javascript 时更改值
- 名称href标签根据用户文本输入JavaScript
- 赢得't输入javascript if/else语句
- 使用用户输入javascript进行权重转换
- 未捕获的语法错误:输入JavaScript意外结束
- 输入javascript函数
- 在无效输入:JavaScript 上停止注册
- 输入表单 浏览并获取文件夹路径并保存在文本输入Javascript中
- 用户输入 - Javascript Node js.
- 过滤文本输入 JavaScript
- 在单击“输入 JavaScript HTML 表单”时更改焦点
- 如何在客户端验证文件输入(Javascript)
- 如何获取输入Javascript的密码值
- 可以't使用CKEditor对话框输入javascript
- 如何在html代码中输入javascript变量
- 正在验证维度文本输入javascript
- 如何输入javascript对象's值转换为sql数据库
- 如何在用户输入javascript时删除字符
- 允许用户输入javascript代码
- 基于用户输入Javascript生成HTML