Jquery/javascript计算数组记录的问题

Jquery/javascript calculation issue in array of records

本文关键字:记录 问题 数组 计算 javascript Jquery      更新时间:2023-09-26

我正在做一些计算在我的php脚本。它是在jquery/javascript中完成的。我有一个小问题与我下面的脚本。实际的场景是它获得总的INR值,在Add(%)字段中添加百分比。因此,系统计算并将这个百分比添加到总价值中。它在记录的第一排是完美的。但是在第二行,它取第一行的值。我犯了一个小错误。我的脚本如下。请帮我一下。

<script type='text/javascript' src='http://code.jquery.com/jquery-2.1.3.js'></script>
 <script type='text/javascript'>
 //<![CDATA[
 function getIndexedElement(item, index) {
if (item.length) {
    if (index < item.length) {
        return item[index];
    } else {
        return false;
    }
 } else {
    if (index === 0) {
        return item;
    }
}
return false;
 }
 function isNum(value) {
return 123;
 }
 function calcTotals() {
var grandTotal = 0;
var i = 0;
while (getIndexedElement(document.forms['cart'].elements['add_percentage[]'], i)) {
    add_percentageObj = getIndexedElement(document.forms['cart'].elements['add_percentage[]'], i);
    addon_valueObj = getIndexedElement(document.forms['cart'].elements['addon_value[]'], i);
    total_inr_valueObj = getIndexedElement(document.forms['cart'].elements['total_inr[]'], i);
    totalObj = getIndexedElement(document.forms['cart'].elements['add_value[]'], i);
    priceunitObj = getIndexedElement(document.forms['cart'].elements['price_unit[]'], i);

    qtyObj = getIndexedElement(document.forms['cart'].elements['qty[]'], i);

    if (isNaN(add_percentageObj.value)) {
        add_percentageObj = '';
    }
    if (isNaN(addon_valueObj.value)) {
        addon_valueObj = '';
    }
    if (add_percentageObj.value != 0) {
        totalObj.value = Math.round((total_inr_valueObj.value * 1) * add_percentageObj.value / 100) + total_inr_valueObj.value * 1;
        grandTotal = grandTotal + parseFloat(totalObj.value);
        //priceunitObj.value = total1Obj.value/qtyObj.value;
        //c.value=Math.round((b.value/100) *a.value ).toFixed(2);
    } else if (addon_valueObj.value) {
        totalObj.value = Math.round((addon_valueObj.value * 1) + total_inr_valueObj.value * 1);
        grandTotal = grandTotal + parseFloat(totalObj.value);
        //priceunitObj.value = total1Obj.value/qtyObj.value;
    } else {
        totalObj.value = Math.round((addon_valueObj.value * 1) + total_inr_valueObj.value * 1);
        grandTotal = grandTotal + parseFloat(totalObj.value);
        //priceunitObj.value = total1Obj.value/qtyObj.value;
    }
    i++;
}
document.getElementById('grand_total').value = grandTotal;
return;
 }
 </script>
 </head>
 <body>
