我的JavaScript代码中有一个奇怪的错误。 我的标记是这样的
<table id="invoice-details">
<tbody id="tableToModify">
<?php
$i=1;
while($i<2){
?>
<tr>
<td>
<input type="hidden" name="prdid[]" id="prd_id<?php echo $i; ?>" />
<input type="text" tabindex="<?php echo 2+($i*5);?>" name="prdname[]" id="prd_name<?php echo $i; ?>" />
</td>
<td>
<input type="text" name="prddesc[]" id="prd_desc<?php echo $i; ?>" disabled="disabled" />
</td>
<td>
<input type="text" name="prdcost[]" id="prd_cost<?php echo $i; ?>" value="0" disabled="disabled" style="color:#333;" />
</td>
<td>
<input type="text" name="prdquentity[]" id="prd_quentity<?php echo $i; ?>" tabindex="<?php echo 3+($i*5);?>" onKeyUp="calprice1(this.value,'<?php echo $i; ?>');" value="1" />
</td>
<td>
<input type="text" name="prddamount[]" tabindex="<?php echo 5+($i*5);?>" readonly="true" id="prd_damount<?php echo $i; ?>" onKeyUp="calprice2(this.value,'<?php echo $i; ?>');" />
</td>
<td id="readonly">
<input readonly="readonly" name="prdprice[]" id="prd_price<?php echo $i; ?>" value="0" />
</td>
</tr>
<?php
$i++;
}
?>
</tbody>
</table><!--#invoice-details-->
现在,我有一个名为添加新行的按钮。标记就像这样
<input type="button" style="float:left;" onClick="createRow();" class="add-line" value="Add a new line">
为此我已经制作了像我这样的java脚本
function createRow()
{
//var newlineno=document.forms[0].elements["prdprice[]"].length;
var newlineno = document.querySelectorAll("[name='prdprice[]']").length
newlineno++;
//console.log(newlineno);
var row = document.createElement('tr');
var col1 = document.createElement('td');
var col2 = document.createElement('td');
var col3 = document.createElement('td');
var col4 = document.createElement('td');
var col5 = document.createElement('td');
var col6 = document.createElement('td');
var col7 = document.createElement('td');
row.appendChild(col1);
row.appendChild(col2);
row.appendChild(col3);
row.appendChild(col4);
row.appendChild(col5);
row.appendChild(col6);
row.appendChild(col7);
col1.innerHTML = "<input type=\"hidden\" name=\"prdid[]\" id=\"prd_id"+newlineno+"\" /><input type=\"text\" name=\"prdname[]\" id=\"prd_name"+newlineno+"\" autocomplete=\"off\" onKeyUp=\"producthint(this.value,'"+newlineno+"');\" /><div id=\"prd"+newlineno+"\" style=\"position:absolute;\"></div>";
col2.innerHTML = "<input type=\"text\" disabled=\"disabled\" name=\"prddesc[]\" id=\"prd_desc"+newlineno+"\" />";
col3.innerHTML = "<input type=\"text\" disabled=\"disabled\" name=\"prdcost[]\" id=\"prd_cost"+newlineno+"\" value=\"0\" />";
col4.innerHTML = "<input type=\"text\" name=\"prdquentity[]\" id=\"prd_quentity"+newlineno+"\" onKeyUp=\"calprice1(this.value,'"+newlineno+"');\" value=\"1\" />";
col5.innerHTML = "<select name=\"prddtype[]\" class=\"discount-type\" id=\"prd_dtype"+newlineno+"\" >"+document.getElementById("prd_dtype1").innerHTML+"</select>";
col6.innerHTML = "<input type=\"text\" name=\"prddamount[]\" id=\"prd_damount"+newlineno+"\" onKeyUp=\"calprice2(this.value,'"+newlineno+"');\" />";
col7.innerHTML = "<input readonly=\"readonly\" name=\"prdprice[]\" id=\"prd_price"+newlineno+"\" value=\"0\" />";
var table = document.getElementById("tableToModify"); // find table to append to
table.appendChild(row); // append row to table
}
现在到目前为止一切都很好。现在,当我尝试在第一列中插入一个产品名称并从数据库中填充值时,它应该显示计算。为了计算,我做了像
这样的jsfunction calprice1(q,line) {
var cost=document.getElementById("prd_cost"+line).value;
var damount=document.getElementById("prd_damount"+line).value;
document.getElementById("prd_price"+line).value=parseFloat((cost*q)*(100-damount)/100).toFixed(2);
totalprice();
}
现在我将使用总价格函数来计算单个价格的所有价格的最低总价。功能是这样的。
function totalprice(){
var sum=0;
var price = document.forms[0].elements["prdprice[]"];
console.log(price);
for(var i=0, n=price.length;i<n;i++) {
sum+=parseFloat(price[i].value);
}
document.getElementById("total").innerHTML=parseFloat(sum).toFixed(2);
}
现在,totalprice
中没有显示所有计算后的第一行的值,但是当我按添加按钮添加另一行时,它显示totalprice
的数量正确(所有值均为行正在添加)。所以有人可以告诉我这里的问题是什么。任何帮助和建议都非常值得赞赏。感谢。
答案 0 :(得分:0)
现在这里所有计算后的第一行的值没有显示在totalprice中,但是当我通过addrow按钮添加另一行时,它显示的是具有正确金额的totalprice(所有行的值都被添加)。
所以在开始时,你只有一行,因此只有一个名为prdprice[]
的单个表单元素,对吗?
嗯,那就是问题所在:document.forms[0].elements["prdprice[]"]
只有 直接引用该单个DOM节点。
因此,当您获得对单个DOM节点的引用时,它没有length
属性,并且通过尝试读取它,您将只获得undefined
。
由于0 < undefined
的计算结果为false,因此你的for循环不会重复一次......
解决此问题的一种简单方法如下:
var price = document.forms[0].elements["prdprice[]"];
if(price.length === undefined) { price = [price]; }
如果price不是NodeList,而是对单个DOM节点的引用 - 那么我们将它变成一个数组,它包含对该单个DOM节点的引用作为其唯一元素。
之后,price
在任何情况下都有length
,因此您可以使用for循环遍历它,就像它是NodeList一样。
虽然有一个洞穴:因为我们在这里创建一个数组,它的行为与NodeList不同。 NodeLists是“实时”的,这意味着DOM中的任何更改都会立即反映出来 - 而我们的数组是静态的。但只要您不向DOM添加/删除节点(此节点列表将“捕获”的节点,因此只有该表单的名称为prdprice[]
)的元素,但只是循环遍历以前存在的节点,这没关系。