Javascript jQuery项目和总计的发票计算
我是JavaScript新手 我目前面临的问题:Javascript jQuery项目和总计的发票计算,javascript,php,jquery,html,Javascript,Php,Jquery,Html,我是JavaScript新手 我目前面临的问题: 当您添加新行时,它正在添加该行(太棒了!)但是添加的第一个新行可以正常工作,在名称/id的末尾应用_0,但是当您添加更多行时,它不会应用_1、_2等。。但是相反地,我能解决这个问题吗 我需要根据发票项目上添加的数字计算小计和总计,如价格、数量、折扣(数字或%)小计,然后从底部的所有内容计算总计。增值税目前在PHP中设置为一个变量,例如define('VAT_RATE','20'),即20% 更新 我已经尝试开始了,虽然得到了NaN,但它只使用cl
$(文档).ready(函数(){
//将客户详细信息复制到shipping
$('input.copy input')。打开(“更改键控粘贴”,函数(){
var thisID=$(this.attr('id');
$('input#'+thisID+“_ship”).val($(this.val());
});
//在发票上添加新产品行
$(“.add row”)。单击(函数(){
$(“#发票_表”)。每个(函数(){
var tds=“”;
每个($('tr:last td',this),函数(索引,元素){
var html=$(this.html().replace(/invoice\u product/g,'invoice\u product\u'+index)
.替换(/invoice\u product\u desc/g,“invoice\u product\u desc”+索引)
.替换(/invoice\u product\u qty/g,“invoice\u product\u qty”+索引)
.替换(/invoice\u product\u price/g,“invoice\u product\u price”+索引)
.替换(/invoice\u product\u sub/g,“invoice\u product\u sub”+索引);
tds+=''+html+'';
});
tds+='';
如果($('tbody',this).length>0){
$('tbody',this).append(tds);
}否则{
$(此).append(tds);
}
});
返回错误
});
//添加价格和价格的更改事件
//仅限数量字段。。
//改变总数不应该影响任何事情
计算总数();
$('.calculate')。在('change keyup paste',function()上{
更新目录(本);
计算总数();
});
函数updateTotals(elem){
//这将给出已更改元素的tr
var$container=$(elem.parent().parent();
var quantity=$container.find('.calculate quantity').val();
var price=$container.find('.calculate').val();
var小计=parseInt(数量)*parseFloat(价格);
$container.find('.calculate sub').text(小计.toFixed(2));
}
函数计算器总计(){
//这将通过小计和
//在这里计算总数和数量
变量lineTotals=$('.calculate sub');
var grandTotal=0.0;
var totalQuantity=0;
$。每个(行总数,函数(i){
grandTotal+=parseFloat($(lineTotals[i]).text());
});
$('.invoice sub-total').text(parseFloat(grandTotal).toFixed(2));
}
});
首先,必须对动态创建的输入字段使用事件委派:
// delegate events on #invoice_table:
$('#invoice_table').on('change keyup paste', '.calculate', function() {
updateTotals(this);
calculateTotal();
});
接下来,您使用.text()
更新输入字段:
$container.find('.calculate-sub').text(subtotal.toFixed(2));
虽然您应该使用.val()
:
在calculateTotal()
方法中也是如此,您还应该使用.val()
其次,这一部分是不必要的:
$("#invoice_table").each(function () {
因为您只有一个表(DOM中只有一个元素可以有id
)
最后,我不会使用id
属性,也不会为输入字段指定数组名称。这样,您就不必使用.replace()
,并且可以轻松地将所有值作为数组发送到后端应用程序
另外,我最初会clone()
整个tr
元素,以后再使用它,而不是为每次单击设置循环
(注意,我已删除了
id
属性,并在输入字段名称中添加了[]
)
如何检索发送到PHP的值的示例
(循环内的每个迭代将与每个
tr
)类似:
首先,必须对动态创建的输入字段使用事件委派:
// delegate events on #invoice_table:
$('#invoice_table').on('change keyup paste', '.calculate', function() {
updateTotals(this);
calculateTotal();
});
接下来,您使用.text()
更新输入字段:
$container.find('.calculate-sub').text(subtotal.toFixed(2));
虽然您应该使用.val()
:
在calculateTotal()
方法中也是如此,您还应该使用.val()
其次,这一部分是不必要的:
$("#invoice_table").each(function () {
因为您只有一个表(DOM中只有一个元素可以有id
)
最后,我不会使用id
属性,也不会为输入字段指定数组名称。这样,您就不必使用.replace()
,并且可以轻松地将所有值作为数组发送到后端应用程序
另外,我最初会clone()
整个tr
元素,以后再使用它,而不是为每次单击设置循环
(注意,我已删除了
id
属性,并在输入字段名称中添加了[]
)
如何检索发送到PHP的值的示例
(循环内的每个迭代将与每个
tr
)类似:
以下是您第一个问题的答案:。这就是你需要的吗?是的,差不多了!编号非常有效,但它会将每个名称/id更新为“发票\产品\ 1”,并替换其他名称,如“发票\产品\描述”-因此,如果有意义的话,不是将所有名称都替换为“发票\产品\描述”。谢谢你的帮助,有什么办法吗?有什么办法吗?很抱歉,在一个正确的截止日期前遇到了麻烦:)你能在你的正则表达式中将
标志更改为索引吗,看看它是否起作用吗?1秒钟,现在就试试。谢谢Mateth这是
foreach($_POST['invoice_product'] as $key => $value){
$name = $value;
$qty = $_POST['invoice_product_qty'][$key];
$price = $_POST['invoice_product_price'][$key];
$discount = $_POST['invoice_product_discount'][$key];
// ...
}