<form name='cart' method='post' class='single' action='generate_quot_cust_edititems_save_complete.php?tender_id=14'>
    <input type='hidden' name='sum_input' id='sum_input' value=''>
    <div align="center">
        <table width="100%" border="1" style="border-collapse: collapse;" cellpadding="1" cellspacing="1">
            <tr bgcolor="#E6E6FA">
                <td width=4%>Qty</td>
                <td width=5%>Unitprice</td>
                <td width=8%>Total INR</td>
                <td width=5%>Add (%)</td>
                <td width=7%>Add Value</td>
                <td width=6%>Total Value</td>
                <td width=8%>Total</td>
                <td width=8%>Price/Unit</td>
            </tr>
        </table>
    </div>
    <div align="center" class="base">
        <table width="100%" border="1" style="border-collapse: collapse;" cellpadding="1" cellspacing="1">
            <tr>
                <td width='4%'>
                    <input size='1' class='qty' type='text' name='qty[]' id='qty[]' value='20' readonly/>
                </td>
                <td width='5%'>
                    <input size='5' type='text' name='unitprice[0]' value='678.000' readonly/>
                </td>
                <input size='4' type='hidden' id='total_inr[]' name='total_inr[]' value='883332.313' />
                <td width='8%'>
                    <input size='10' type='text' id='total_inr[]' name='total_inr[]' value='883332.300' />
                </td>
                <td width='5%'>
                    <input class='' size='4' type='text' id='add_percentage[]' name='add_percentage[]' value='0' onchange='calcTotals()'>
                </td>
                <td width='7%'>
                    <input class='txt' type='text' size='7' id='addon_value[]' name='addon_value[]' value='0' onchange='calcTotals()'>
                </td>
                <td width='6%'>
                    <input class='total' data-value='883332' size='6' type='text' id='add_value[]' name='add_value[]' value=''>
                </td>
                <input type="hidden" class="inrvalue" id="inrvalue" name="inrvalue" value="65.1425">
                <input type="hidden" class="deptip" id="dept-input" />
                <input type="hidden" class="priceip" id="price-input" />
                <td width="8%">
                    <input size="9" type="text" data-value="" name='total1[]' id='total1[]' value="16271.993" readonly class="total1" />
                </td>
                <td width='8%'>
                    <input class='price_unit' size='7' type='text' id='price_unit[]' name='price_unit[]' value='813.600' readonly>
                </td>
            </tr>
        </table>
    </div>
    <div align="center" class="base">
        <table width="100%" border="1" style="border-collapse: collapse;" cellpadding="1" cellspacing="1">
            <tr>
                <td width='4%'>
                    <input size='1' class='qty' type='text' name='qty[]' id='qty[]' value='360' readonly/>
                </td>
                <td width='5%'>
                    <input size='5' type='text' name='unitprice[1]' value='569.000' readonly/>
                </td>
                <td width='8%'>
                    <input size='10' type='text' id='total_inr[]' name='total_inr[]' value='13343789.700' />
                </td>
                <td width='5%'>
                    <input class='' size='4' type='text' id='add_percentage[]' name='add_percentage[]' value='0' onchange='calcTotals()'>
                </td>
                <td width='7%'>
                    <input class='txt' type='text' size='7' id='addon_value[]' name='addon_value[]' value='0' onchange='calcTotals()'>
                </td>
                <td width='6%'>
                    <input class='total' data-value='883332' size='6' type='text' id='add_value[]' name='add_value[]' value=''>
                </td>
                <td width="8%">
                    <input size="9" type="text" data-value="" name='total1[]' id='total1[]' value="16000.803" readonly class="total1" />
                </td>
                <td width='8%'>
                    <input class='price_unit' size='7' type='text' id='price_unit[]' name='price_unit[]' value='44.447' readonly>
                </td>
            </tr>
        </table>
    </div>
    <table width='100%'>
        <tr>
            <td width='3%'>&nbsp;</td>
            <td width='4%'>&nbsp;</td>
            <td width='17%'>&nbsp;</td>
            <td width='5%'>&nbsp;</td>
            <td width='5%'>&nbsp;</td>
            <td width='6%'>&nbsp;</td>
            <td width='5%'>&nbsp;</td>
            <td width='7%'>&nbsp;</td>
            <td width='8%'>&nbsp;</td>
            <td width='5%'>&nbsp;</td>
            <td height=35><b>Grand Total:&nbsp;&nbsp;&nbsp;&nbsp;<input type='text' style='font-weight: bold' name='gTotal' id='grand_total' value='1766664.000' readonly /></b></td>
        </tr>
        <tr>
    </table>
    <br>
    </div>
    <table border='0' width='13%'>
        <td>
            <input type='submit' value='--Save Data--' />
        </td>

元素ID必须是唯一的。如果您通过id引用一个元素,并且有多个具有相同id的元素,那么您可能只会返回第一个元素。此外,我怀疑elements["name"]没有返回一个数组,而是一个唯一的元素。

不如试试这样写:

cartForm = document.forms['cart'];
...
add_percentageObj = getIndexedElement(cartForm.getElementsByName('add_percentage[]'), i);

元素名称必须是唯一的。我看到你已经在元素上同时使用了idname

我还建议写一个这样的函数(未经测试):

function getCartElement(name, index) {
  namedElements = document.forms['cart'].getElementsByName(name);
  if (index >= namedElements.length) return null;
  return namedElements[index];
  if (item.length) {
}
无论如何,剩下的代码看起来像这样:
while (getCartElement('add_percentage[]', i) != null) {
  add_percentageObj = getCartElement('add_percentage[]', i);
  addon_valueObj    = getCartElement('addon_value[]', i);
  ...

请注意,我确保您的函数返回一致的数据类型,而不是一次布尔值,另一次元素实例…但是,这意味着您需要检查空值。

参考:

  • getElementsByName
  • getElementsById
  • 元素

还可以阅读其他stackoverflow文章